【ROS进阶】5000字解析如何确定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

在这里插入图片描述

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 TypeSerializationC++Python2 / Python3
boolunsigned 8-bit intuint8_tbool
int8signed 8-bit intint8_tint
uint8unsigned 8-bit intuint8_tint
int16signed 16-bit intint16_tint
uint16unsigned 16-bit intuint16_tint
int32signed 32-bit intint32_tint
uint32unsigned 32-bit intuint32_tint
int64signed 64-bit intint64_tlong int
uint64unsigned 64-bit intuint64_tlong int
float3232-bit IEEE floatfloatfloat
float6464-bit IEEE floatdoublefloat
stringascii stringstd::stringstr bytes
timesecs/nsecs unsigned 32-bit intsros::Timerospy.Time
durationsecs/nsecs signed 32-bit intsros::Durationrospy.Duration
#include <std_msgs/Float64.h>
std_msgs::Float64 input_float; //create a variable of type "Float64
ros::Publisher my_publisher_object = n.advertise<std_msgs::Float64>("topic1", 1)   ;
my_publisher_object.publish(input_float);
  • 37
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村路蔡徐坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值