【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)

文章目录

  • 一、已有ROS仿真器,自行编写控制器节点
    • 1、利用rostopic list明确仿真器可用的topic
    • 2、rostopic info 找到对应话题的类型
    • 3、rosmsg show查找msg定义
    • 4、编写控制器节点
    • 补充:Twist定义的介绍
  • 二、自己构建Publisher和Subscriber节点
    • (一)ROS中消息类型的结构框架
      • 1、common_msgs
      • 2、geometry_msgs
      • 3、Twist类型定义
      • 4、vetor3的定义
      • 5、对象赋值
    • (二)ROS中常见的消息类型
      • 1、geometry_msgs消息类型
      • 2、nav_msgs消息类型
    • (三)ROS中基本的消息类型

在ROS中数据类型(消息)是话题发布的基本形式,明确ROS基本数据类型(消息),是基于ROS编程的基础。
通常有以下两种编程场景,需要明确话题的消息类型(数据类型):

一、已有ROS仿真器,自行编写控制器节点

利用ROS进行仿真的时候,通常仿真器已具有明确的subscriber规则,如:turtlesim和gazebo等。此时我们在编写控制器Publisher节点时,需要参照仿真器已有的话题名、消息类型等进行编程。
通常步骤可以分为四步:1、明确话题名2、明确话题消息;3、明确消息定义;4、编写控制器。

1、利用rostopic list明确仿真器可用的topic

roscore
rosrun turtlesim turtlesim_node 
rostopic list

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第1张图片

2、rostopic info 找到对应话题的类型

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第2张图片

3、rosmsg show查找msg定义

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第3张图片

4、编写控制器节点

在turtle_sim的例子中,可以查看turtle_teleop_key节点代码深入理解,消息类型的使用。
(1)确定功能包的绝对路径

teleop_turtle_key.cpp的路径为:https://github.com/ros/ros_tutorials/blob/noetic-devel/turtlesim/tutorials/teleop_turtle_key.cpp

(2)编程采用的数据类型
① 加载头文件:

#include<总包/消息名.h>

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第4张图片
②发布类型模板:

nh.advertise<总包名::消息名>

在这里插入图片描述
③ 赋值:
用消息定义一个对象。将值赋予对象的特定成员。

在这里插入图片描述

补充:Twist定义的介绍

geometry_msgs为点、向量和姿态等常见几何原语提供数据类型。这些Primative旨在提供通用数据类型,并促进整个系统的互操作性。
Twist消息是geometry_msgs下的一个数据类型,存放了两组vector3,每个vector3又分别存放了3个float64类型变量
【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第5张图片
【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第6张图片

二、自己构建Publisher和Subscriber节点

自己构建Publisher和Subscriber节点,自己挑选合适的msg。主要需要自己对常见的数据类型有一定的了解。

(一)ROS中消息类型的结构框架

1、common_msgs

ROS中C++和Python最基础的数据类型包为common_msgs。其中包含常见的多种消息类型:动作消息( actionlib_msgs ),诊断消息 ( diagnostic_msgs ), 几何消息( geometry_msgs ),导航消息( nav_msgs )和常见的传感器消息 ( sensor_msgs )。
【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第7张图片

2、geometry_msgs

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第8张图片

3、Twist类型定义

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第9张图片

4、vetor3的定义

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)_第10张图片

5、对象赋值

在这里插入图片描述

(二)ROS中常见的消息类型

1、geometry_msgs消息类型

Point 点
float64 x ,float64 y,float64 z
Point32 一般使用Point,大规模点云使用Point32
float32 x,float32 y,float32 z
PointStamped
(1)std_msgs/Header header 包含坐标系和时间戳信息
(2)geometry_msgs/Point point 点
Polygon 多边形
geometry_msgs/Point32[] points
PolygonStamped
(1)std_msgs/Header header
(2)geometry_msgs/Polygon polygon
Pose 位姿:
(1)geometry_msgs/Point position 位置
(2)geometry_msgs/Quaternion orientation 姿态,即方向
Pose2D 2d平面的位姿
float64 x,float64 y,float64 theta
PoseArray 位姿序列:
(1)std_msgs/Header header
(2)geometry_msgs/Pose[] poses
PoseStamped 位姿:
(1)std_msgs/Header header
(2)geometry_msgs/Pose pose
PoseWithCovariance:
(1)geometry_msgs/Pose pose 即(x, y, z, X 旋转, Y旋转, Z旋转)
(2)float64[36] covariance协方差
PoseWithCovarianceStamped:
(1)std_msgs/Header header
(2)geometry_msgs/PoseWithCovariance pose
Quaternion 四元数旋转
float64 x,float64 y,float64 z,float64 w
QuaternionStamped
Transform 坐标系之间的变换:
(1)geometry_msgs/Vector3 translation 平移向量
(2)geometry_msgs/Quaternionrotation 旋转向量
TransformStamped
Twist 速度
(1)geometry_msgs/Vector3 linear 线速度
(2)geometry_msgs/Vector3 angular角速度
TwistStamped
TwistWithCovariance
TwistWithCovarianceStamped
Vector3
向量float64 x,float64 y,float64 z
Vector3Stamped
Wrench 力
(1)geometry_msgs/Vector3 force 力
(2)geometry_msgs/Vector3 torque 扭矩
WrenchStamped

2、nav_msgs消息类型

1 GridCells 栅格单元
(1)std_msgs/Header header头,时间戳与坐标系
(2)float32 cell_width,float32 cell_height宽度与高度
(3)geometry_msgs/Point[] cells数组

2MapMetaData 占有率栅格地图数据
(1)time map_load_time 地图被加载的时间
(2)float32 resolution 分辨率(m/cell)
(3)uint32 width,uint32 height
(4)geometry_msgs/Pose origin 真实世界中的原点 (m,m,rad) 图像中的(0,0)点

3 OccupancyGrid 2d栅格地图
(1)Header header
(2)nav_msgs/MapMetaData info 地图信息
(3)int8[] data 占有率地图数据序列,概率为【0-100】,未知为-1

4 Odometry 估计的位姿与速度
(1)std_msgs/Header header 位姿所在坐标系
(2)string child_frame_id 速度所在坐标系
(3)geometry_msgs/PoseWithCovariance pose 位姿
(4)geometry_msgs/TwistWithCovariance twist 速度

5 Path 路径
(1)Header header
(2)geometry_msgs/PoseStamped[] poses 代表路径的三维点坐标数组

(三)ROS中基本的消息类型

http://wiki.ros.org/msg

Primitive Type Serialization C++ Python2 / Python3
bool unsigned 8-bit int uint8_t bool
int8 signed 8-bit int int8_t int
uint8 unsigned 8-bit int uint8_t int
int16 signed 16-bit int int16_t int
uint16 unsigned 16-bit int uint16_t int
int32 signed 32-bit int int32_t int
uint32 unsigned 32-bit int uint32_t int
int64 signed 64-bit int int64_t long int
uint64 unsigned 64-bit int uint64_t long int
float32 32-bit IEEE float float float
float64 64-bit IEEE float double float
string ascii string std::string str bytes
time secs/nsecs unsigned 32-bit ints ros::Time rospy.Time
duration secs/nsecs signed 32-bit ints ros::Duration rospy.Duration

你可能感兴趣的:(ROS,自动驾驶,人工智能)