第三篇:ROS参数加载、数据类型创建、通讯机制、定时器中断 (使用ROS的通讯机
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理
文章目录 二、ROS可使用的数据类型 4.【】ROS提供的组件通用消息结构类型 (2)【常用】 (3)【常用】 (4)【常用】 (5)【机械臂轨迹】 (6)(7)(8)(9)(10) (3)组件通用消息结构类型用法 5.【】使用谷歌推荐的定义数据接口 三、ROS通讯机制【话题通讯、服务通讯、动作通讯】 2.订阅对象 (4)注意 2.服务通讯编程步骤 3.客户端对象 3.动作通讯编程步骤 (2)步骤 四、ROS定时器中断 五、Boost库线程API 2.boost可以理解成和mian()的while()或者定时器一样,有异同点 3.Boost库使用注意4.Boost库的优势 六、Ros使用话题通讯、服务通讯、动作通讯、定时器、boost库的选择
前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!
本文先对** ROS通讯机制及定时器中断(使用ROS的通讯机制、定时器和C++相关线程技术) **做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章
提示:以下是本篇文章正文内容
一、ROS参数加载方法() 1.【.h文件】
用结构体实现,结构体写在一个共用的里面
参数数据在.h中进行了初始化赋值的!!!【防盗标记--盒子君hzj】
2.【.yaml文件】
用.yaml文件加载参数的方法
(1)在.yaml文件里面编写变量名、变量值、数据类型
(2)ROS和其他系统都有API(LoadFile)读取文件里面的数据YAML::Node config = YAML::LoadFile("/root/config/pure_pursuit.yaml");(3)通过config指令赋值参数velocity_source_ = config["velocity_source"].as();
3.【.文件】
在.launch文件用param指令
二、ROS可使用的数据类型 1.【】std自带提供的基础消息结构类型
Std_msgs是ros基础的数据类型结构,Std_msgs是std库里面定义的数据类型都有,包括int/double等等(1)std_msgs定义了常用的编程数据结构类型,本质上上也是用.msg编译成.h使用的(2)std_msgs数据类型定义在opt/ros/melodic/share/std_msgs/msg(3)std_msg一般包含bool、char、int、float、double【防盗标记--盒子君hzj】
2.【.h结构体数据类型】自定义结构体.h文件
自己建一个文件夹使用.h文件用结构体的方法定义接口用结构体实现,结构体写在一个共用的.h文件面,可供多个功能包使用技巧:
现在的规划部分接口是一层套一层的,一般写接口都是先写一个简单的接口,【防盗标记--盒子君hzj】
不够用了在用一个大一点的接口,大的接口把小弟额接口的内容包含进去
3.【】(.msg、.srv、.)ROS自定义消息结构类型 (1)原理
.msg文件统一放在一个msg文件夹里,ros通过、将.msg文件和.srv文件自动转换成.h文件。用户只需定义简单的.msg和.srv文件即可,.msg、.srv、.最终都会编译成.h文件(Ros话题的msg,srv,文件都被\.xml编译成为.h文件),在源文件中使用这些消息类型的时候在源文件中对应的.h文件
(2)参考链接
【防盗标记–盒子君hzj】
(3)步骤
(1)下创建srv,msg文件夹,编写.msg/.srv文件
(1).msg、.srv文件含义:.msg文件用于定义ros话题消息,.srv文件用于定义ros服务消息
(2)【编写方法】现在的规划部分接口是一层套一层的,一般写接口都是先写一个简单的接口,不够用了在用一个大一点的接口,大的接口把小弟额接口的内容包含进去
注意
【防盗标记--盒子君hzj】
(1)接口类型的编写和调用要对应上
(2)学会去写接口的转换函数,用于接口的转换
(2)打开.xml文件添加编译和执行依赖及
(1)message_generation 【添加消息内容生成编译依赖】
(2)message_runtime 【添加该依赖的额外依赖】
(3)打开.txt文件。添加编译包依赖,添加运行依赖,添加.srv/.msg文件,添加生成消息函数
(1)、find_packge(......message_generation)【找到这个依赖】
(2)、catkin_package(roscpp rospy message_runtime)【编译这个依赖】
(3)、add_message_file(FILES,my.msg)【添加我自己写的.msg文件】
(4)、generation_message(DEPENDENCIES std_msgs)【生成消息】
【防盗标记--盒子君hzj】
(4)调用自己定义的数据结构的方法
(1)在源文件包含.h文件
#include "std_msgs/String.h"//常用的变量形式
#include "std_msgs/XXX.h"//常用的变量形式
注意,用到哪一种数据类型就包含哪种数据类型(2)类成员、接口是可以通过“.”进行跳转的
(1)用msg的数据类型定义相关对象:visualization_msgs XXX xxx
(2)对msg对象进行赋值:xxx.header = a;xxx.stamp = b;xxx.对象子元素 = c;
4.【】ROS提供的组件通用消息结构类型 (1)具体用法参考wiki
【查看数据类型的元素强烈建议再wiki上查找–关系到使用方法】【防盗标记–盒子君hzj】
(2)通用消息结构类型
的数据类型:的数据类型包括stamp、、seq
(1)【常用】
(1)介绍
为常见几何图元(如点、向量和姿势)提供消息【防盗标记–盒子君hzj】
(2)消息类型
(1)point【点集】
(1)Point
float64 x ,float64 y,float64 z(2)Point32
float32 x,float32 y,float32 z 一般使用Point,大规模点云使用Point32(3)PointStamped
std_msgs/Header header 包含坐标系和时间戳信息
geometry_msgs/Point point 点
(2)poses【几何–位姿集】
(1)Pose2Dfloat64 x,float64 y,float64 theta(2)Pose【防盗标记--盒子君hzj】(1)geometry_msgs/Point position 位置 (2)geometry_msgs/Quaternion orientation 姿态,即方向(3)PoseStamped(1)std_msgs/Header header (2)geometry_msgs/Pose pose(4)PoseArray(1)std_msgs/Header header(2)geometry_msgs/Pose[] poses(5)PoseWithCovariance【带有协方差的位姿】(1)geometry_msgs/Pose pose 即(x, y, z, X 旋转, Y旋转, Z旋转)(2)float64[36] covariance协方差(6)PoseWithCovarianceStamped【带有协方差和时间戳的位姿】(1)std_msgs/Header header (2)geometry_msgs/PoseWithCovariance pose
(3)【四元素–位姿集】
(1)Quaternionfloat64 x,float64 y,float64 z,float64 w(2)QuaternionStamped【防盗标记--盒子君hzj】
(4)【几何–矢量集】
(1)Vector3float64 x,float64 y,float64 z(2)Vector3Stamped
(5)Twist【速度–矢量集】
(1)Twist 速度(1)geometry_msgs/Vector3 linear 线速度(2)geometry_msgs/Vector3 angular角速度(2)TwistStamped
(3)TwistWithCovariance
(4)TwistWithCovarianceStamped
(6)【力–矢量集】
(1)Wrench(1)geometry_msgs/Vector3 force 力【防盗标记--盒子君hzj】(2)geometry_msgs/Vector3 torque 扭矩(2)WrenchStamped
(7)【坐标系之间的变换】
(1)Transform(1)geometry_msgs/Vector3 translation 平移向量(2)geometry_msgs/Quaternionrotation 旋转向量
(2)TransformStamped
(2)【常用】
(1)介绍
visualization_msgs是处理可视化特定数据的高级包(如rviz)使用的一组消息。visualization\u msgs中的主要消息是visualization\u msgs/Marker。标记消息用于将可视化“标记”(如框、球体、箭头、线等)发送到可视化环境(如rviz)rviz可视化的话题数据也是有一定的数据格式的,可以参考链接:http://www.ros.org/wiki/rviz/DisplayTypesVisualization_msgs的数据类型可以直接赋值进行rviz可视化,其他的格式的数据类型要转换成Visualization_msgs的数据类型才能进行可视化visualization_msgs的path数据类型在rviz中会默认连接起来,point数据类型在rviz中默认仅仅显示一个点【防盗标记--盒子君hzj】
(2)消息类型
(1)Grid
沿平面显示 2D 或 3D 网格
(2)Grid Cells
从网格中绘制单元格,通常是从导航堆栈中的代价地图中绘制障碍物
/
(3)Laser Scan
显示来自激光扫描的数据,具有渲染模式、累积等的不同选项【防盗标记–盒子君hzj】
/
(4)Point Cloud(2)
显示来自点云的数据,具有不同的渲染模式、累积等选项
/ , /
(5)Map
在地平面上显示地图
/
(6)
允许程序员通过主题显示任意原始形状
/, /
(7)Path
显示导航中的路径
/Path
(8)Point
将一个点绘制为一个小球体
/
(9)Pose
将姿势绘制为箭头或轴
/
(10)Pose Array
绘制一个“云”箭头,一个用于姿势数组中的每个姿势
/
(11)
将多边形的轮廓绘制为线。
/
(12)
随着时间的推移积累里程计姿势【防盗标记–盒子君hzj】
/
(13)Range
显示代表声纳或红外距离传感器距离测量值的锥体
/Range
(14)
显示处于正确姿势(由当前 TF 变换定义)的机器人的视觉表示
(15)TF
显示tf转换层次结构
(16)Axes
显示一组轴
(17)
显示投入到机器人每个旋转关节上的力【防盗标记–盒子君hzj】
/
(18)
从相机的角度创建一个新的渲染窗口,并将图像叠加在它上面
/Image , /
(19)Image
创建一个带有图像的新渲染窗口
/Image
(20)
显示来自一个或多个交互式标记服务器的 3D 对象,并允许鼠标与它们交互
/
(21)
将扳手绘制为箭头(力)和箭头 + 圆圈(扭矩)
/
(3)【常用】
(1)介绍
是专门定义给导航包使用的
(2)消息类型
(1)【网格阵列】
二维网格中的单元阵列
(1)float32 cell_width
(2)float32 cell_height
(3)geometry_msgs/Point[] cells
(2)【占据网格数据】
记录占据网格数据
(1)time map_load_time
(2)float32 resolution
(3)uint32 width
(4)uint32 height
(5)geometry_msgs/Pose origin
(3)【二维栅格地图】
表示二维网格图,其中每个单元表示占用的概率,在占据网格数据的基础上,添加概率信息
(1)std_msgs/Header header
(2)nav_msgs/MapMetaData info
(3)int8[] data
【防盗标记--盒子君hzj】
(4)【里程计】
对自由空间中的位置和速度的估计
(1)【时间戳】std_msgs/Header header
(2)【坐标系】string child_frame_id
(3)【位置】geometry_msgs/PoseWithCovariance pose
(4)【速度】geometry_msgs/TwistWithCovariance twist
(5)Path【路径】
机器人要跟随的路径的一组姿势
(1)std_msgs/Header header
(2)geometry_msgs/PoseStamped[] poses
(4)【常用】
参考资源
(1)Joy相关
Joy
JoyFeedback
JoyFeedbackArray【防盗标记--盒子君hzj】
(2)IMU相关
Imu
(3)Laser相关
LaserEcho
LaserScan
MultiEchoLaserScan
(4)相关
Image
CameraInfo
CompressedImage
ChannelFloat32
(5)相关
PointCloud
PointCloud2
PointField【防盗标记--盒子君hzj】
(6)Joint相关
JointState
MultiDOFJointState
(7)其他传感器
BatteryState
FluidPressure
Illuminance
MagneticField
NavSatFix
NavSatStatus
Range
RegionOfInterest
RelativeHumidity【防盗标记--盒子君hzj】
Temperature
TimeReference
(5)【机械臂轨迹】
(1)介绍
【常常用于机械臂的轨迹规划】此包定义用于定义机器人轨迹的消息
(2)消息类型
std_msgs/Header header
string[] joint_names
trajectory_msgs/JointTrajectoryPoint[] points
float64[] positions
float64[] velocities
float64[] accelerations【防盗标记--盒子君hzj】
float64[] effort
duration time_from_start
ory
作用:
多自由度关节轨迹的表示(每个点是一个变换)沿轨迹的每个点将包括一个位置/速度/加速度数组,
该数组与关节名称数组具有相同的长度,
并且与关节名称数组具有相同的关节顺序。
std_msgs/Header header
string[] joint_names
trajectory_msgs/MultiDOFJointTrajectoryPoint[] points
geometry_msgs/Transform[] transforms
geometry_msgs/Twist[] velocities
geometry_msgs/Twist[] accelerations【防盗标记--盒子君hzj】
duration time_from_start
(6)
用于支持动作服务器的
(7) (8) (9) (10) (3)组件通用消息结构类型用法
ROS已经集成实现了,学会调用就行
步骤:
(1)先include进来
(2)编程的时候直接定义,调用就行
(3)消息结构包含什么东西wiki查一查,或者直接通过指令rosmsg查一查【防盗标记--盒子君hzj】
5.【】使用谷歌推荐的定义数据接口
三、ROS通讯机制【话题通讯、服务通讯、动作通讯】
(话题时群聊,服务时私聊,动作是奴隶,编程时话题和服务的套路时一样的)
1.话题通讯编程步骤 (1)图例
(2)步骤
1、创建一个发布者
1、在功能包的src文件夹下新建一个空白文档如talker.cpp
2、编写程序内容
(1)、初始化ROS节点
(2)、向ROS Master注册节点信息,包括发布的话题名字和话题中的消息类型
(3)、按照一定频率循环发布信息【防盗标记--盒子君hzj】