ros2学习(03)—服务与自定义接口
Published: Post views:ros2学习日志(3)—自定义服务接口
3.0 掷骰子游戏构想
前面我们创建了一个god节点来掷骰子,一个player节点来接收骰子点数。但这不够有意思,我们现在设想这么一个场景:
god节点掷骰子,然后player节点来猜骰子点数,如果猜对,则返回正确,如果错误,则返回错误。
这个场景与之前发布者订阅者的不同是,增加了两个节点之间的交互,即player节点需要向god节点发送一个数字,而god节点判断数字是否正确,并输出结果。
这种两个节点需要交互的场景,需要利用ros2中的服务。
3.1 场景分析
在掷骰子游戏这一场景中,player作为客户端,向god服务端发起请求(也就是发送一个数值给god服务端)。
god服务端这边接收到player的请求(request)后,判断player是否猜对骰子点数,并反馈或者响应(response)消息。
所以,这个场景下:
- god是服务端(service),提供投掷骰子服务,并判断是否猜对;
- player是客户端(client),发起猜骰子点数的请求(request),并接收god服务端的反馈或响应(response)。
于是,一个自然而然的服务接口出现了:
- 请求request是一个uint32类型的数值;1-6之间任意整型数
- 响应response是一个bool类型的标识符;比如TRUE或FALSE
3.2 数据接口(interface)
ros2中内置了很多数据接口,可以利用ros2 interface list
查看
有用于messages的,有用于services的,有用于action的
- 注意这里面所有的接口名称,首字母都是大写
- 首字母大写会被反复强调,很重要
我们不去寻找是否有满足我们需求的接口,也许有,也许没有。
这里我们直接建立一个满足我们需要的自定义服务接口。
3.3 自定义服务接口
在这里,我们新建一个package来存放我们所有的自定义接口,package名称是interfaces。
ros2 pkg create interfaces --build-type ament_cmake
注意build-type不可以用ament_python。
3.3.1 创建srv文件
cd到interfaces下,新建srv文件夹,并在srv文件夹内新建DiceGameService.srv文件
在DiceGamesService.srv文件中输入以下代码:
uint32 input_num #一开始我使用inputNum#但是报错了#似乎不能出现大写字母#(此处存疑)#
---
bool guess_result
- DiceGameService.srv首字母必须大写!!!
- uint32跟std_msgs中的UInt32不一样,string跟std_msgs中的String也不一样
- 大写字母开头的UInt32和String是类,而小写字母开头的uint32和string是ros2中的基本数据类型
3.3.2 修改CMakeLists
在CMakeLists.txt文件中添加以下代码:
find_package(rosidl_default_generators REQUIRED) #添加依赖
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/DiceGameService.srv"
)
- rosidl_default_generators是ros2中的一个API,相关介绍在About internal ROS 2 interfaces — ROS 2 Documentation: Rolling documentation
- srv/DiceGameService.srv是新建srv文件的路径
3.3.3 修改package.xml
在package.xml文件中添加以下代码:
<member_of_group>rosidl_interface_packages</member_of_group>
3.3.4 编译运行
colcon build --packages-select interfaces
source install/setup.bash
然后使用ros2 interface list |grep Dice
查看一下当前的接口
ros2 interface list
命令是ros2中显示所有接口的命令|grep Dice
是筛选含有Dice字符串的结果
可以看到结果中出现了我们创建的DiceGameService的服务接口
3.4 特别注意(非常重要)
- 自定义接口文件名称首字母必须大写!!!如本例中的DiceGameService.srv中的D必须大写。
- srv文件中的的变量名字似乎不能用大写,比如inputNum会编译报错,而input_num则不会。
- 查阅ros2官方文档,发现srv文件中的变量名字的确不允许有大写,只允许小写字母和下划线,并且不允许双下划线,不允许下划线结尾
- 文档链接:About ROS 2 interfaces — ROS 2 Documentation: Galactic documentation
Categories: 机器人技术
Comments