ROS学习记录(二)--消息和服务

这篇博客详细记录了ROS中消息和服务的创建过程,包括msg和srv文件的编辑,消息发布器和订阅器节点的编写,以及Service和Client的实现。重点介绍了如何使用rosed命令,创建msg和srv文件,以及如何配置CMakeLists.txt文件进行编译。最后,通过实例展示了如何启动发布器、订阅器、服务节点和客户端进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令总结

rospack = ros+pack(age) : 提供ROS package相关的信息 
rosstack = ros+stack  : 提供stacks 相关的信息 
roscd = ros+cd  : changes directory to a ROS package or stack 
rosls = ros+ls  : lists files in a ROS package 
roscp = ros+cp  : copies files from/to a ROS package 
rosmsg = ros+msg : provides information related to ROS message definitions 
rossrv = ros+srv : provides information related to ROS service definitions 
rosmake = ros+make : makes (compiles) a ROS package 

使用rosed编辑ROS中的文件

rosed : 可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径

rosed [package_name] [filename]

rosed roscpp Logger.msg

默认编辑器是vim,将其他编辑器设置为默认,用gedit编辑

export EDITOR='gedit'

创建ROS消息和ROS服务

消息msg: msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码

msg文件存放在package的msg目录下,实际上就是每行声明一个数据类型和变量名

可以使用的数据类型如下:

int8, int16, int32, int64 (plus uint*) float32, float64 string time, duration other msg files variable-length array[] and fixed-length array[C]

在ROS中有一个特殊的数据类型:Header,它含有时间戳和坐标系信息
在msg文件的第一行经常可以看到Header header的声明.
下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息类型。

Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

服务srv: 一个srv文件描述一项服务。它包含两个部分:请求和响应

srv文件存放在srv目录下,srv文件分为请求和响应两部分,由’—’分隔。下面是srv的一个样例

int64 A
int64 B
---
int64 Sum

使用msg

创建一个msg

在beginner_tutorials包里创建msg文件夹,定义新的消息

echo "int64 num" > msg/Num.msg

接下来,还有关键的一步:我们要确保msg文件被转换成为C++,Python和其他语言的源代码

查看package.xml, 确保它包含一下两条语句:没有的话加上

  <build_depend>message_generation</build_depend>
错误  <run_depend>message_runtime</run_depend>
    <exec_depend>message_runtime</exec_depend>

注意:在构建的时候,我们只需要”message_generation”。
然而,在运行的时候,我们只需要”message_runtime”。
打开CMakelist.txt
在CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

同样,你需要确保你设置了运行依赖:

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES beginner_tutorials
  CATKIN_DEPENDS roscpp rospy std_msgs **message_runtime**
  DEPENDS system_lib
)

找到add_message_files,去掉#,把msg文件名写成自己的msg

add_message_files(
   FILES
   NUM.msg
#   Message2.msg
 )

手动添加.msg文件后,我们要确保CMake知道在什么时候重新配置我们的project,找到下面,去掉#

 generate_messages(
   DEPENDENCIES
   std_msgs
 )
 这个例子是依赖std_msgs,不要添加roscpp,rospy
 在package.xml中加入:
   <build_depend>std_msgs</build_depend>

为下边这行代码去掉#:

# rosbuild_genmsg()

没找到??应该是rosbuild编译系统需要的,此处用catkin,不用加这句和下面的gensrv

创建好消息后,通过rosmsg show 看是否能识别消息
rosmsg show [message type]

rosmsg show beginner_tutorials/Num

提示找不到msg Num
原因:变量$ROS_PACKAGE_PATH里没有beginner_tutorials的路径 原来是在bashrc里面没有添加进去
解决

export ROS_PACKAGE_PATH=/home/ada/Code/rgbdslam_catkin_ws/src:/opt/ros/kinetic/share:/home/ada/kinect/catkin_ws/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值