本文聚焦于ROSRobot Operating System机器人操作系统中的常用消息类型为机器人开发者提供了深入理解ROS消息机制的重要参考。博客首先介绍了ROS消息的基本概念包括其定义、作用以及在机器人通信中的核心地位。随后详细列举了ROS中常用的几种消息类型如传感器数据、控制指令、状态信息等并针对每种消息类型给出了具体的应用场景和实例。此外博客还探讨了如何根据实际需求创建和使用自定义消息类型为开发者提供了实用的指导。通过阅读本文读者将能够更全面地掌握ROS消息的使用技巧为机器人开发和应用奠定坚实基础。1. sensor_msgssensor_msgs是存储传感器常用消息数据message的包提供各种消息数据message的转换方法并定义了常用传感器使用的消息类型message如相机、激光扫描测距仪等1.1. sensor_msgs/ChannelFloat32.msgPointCloud消息用此消息保存与点云中每个点相关的数据数组values的长度应与点云中点的数组长度相同values中每个值与点云中一个点相对应。目前常见的通道名称包括u, v图像的行列rgbuint8(R, G, B)共24bits;intensity激光或者像素密度distance距离通道名称应该给出通道具体的语义如 intensity密度 而不是 value值.成员名称name和values固定可以改变其值string name float32[] values具体实例参考sensor_msgs::ChannelFloat32 velocity_x_of_point; //特征点沿x向速度names sensor_msgs::ChannelFloat32 velocity_y_of_point; //特征点沿y向速度names for (unsigned int j 0; j ids.size(); j) { //向values添加值 velocity_x_of_point.values.push_back(pts_velocity[j].x); velocity_y_of_point.values.push_back(pts_velocity[j].y); }1.2. sensor_msgs/PointCloud.msgsensor_msgs/PointCloudPtr.msg指针类型调用成员用-sensor_msgs/PointCloud.msg点云类型调用成员用.该消息用于存储3d点及其它相关信息存储传感器获取数据的时间、相关坐标系ID、序号std_msgs/Header header3d点数组每个Point是header指定坐标系下的3d点geometry_msgs/Point[] points每个通道都有和点的数组相同数量的元素每个通道的数据和点一一对应的常见通道名称已经列于ChannelFloat32.msg中sensor_msgs/ChannelFloat32[] channels示例sensor_msgs::PointCloudPtr feature_points(new sensor_msgs::PointCloud); //初始化点云消息 feature_points-header img_msg-header; //采集图像的时间 feature_points-header.frame_id world; //坐标系id # 添加header geometry_msgs::Point32 p; p.x un_pts[j].x; p.y un_pts[j].y; p.z 1; feature_points-points.push_back(p); # 添加points sensor_msgs::ChannelFloat32 id_of_point; sensor_msgs::ChannelFloat32 u_of_point; sensor_msgs::ChannelFloat32 v_of_point; //省略3个ChannelFloat32的values处理 feature_points-channels.push_back(id_of_point); feature_points-channels.push_back(u_of_point); feature_points-channels.push_back(v_of_point); # 添加channels1.3. sensor_msgs/Image.msgsensor_msgs/Image.msg图像对象调用成员用.sensor_msgs/ImagePtr.msg图像指针对象调用成员-该消息包含未压缩的图像(0, 0)是图像的左上角Header timestamp图像采集时间Header frame_id相机坐标系代号坐标系原点应该是相机的光心x指向图像右边y指向图像下侧z 指向图像平面std_msgs/Header headeruint32 height # 图像高度或行数 uint32 width # 图像宽度或列数图像编码方式 is this data bigendian?step以bytes记行长度data实际矩阵数据大小是(step * rows)string encoding uint8 is_bigendian uint32 step uint8[] data示例sensor_msgs::Image img; img.header img_msg-header; img.height img_msg-height; img.width img_msg-width; img.is_bigendian img_msg-is_bigendian; img.step img_msg-step; img.data img_msg-data; img.encoding mono8;1.4. sensor_msgs/Imu.msg该消息存储来自IMU惯导的数据加速度单位是m/s²旋转速度单位是rad/s如果测量的协方差一致那应该将其填入矩阵对角线全是0的协防矩阵被视作协方差未知可使用假设的或其他数据源std_msgs/Header headergeometry_msgs/Quaternion orientation # 旋转方向 float64[9] orientation_covariance # 行排序分别关于x/y/轴 geometry_msgs/Vector3 angular_velocity # 旋转速度 float64[9] angular_velocity_covariance # 行排序分别关于x/y/轴 geometry_msgs/Vector3 linear_acceleration # 加速度 float64[9] linear_acceleration_covariance # 行排序分别关于x/y/轴2.geometry_msgsgeometry_msgs提供关于常见几何元素的消息例如点、向量、位姿等这些元素可进一步设计为常见的数据类型2.1. geometry_msgs/Accel.msg表示自由空间速度可分解为两部分线速度和角速度线速度Vector3 linear角速度Vector3 angular2.2. geometry_msgs/AccelStamped.msg关联有参考坐标系和时间戳的Accel.msgHeader header Accel accel2.3. geometry_msgs/Point.msg该消息包含自由空间中的点坐标,64bitsfloat64 xfloat64 yfloat64 z2.4. geometry_msgs/Point32.msg该消息包含自由空间中点的位置具有32bits;.推荐使用Point.msg而不是Point32.msg这种推荐有助于提升互操作性ros中大多数函数的接口是用64位定义的但是当需要发布的点的数量较大时可以采用point32方式定义点可以减少所需的内存空间float32 xfloat32 yfloat32 z2.5. geometry_msgs/Quaternion.msg这个消息表示以四元数表示的自由空间的旋转方向float64 xfloat64 yfloat64 zfloat64 w2.6. geometry_msgs/Vector3.msg该消息表示自由空间的向量这意味着仅能表示方向因此对它应用平移没有意义例如当你对御用Vector3做刚体运动时tf2仅能表示旋转如果你想让你的数据平移请使用geometry_msgs/Point.msgfloat64 xfloat64 yfloat64 z2.7. geometry_msgs/PointStamped.msg该消息存储点包含有参考坐标系和时间戳Header headerPoint point2.8. geometry_msgs/Pose.msg自由空间位姿的表示方法由位置和方向构成Point position# 位置Quaternion orientation# 方向2.9. geometry_msgs/PoseStamped.msg关联有参考坐标系和时间戳的Pose.msgHeader headerPose pose2.10. geometry_msgs/Transform.msg该消息表示自由空间中两个坐标系间的变换Vector3 translation# 平移Quaternion rotation# 旋转2.11. geometry_msgs/TransformStamped.msg该消息表示从坐标系header.frame_id到坐标系child_frame_id的变换该消息一般用于tf包更多消息请参考tf包Header headerstring child_frame_id # child_frame_idTransform transform2.12. geometry_msgs/QuaternionStamped.msg该消息表示关联参考坐标系在某时间戳下的方向Header headerQuaternion quaternion3.std_msgsstd_msgs是一种标准消息类型包包含了一些常用的基本数据类型的消息定义。3.1 基本类别std_msgs/Bool表示布尔值True或Falsestd_msgs/Int8、Int16、Int32、Int64表示有符号的8、16、32和64位整数std_msgs/UInt8、UInt16、UInt32、UInt64表示无符号的8、16、32和64位整数std_msgs/Float32、Float64表示单精度和双精度浮点数std_msgs/String表示字符串std_msgs还包括其他类型的消息例如std_msgs/Time表示ROS的时间戳std_msgs/Duration表示时间段std_msgs/Header表示ROS消息头其中包括时间戳、坐标系和序列号等信息。3.2.使用模板#include ros/ros.h #include std_msgs/String.h #include std_msgs/Int32.h void callback_string(const std_msgs::String::ConstPtr msg) { ROS_INFO(Received string: %s, msg-data.c_str()); // 创建一个新的std_msgs::String类型消息 std_msgs::String output_msg; output_msg.data Received string: msg-data; // 发布新消息 pub.publish(output_msg); } void callback_int(const std_msgs::Int32::ConstPtr msg) { ROS_INFO(Received integer: %d, msg-data); // 创建一个新的std_msgs::String类型消息 std_msgs::String output_msg; output_msg.data Received integer: std::to_string(msg-data); // 发布新消息 pub.publish(output_msg); } int main(int argc, char **argv) { // 初始化ROS节点 ros::init(argc, argv, listener_and_talker); // 创建ROS节点句柄和两个订阅节点对象以及一个发布者对象 ros::NodeHandle nh; ros::Subscriber sub_string nh.subscribe(my_topic_string, 10, callback_string); ros::Subscriber sub_int nh.subscribe(my_topic_int, 10, callback_int); ros::Publisher pub nh.advertisestd_msgs::String(my_topic_output, 10); // 运行ROS节点 ros::spin(); return 0; }参考文献从零入门激光SLAM八——ROS常用消息_std::msgs-CSDN博客ROS常用message消息数据
ROS 常用消息
本文聚焦于ROSRobot Operating System机器人操作系统中的常用消息类型为机器人开发者提供了深入理解ROS消息机制的重要参考。博客首先介绍了ROS消息的基本概念包括其定义、作用以及在机器人通信中的核心地位。随后详细列举了ROS中常用的几种消息类型如传感器数据、控制指令、状态信息等并针对每种消息类型给出了具体的应用场景和实例。此外博客还探讨了如何根据实际需求创建和使用自定义消息类型为开发者提供了实用的指导。通过阅读本文读者将能够更全面地掌握ROS消息的使用技巧为机器人开发和应用奠定坚实基础。1. sensor_msgssensor_msgs是存储传感器常用消息数据message的包提供各种消息数据message的转换方法并定义了常用传感器使用的消息类型message如相机、激光扫描测距仪等1.1. sensor_msgs/ChannelFloat32.msgPointCloud消息用此消息保存与点云中每个点相关的数据数组values的长度应与点云中点的数组长度相同values中每个值与点云中一个点相对应。目前常见的通道名称包括u, v图像的行列rgbuint8(R, G, B)共24bits;intensity激光或者像素密度distance距离通道名称应该给出通道具体的语义如 intensity密度 而不是 value值.成员名称name和values固定可以改变其值string name float32[] values具体实例参考sensor_msgs::ChannelFloat32 velocity_x_of_point; //特征点沿x向速度names sensor_msgs::ChannelFloat32 velocity_y_of_point; //特征点沿y向速度names for (unsigned int j 0; j ids.size(); j) { //向values添加值 velocity_x_of_point.values.push_back(pts_velocity[j].x); velocity_y_of_point.values.push_back(pts_velocity[j].y); }1.2. sensor_msgs/PointCloud.msgsensor_msgs/PointCloudPtr.msg指针类型调用成员用-sensor_msgs/PointCloud.msg点云类型调用成员用.该消息用于存储3d点及其它相关信息存储传感器获取数据的时间、相关坐标系ID、序号std_msgs/Header header3d点数组每个Point是header指定坐标系下的3d点geometry_msgs/Point[] points每个通道都有和点的数组相同数量的元素每个通道的数据和点一一对应的常见通道名称已经列于ChannelFloat32.msg中sensor_msgs/ChannelFloat32[] channels示例sensor_msgs::PointCloudPtr feature_points(new sensor_msgs::PointCloud); //初始化点云消息 feature_points-header img_msg-header; //采集图像的时间 feature_points-header.frame_id world; //坐标系id # 添加header geometry_msgs::Point32 p; p.x un_pts[j].x; p.y un_pts[j].y; p.z 1; feature_points-points.push_back(p); # 添加points sensor_msgs::ChannelFloat32 id_of_point; sensor_msgs::ChannelFloat32 u_of_point; sensor_msgs::ChannelFloat32 v_of_point; //省略3个ChannelFloat32的values处理 feature_points-channels.push_back(id_of_point); feature_points-channels.push_back(u_of_point); feature_points-channels.push_back(v_of_point); # 添加channels1.3. sensor_msgs/Image.msgsensor_msgs/Image.msg图像对象调用成员用.sensor_msgs/ImagePtr.msg图像指针对象调用成员-该消息包含未压缩的图像(0, 0)是图像的左上角Header timestamp图像采集时间Header frame_id相机坐标系代号坐标系原点应该是相机的光心x指向图像右边y指向图像下侧z 指向图像平面std_msgs/Header headeruint32 height # 图像高度或行数 uint32 width # 图像宽度或列数图像编码方式 is this data bigendian?step以bytes记行长度data实际矩阵数据大小是(step * rows)string encoding uint8 is_bigendian uint32 step uint8[] data示例sensor_msgs::Image img; img.header img_msg-header; img.height img_msg-height; img.width img_msg-width; img.is_bigendian img_msg-is_bigendian; img.step img_msg-step; img.data img_msg-data; img.encoding mono8;1.4. sensor_msgs/Imu.msg该消息存储来自IMU惯导的数据加速度单位是m/s²旋转速度单位是rad/s如果测量的协方差一致那应该将其填入矩阵对角线全是0的协防矩阵被视作协方差未知可使用假设的或其他数据源std_msgs/Header headergeometry_msgs/Quaternion orientation # 旋转方向 float64[9] orientation_covariance # 行排序分别关于x/y/轴 geometry_msgs/Vector3 angular_velocity # 旋转速度 float64[9] angular_velocity_covariance # 行排序分别关于x/y/轴 geometry_msgs/Vector3 linear_acceleration # 加速度 float64[9] linear_acceleration_covariance # 行排序分别关于x/y/轴2.geometry_msgsgeometry_msgs提供关于常见几何元素的消息例如点、向量、位姿等这些元素可进一步设计为常见的数据类型2.1. geometry_msgs/Accel.msg表示自由空间速度可分解为两部分线速度和角速度线速度Vector3 linear角速度Vector3 angular2.2. geometry_msgs/AccelStamped.msg关联有参考坐标系和时间戳的Accel.msgHeader header Accel accel2.3. geometry_msgs/Point.msg该消息包含自由空间中的点坐标,64bitsfloat64 xfloat64 yfloat64 z2.4. geometry_msgs/Point32.msg该消息包含自由空间中点的位置具有32bits;.推荐使用Point.msg而不是Point32.msg这种推荐有助于提升互操作性ros中大多数函数的接口是用64位定义的但是当需要发布的点的数量较大时可以采用point32方式定义点可以减少所需的内存空间float32 xfloat32 yfloat32 z2.5. geometry_msgs/Quaternion.msg这个消息表示以四元数表示的自由空间的旋转方向float64 xfloat64 yfloat64 zfloat64 w2.6. geometry_msgs/Vector3.msg该消息表示自由空间的向量这意味着仅能表示方向因此对它应用平移没有意义例如当你对御用Vector3做刚体运动时tf2仅能表示旋转如果你想让你的数据平移请使用geometry_msgs/Point.msgfloat64 xfloat64 yfloat64 z2.7. geometry_msgs/PointStamped.msg该消息存储点包含有参考坐标系和时间戳Header headerPoint point2.8. geometry_msgs/Pose.msg自由空间位姿的表示方法由位置和方向构成Point position# 位置Quaternion orientation# 方向2.9. geometry_msgs/PoseStamped.msg关联有参考坐标系和时间戳的Pose.msgHeader headerPose pose2.10. geometry_msgs/Transform.msg该消息表示自由空间中两个坐标系间的变换Vector3 translation# 平移Quaternion rotation# 旋转2.11. geometry_msgs/TransformStamped.msg该消息表示从坐标系header.frame_id到坐标系child_frame_id的变换该消息一般用于tf包更多消息请参考tf包Header headerstring child_frame_id # child_frame_idTransform transform2.12. geometry_msgs/QuaternionStamped.msg该消息表示关联参考坐标系在某时间戳下的方向Header headerQuaternion quaternion3.std_msgsstd_msgs是一种标准消息类型包包含了一些常用的基本数据类型的消息定义。3.1 基本类别std_msgs/Bool表示布尔值True或Falsestd_msgs/Int8、Int16、Int32、Int64表示有符号的8、16、32和64位整数std_msgs/UInt8、UInt16、UInt32、UInt64表示无符号的8、16、32和64位整数std_msgs/Float32、Float64表示单精度和双精度浮点数std_msgs/String表示字符串std_msgs还包括其他类型的消息例如std_msgs/Time表示ROS的时间戳std_msgs/Duration表示时间段std_msgs/Header表示ROS消息头其中包括时间戳、坐标系和序列号等信息。3.2.使用模板#include ros/ros.h #include std_msgs/String.h #include std_msgs/Int32.h void callback_string(const std_msgs::String::ConstPtr msg) { ROS_INFO(Received string: %s, msg-data.c_str()); // 创建一个新的std_msgs::String类型消息 std_msgs::String output_msg; output_msg.data Received string: msg-data; // 发布新消息 pub.publish(output_msg); } void callback_int(const std_msgs::Int32::ConstPtr msg) { ROS_INFO(Received integer: %d, msg-data); // 创建一个新的std_msgs::String类型消息 std_msgs::String output_msg; output_msg.data Received integer: std::to_string(msg-data); // 发布新消息 pub.publish(output_msg); } int main(int argc, char **argv) { // 初始化ROS节点 ros::init(argc, argv, listener_and_talker); // 创建ROS节点句柄和两个订阅节点对象以及一个发布者对象 ros::NodeHandle nh; ros::Subscriber sub_string nh.subscribe(my_topic_string, 10, callback_string); ros::Subscriber sub_int nh.subscribe(my_topic_int, 10, callback_int); ros::Publisher pub nh.advertisestd_msgs::String(my_topic_output, 10); // 运行ROS节点 ros::spin(); return 0; }参考文献从零入门激光SLAM八——ROS常用消息_std::msgs-CSDN博客ROS常用message消息数据