msg消息

基本概念

msg消息 是ROS topic通讯节点间传递的内容。

msg消息描述的是业务间传递数据,也可以理解为业务间数据的抽象化。

常见Msg消息

std消息

std消息属于基本数据类型消息,和python类似,描述的是数字,字符串,布尔类型等。

Note

std_msgs/Bool std_msgs/Byte std_msgs/ByteMultiArray std_msgs/Char std_msgs/ColorRGBA std_msgs/Duration std_msgs/Empty std_msgs/Float32 std_msgs/Float32MultiArray std_msgs/Float64 std_msgs/Float64MultiArray std_msgs/Header std_msgs/Int16 std_msgs/Int16MultiArray std_msgs/Int32 std_msgs/Int32MultiArray std_msgs/Int64 std_msgs/Int64MultiArray std_msgs/Int8 std_msgs/Int8MultiArray std_msgs/MultiArrayDimension std_msgs/MultiArrayLayout std_msgs/String std_msgs/Time std_msgs/UInt16 std_msgs/UInt16MultiArray std_msgs/UInt32 std_msgs/UInt32MultiArray std_msgs/UInt64 std_msgs/UInt64MultiArray std_msgs/UInt8 std_msgs/UInt8MultiArray

geometry消息

空间数据描述

Note

geometry_msgs/Accel geometry_msgs/AccelStamped geometry_msgs/AccelWithCovariance geometry_msgs/AccelWithCovarianceStamped geometry_msgs/Inertia geometry_msgs/InertiaStamped geometry_msgs/Point geometry_msgs/Point32 geometry_msgs/PointStamped geometry_msgs/Polygon geometry_msgs/PolygonStamped geometry_msgs/Pose geometry_msgs/Pose2D geometry_msgs/PoseArray geometry_msgs/PoseStamped geometry_msgs/PoseWithCovariance geometry_msgs/PoseWithCovarianceStamped geometry_msgs/Quaternion geometry_msgs/QuaternionStamped geometry_msgs/Transform geometry_msgs/TransformStamped geometry_msgs/Twist geometry_msgs/TwistStamped geometry_msgs/TwistWithCovariance geometry_msgs/TwistWithCovarianceStamped geometry_msgs/Vector3 geometry_msgs/Vector3Stamped geometry_msgs/Wrench geometry_msgs/WrenchStamped

sensor消息

传感器消息

Note

sensor_msgs/BatteryState sensor_msgs/CameraInfo sensor_msgs/ChannelFloat32 sensor_msgs/CompressedImage sensor_msgs/FluidPressure sensor_msgs/Illuminance sensor_msgs/Image sensor_msgs/Imu sensor_msgs/JointState sensor_msgs/Joy sensor_msgs/JoyFeedback sensor_msgs/JoyFeedbackArray sensor_msgs/LaserEcho sensor_msgs/LaserScan sensor_msgs/MagneticField sensor_msgs/MultiDOFJointState sensor_msgs/MultiEchoLaserScan sensor_msgs/NavSatFix sensor_msgs/NavSatStatus sensor_msgs/PointCloud sensor_msgs/PointCloud2 sensor_msgs/PointField sensor_msgs/Range sensor_msgs/RegionOfInterest sensor_msgs/RelativeHumidity sensor_msgs/Temperature sensor_msgs/TimeReference

一些需求

已知有两个节点,其中一个节点是Publisher,另外一个节点是Subscriber

Publisher发布的消息是 学生数据 ,包含了学生的 姓名年龄

要求实现这个两个节点,并且模拟数据发布和订阅!

分析

PublisherSubscriber的编写我们已经会了。

但是中间传输的数据类型,默认系统是没有提供的。

这个时候我们需要自己定制消息格式。

总的来说,这个自定义的消息格式中,需要包含nameage

通常在编程语言中,我们还是要去确定消息字段中的类型。

例如,Python程序,表达数据类型是这样的:

name = ''
age = 0

python中省掉了声明类型,我们用值来表示类型。

实现步骤

  • 首先自定义消息
  • 实现publisher
  • 实现subscriber
  • 模拟数据发布

自定义消息

在Ros中,如果没有现成的消息类型来描述要去传递的消息时,我们会自定义消息。

通常我们会新建一个Package来去自定义消息,这个Package一般不去写任何的业务逻辑,只是用来声明自定义的消息类型,可以只定义一种消息类型,也可以定义多种消息类型,根据业务需求来定。

所以,我们会单独的创建一个package,用来定义消息.

创建package

包名取名也是有讲究的,业务名_msgs。大家可以看看std_msgs,geometry_msgs,都是遵循这个规则。

创建msg目录

在package包下新建msg文件夹

创建msg文件

在msg文件夹下创建.msg文件. .msg文件就是自定义消息文件,用来描述消息格式的。

例如案例中, 我们会去创建Student.msg文件, 内容如下:

string name
int64 age

这个自定义的消息包含两个数据形式,nameagename的类型 是stringage的类型是int64

这个msg文件其实遵循一定规范的,每一行表示一种数据。前面是类型,后面是名称。

ros不只是提供了int64string两种基本类型供我们描述,其实还有很多,具体可以参考附录的内容

配置package.xml

在package.xml种添加如下配置:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

配置CMakeLists.txt

find_package配置

find_package添加message_generation,结果如下:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosmsg
  rospy
  message_generation
)

add_message_file配置

添加add_message_file,结果如下:

add_message_files(
        FILES
        Student.msg
)

Tip

这里的Student.msg要和你创建的msg文件名称一致,且必须时在msg目录下,否则编译会出现问题

generation_msg配置

添加generation_msg,结果如下:

generate_messages(
        DEPENDENCIES
        std_msgs
)

Tip

这个配置的作用是添加生成消息的依赖,默认的时候要添加std_msgs

catkin_package配置

修改catkin_package,结果如下:

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo_msg
   CATKIN_DEPENDS roscpp rosmsg rospy message_runtime
#  DEPENDS system_lib
)

Tip

为catkin编译提供了依赖`message_runtime

编译项目

cd 工作空间
catkin_make

校验

devel文件夹校验

来到devellib/python2.7/dist-package目录下,查看是否生成和package名称相同的目录,以及目录内是否生成对应的py文件。

命令校验

rosmsg show hello_msgs/Student

需求升级

已知有两个节点,其中一个节点是Publisher,另外一个节点是Subscriber

Publisher发布的消息是 团队数据,包含了以下内容:

名称 类型 描述
name string 团队名称
leader Student 团队领导
intro std_msgs/String 团队介绍
location geometry_msgs/Pose 位置
members 多个元素 团队成员

要求实现这个两个节点,并且模拟数据发布和订阅!