在ROS中数据类型(消息)是话题发布的基本形式,明确ROS基本数据类型(消息),是基于ROS编程的基础。
通常有以下两种编程场景,需要明确话题的消息类型(数据类型):
一、已有ROS仿真器,自行编写控制器节点
利用ROS进行仿真的时候,通常仿真器已具有明确的subscriber规则,如:turtlesim和gazebo等。此时我们在编写控制器Publisher节点时,需要参照仿真器已有的话题名、消息类型等进行编程。
通常步骤可以分为四步:1、明确话题名2、明确话题消息;3、明确消息定义;4、编写控制器。
1、利用rostopic list明确仿真器可用的topic
roscore
rosrun turtlesim turtlesim_node
rostopic list
2、rostopic info 找到对应话题的类型
3、rosmsg show查找msg定义
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>
②发布类型模板:
nh.advertise<总包名::消息名>
③作业:
用消息定义一个对象。为对象的特定成员赋值。
补充:Twist定义的介绍
geometry_msgs为点、向量和姿态等常见几何原语提供数据类型。这些Primative旨在提供通用数据类型,并促进整个系统的互操作性。
Twist消息是geometry_msgs下的一个数据类型,存放了两组vector3,每个vector3又分别存放了3个float64类型变量
二、自己构建Publisher和Subscriber节点
自己构建Publisher和Subscriber节点,自己挑选合适的msg。主要需要自己对常见的数据类型有一定的了解。
(一)ROS中消息类型的结构框架
1、common_msgs
ROS中C++和Python最基础的数据类型包为common_msgs。其中包含常见的多种消息类型:动作消息( actionlib_msgs ),诊断消息 ( diagnostic_msgs ), 几何消息( geometry_msgs ),导航消息( nav_msgs )和常见的传感器消息 ( sensor_msgs )。
2、geometry_msgs
3、Twist类型定义
4、vetor3的定义
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 |
文章出处登录后可见!