ROS 创建msgs srv 具体步骤

ROS入门教程-1.1.10 创建ROS消息和ROS服务

消息(msg)和服务(srv)介绍

  • msg文件存放在package的msg目录下,srv文件则存放在srv目录下。

  • 在ROS中有一个特殊的数据类型:Header,它含有时间戳和坐标系信息。

  • 下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息类型。

Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist
  • srv文件分为请求和响应两部分,由'---'分隔。其中A和B是请求, 而Sum是响应。下面是srv的一个样例:
int64 A
int64 B
---
int64 Sum

一. 创建自定义的ROS消息 :(msg

1.下面,我们将在之前创建的package里定义新的消息。

$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
  • 上面是最简单的例子——在.msg文件中只有一行数据。当然,你可以仿造上面的形式多增加几行以得到更为复杂的消息:
string first_name
string last_name
uint8 age
uint32 score

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

  • 查看package.xml, 确保它包含一下两条语句:
  <build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>
  • 如果没有,添加进去。

  • 注意:在构建的时候,我们只需要"message_generation"。然而,在运行的时候,我们只需要"message_runtime"。

  • 打开 package.xml 文件 :

将上的两代码添加到这个 package.xml 文件里,如下图所示:

è¿éåå¾çæè¿°

3.编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 find_packag() 函数,增加对 message_generation 的依赖,这样就可以生成消息了。 

  • 打开 CMakeLists.txt 文件:

è¿éåå¾çæè¿°

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

 4.继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 catkin_package() 函数, 添加运行依赖:message_runtime , roscpp , rospy , std_msgs

è¿éåå¾çæè¿°

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

5.继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 add_message_files()函数:添加新创建的消息文件: Num.msg 

è¿éåå¾çæè¿°

 add_message_files(
    FILES
#   Message1.msg
#   Message2.msg
    Num.msg
 )

6.继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 。通过上一步手动添加完 .msg 文件后,我们要确保 CMake 知道在什么时候重新配置我们的 project 。 确保添加了如下代码: 添加包含 msgs 的软件包依赖 

è¿éåå¾çæè¿°

 generate_messages(
   DEPENDENCIES
   std_msgs
 )
  • 继续编写 beginner_tutorials 程序包中的 CMakeLists.txt,并为下边这行代码去掉#:
# rosbuild_genmsg()

 

接下来,编译,就可以生成自己的消息源代码了。

二. 编译工作空间:

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash

三. 编译工作空间:

  • 下面通过rosmsg show命令,检查ROS是否能够识消息。$ rosmsg show [message type]

$ rosmsg show beginner_tutorials/Num
  • 你将会看到:
int64 num
  • 在上边的样例中,消息类型包含两部分: 消息所在的package Num 和 消息名Num
  • 如果你忘记了消息所在的package,你也可以省略掉package名。输入:

$ rosmsg show Num 
  • 你将会看到:
[beginner_tutorials/Num]:
int64 num

四. 创建srv:

1:现在 beginner_tutorials 软件包中创建一个 srv 文件夹,用来存放我们下面要创建的服务文件:

$ roscd beginner_tutorials
$ mkdir srv
  • 这次,不自己写服务文件了, 我们直接复制已有的文件:( roscp 是一个很实用的命令行工具,它实现了将文件从一个 package 复制到另外一个 package 的功能。)

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
  • 还有很关键的一步:我们要确保srv文件被转换成C++,Python和其他语言的源代码。
  • 我们打开这个 AddTwoInts.srv 文件看看里面有什么:

gedit srv/AddTwoInts.srv

è¿éåå¾çæè¿°

下面就是编写 package.xml 文件 和 CMakeLists.txt 文件了。跟创建消息的步骤类似:(目的:确保 srv 文件被转换成为 C++ , Python 和其他语言的源代码)

2:查看 beginner_tutorials 程序包中的 package.xml , 确保它包含一下两条语句: (上面创建的 msg 消息的时候就可以添加了,所以这次就不需要添加了)

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend> 

3:编写 beginner_tutorials 程序包中的 CMakeList.txt 文件中的 find_packag() 函数,增加对 message_generation 的依赖:(上面创建 msg 消息的时候已经添加了,所以现在就不需要添加了。可以跳过这个步骤)

è¿éåå¾çæè¿°

(你发现了吧, message_generation 对 msg 和 srv 都起作用)

4:继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 中的 add_service_files() 函数:添加新创建的服务文件 :

è¿éåå¾çæè¿°

 add_service_files(
   FILES
#   Service1.srv
#   Service2.srv
AddTwoInts.srv
 )

5:继续编写 beginner_turtorials 程序包中的 CMakeLists.txt 文件中的 generate_messages() 函数:添加包含 msgs 的软件包依赖: (在创建 msg 消息的时候,就已经添加了,所以现在可以跳过这个步骤)

è¿éåå¾çæè¿°

(你发现了吧, generate_messages() 函数 对msgsrv 都起作用)

四. 编译工作空间:

现在我们回到主工作空间路径来编译一下:

$ cd ~/catkin_ws
$ catkin_make

五. 使用srv:

  • 下面通过rossrv show命令,检查ROS是否能够识该服务。
$ rossrv show beginner_tutorials/AddTwoInts
  • 你将会看到:
int64 a
int64 b
---
int64 sum
  • 跟rosmsg类似, 你也可以不指定具体的package名来查找服务文件:
$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

 

 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

ROS (Robot Operating System) 是一种用于机器人应用程序的开源操作系统,它通过发布订阅通信模型来组织节点间的交互。在ROS中,服务(Service)是一种异步的请求-响应机制,用于处理特定任务。要创建一个简单的ROS服务,你需要按照以下步骤操作: 1. **定义服务**:首先,在`src`目录下创建一个新的,并在`msg`文件夹下定义服务的消息类型(`.msg`文件),例如,你可以创建一个名为`AddTwoInts`的服务,其中含两个整数参数。 ```bash $ mkdir my_package cd my_package $ rosmake ``` 编辑`msg/AddTwoInts.msg`文件: ```xml <launch> <arg name="a" type="int"/> <arg name="b" type="int"/> <service type="my_package/AddTwoIntsRequest" id="add_two_ints_service"> <action name="sum"> <request> <arg name="a" type="int"/> <arg name="b" type="int"/> </request> <response> <int result="0"/> </response> </action> </service> </launch> ``` 2. **定义服务端**:在`server.py`或`cpp`等文件中编写服务提供者节点,这个节点监听并处理来自客户端的服务请求。 3. **发布服务**:在`node_main.cpp`或`main.py`等启动文件里,初始化ROS节点并发布服务。 4. **消费服务**:在另一个节点中,你可以使用`rosservice call`命令来发送请求到服务,或者编写客户端代码来自动调用服务。 ```cpp ros::ServiceClient client = node->getService("add_two_ints"); if (!client.waitForExistence(ros::Duration(5))) { ROS_ERROR("Service not available!"); return -1; } AddTwoIntsRequest request; request.a = 5; request.b = 7; AddTwoIntsResponse response; try { client.call(request, response); } catch (const std_msgs::ServiceException &e) { ROS_ERROR("Service call failed: %s", e.what()); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值