最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

1.3.5 自定义消息类型

ROS1/一代机器人系统 少儿编程 2629浏览 0评论
Ros教程01

友情提示:380元/半年,儿童学编程,就上码丁实验室

ROS提供了较为丰富的内置消息类型,如”std_msgs”包定义了原始消息类型:

1.3.5 自定义消息类型

上述原始类型用于构建ROS中使用的所有消息类型,例如,(大部分的)激光测距传感器发布的”sensor_msgs/LaserScan”消息。

1.3.5 自定义消息类型

使用标准的ROS消息类型描述激光扫描和位置估计,能够为各种各样的机器人提供导航和地图构建的功能。但有时ROS的内置消息类型并不能满足需要,此时可以通过自定义消息类型来解决。

  • msg文件

自定义ROS消息类型,先在程序包下的msg目录中创建消息类型的定义文件, 然后编译为可在代码中使用的特定语言的实现。 定义文件中的每一行都指定一个类型和一个字段名称。

  • 消息字段类型

消息字段类型可以是:

预设类型,如”float32 pan”或”String name”,消息名称往往描述了该消息的定义,如”geometry_msgs/PoseStamped”,固定或可变长度的矩阵(列表),如”float32[] ranges”或”Point32[10] points”,此外,”Header”类型对应”std_msgs/Header”。

  • 创建自定义消息类型

此处,通过例子演示如何创建一个新的ROS消息类型,每个机器人通过发布该类型消息表明自己是否准备好接受并执行任务。该消息类型名称为”RobotStatus”,结构如下:

Header header
int32 robot_id
bool is_ready

是不是类似结构体的定义。其中,”header”包含ROS中常用的时间戳和坐标系信息。

  • 消息的”Header”

1.3.5 自定义消息类型

时间戳(stamp)为消息的发布时间,”frame_id”为该消息中包含的数据的参考点。

  • 动手实现自定义消息类型

首先,创建新的包”custom_messages”

cd ~/catkin_ws/src/ros_tutorial/lecture1-3/
catkin_creat_pkg custom_messages std_msgs rospy roscpp

接着,创建子目录”msg”并在其中创建”RobotStatus.msg”文件:

cd ~/catkin_ws/src/ros_tutorial/lecture1-3/custom_messages
mkdir msg 
gedit msg/RobotStatus.msg

并在该文件中输入:

Header header
int32 robot_id
bool is_ready

现在我们需要确保将msg文件转换为C ++,Python和其他语言的源代码

打开”package.xml”文件,输入如下内容:

<build_depend>roscpp</build_depend>

<build_depend>rospy</build_depend>

<build_depend>std_msgs</build_depend>

<build_depend>message_generation</build_depend>

<run_depend>roscpp</run_depend>

<run_depend>rospy</run_depend>

<run_depend>std_msgs</run_depend>

<run_depend>message_runtime</run_depend>

注意,构建是需要”message_generation”,运行时需要”message_runtime”。

在”CMakeLists.txt”文件中增加”message_generation”:

find_package(catkinREQUIRED COMPONENTS

  roscpp

  rospy

  std_msgs

  message_generation

)

此外:

catkin_package(

# INCLUDE_DIRS include

# LIBRARIES multi_sync

   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime

# DEPENDS sySTEM_lib

)

找到如下代码块:

## Generate messages in the ‘msg’ folder

# add_message_files(

#   FILES

#   Message1.msg

#   Message2.msg

# )

通过删除”#”取消注释,并输入恰当的”.msg”文件名,如下所示:

add_message_files(

   FILES
RobotStatus.msg
)

此时,需要确保”generate-messages()”函数被调用,类似地,取消如下代码的注释:

# generate_messages(

#  DEPENDENCIES

#  std_msgs

# )

最后,该代码块应如下所示:

generate_messages(

 DEPENDENCIES

 std_msgs

)

  • 使用rosmsg

首先,使用”rosmsg”命令确保ROS看得到自定义的消息类型,rosmsg的语法如下:

rosmsg show [message type]

示例如下:

1.3.5 自定义消息类型

  • 构建消息文件

现在,构建本小节创建的包:

cd ~/catkin_ws/
catkin_make

构建过程中,源文件将创建自.msg文件

1.3.5 自定义消息类型

任何”msg”目录下的”.msg”文件将会生成用于各支持语言的代码,其中,”C++”消息头文件将生成于”~/catkin_ws/devel/include/custom_messages/”。

  • 源代码

同之前的教程,源代码放在github:

https://github.com/LinHuican/ros_tutorial

注意:开源的代码在ROS indigo调试通过,若您使用ROS kinetic可根据本文的叙述进行修改,有任何问题后台发消息即可。个人兴趣进行总结和维护,后期会进一步用分支或其它方式完善,PPT等参考资料也会陆续共享。

 


  • 练习

(1)编写程序使得乌龟从当前位置向前移动1米,然后旋转45°,最后停止。

(2)输出乌龟的初始位置和当前位置。

 

转自公众号:
Robot404

您必须 登录 才能发表评论!