通讯实操03_服务调用
- 1.服务名称和消息的获取
- 1.1 获取话题
- 1.2 获得消息类型
- 1.3 获得消息格式
- 2.功能实现
- 2.0 编写launch文件
- 2.1 写cpp文件
- 2.2 修改CMake
- 3.运行
- 4.命令方式简单运行
需求描述:编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。
结果演示:
实现分析:
- 首先,需要启动乌龟显示节点。
- 要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
- 编写服务请求节点,生成新的乌龟。
实现流程:
- 通过ros命令获取服务与服务消息信息。
- 编码实现服务请求节点。
- 启动 roscore、turtlesim_node 、乌龟生成节点,生成新的乌龟。
1.服务名称和消息的获取
1.1 获取话题
rosservice list得到结果如下:
话题名为:/spawn
spawn是下蛋的意思
1.2 获得消息类型
rosservicetype/spawn得到结果如下:
或者用
rosservice info /spawn来获得消息类型
消息类型为:turtlesim/Spawn
1.3 获得消息格式
rossrv info turtlesim/Spawn得到结果如下:
消息格式为:
float32 x float32 y float32 theta string name --- string name2.功能实现
创建功能包需要依赖的功能包: roscpp rospy std_msgs turtlesim
2.0 编写launch文件
在功能包下添加launch文件夹,在launch文件夹下面添加launch文件,内容如下:
<!--启动乌龟GUI和键盘控制节点--><launch><!-- 乌龟GUI --><nodepkg="turtlesim"type="turtlesim_node"name="turtle"output="screen"/><!-- 键盘控制 --><nodepkg="turtlesim"type="turtle_teleop_key"name="key"output="screen"/></launch>这样可以通过roslaunch命令同时启动小乌龟节点和小乌龟键盘控制节点
source./devel/setup.bash roslaunch plumbing_test start_turtle.launch2.1 写cpp文件
在功能包下面的src目录下创建新的cpp文件
内容如下
#include"ros/ros.h"#include"turtlesim/Spawn.h"/* 需求:向服务端发送请求,生成一只新乌龟 话题:/spawn 消息:turtlesim/Spawn 1.包含头文件 2.初始化ros节点 3.创建节点句柄 4.创建服务端对象 5.组织数据并发送 6.处理响应 */intmain(intargc,char*argv[]){setlocale(LC_ALL,"");// 2.初始化ros节点ros::init(argc,argv,"service_call");// 3.创建节点句柄ros::NodeHandle nh;// 4.创建服务端对象ros::ServiceClient client=nh.serviceClient<turtlesim::Spawn>("/spawn");// 5.组织数据并发送//5.1 组织请求数据turtlesim::Spawn spawn;spawn.request.x=1.0;spawn.request.y=4.0;spawn.request.theta=1.57;spawn.request.name="turtle2";//5.2 发送请求//判断服务器状态//ros::service::waitForService("/spawn");client.waitForExistence();boolflag=client.call(spawn);//flag 接收响应状态,响应结果也会被设置进spwan对象// 6.处理响应if(flag){ROS_INFO("乌龟生成成功,新乌龟名字叫:%s",spawn.response.name.c_str());}else{ROS_INFO("乌龟生成失败");}return0;}2.2 修改CMake
修改功能包下的src下的cmake文件
第136行取消注释add_executable(节点名 cpp文件),注意一般节点名选用和cpp文件名一致
add_executable(test_o1_severclient src/test_o1_severclient.cpp)第149-151行target_link_libraries取消注释
target_link_libraries(和上一条同名的节点名 ${catkin_LIBRARIES} )即
target_link_libraries(test_o1_severclient ${catkin_LIBRARIES} )3.运行
先编译,然后先开一个终端source一下,然后用roslaunch启动多个节点
source./devel/setup.bash oslaunch plumbing_test_sever start_turtle.launch再开一个终端source一下,rosrun启动服务
source./devel/setup.bash rosrun plumbing_test_sever test_o1_severclient4.命令方式简单运行
可以使用rosservice call来简单实现功能
新开一个终端,输入rosservice call,按tab补齐
然后就可以自定义新生成的乌龟的x坐标、y坐标和姓名
回车运行指令
指令运行后会返回乌龟名称
(theta的角度是弧度制,3.0接近pai所以乌龟的头向右侧)
学习的为赵虚左老师的教程 1.老师的文档 2.老师的视频
在笔记上理论部分大量参考了老师的文档