通讯实操03_服务调用1.服务名称和消息的获取1.1 获取话题1.2 获得消息类型1.3 获得消息格式2.功能实现2.0 编写launch文件2.1 写cpp文件2.2 修改CMake3.运行4.命令方式简单运行需求描述:编码实现向 turtlesim 发送请求在乌龟显示节点的窗体指定位置生成一乌龟这是一个服务请求操作。结果演示:实现分析:首先需要启动乌龟显示节点。要通过ROS命令来获取乌龟生成服务的服务名称以及服务消息类型。编写服务请求节点生成新的乌龟。实现流程:通过ros命令获取服务与服务消息信息。编码实现服务请求节点。启动 roscore、turtlesim_node 、乌龟生成节点生成新的乌龟。1.服务名称和消息的获取1.1 获取话题rosservice list得到结果如下话题名为/spawnspawn是下蛋的意思1.2 获得消息类型rosservicetype/spawn得到结果如下或者用rosservice info /spawn来获得消息类型消息类型为turtlesim/Spawn1.3 获得消息格式rossrv info turtlesim/Spawn得到结果如下消息格式为float32 x float32 y float32 theta string name --- string name2.功能实现创建功能包需要依赖的功能包: roscpp rospy std_msgs turtlesim2.0 编写launch文件在功能包下添加launch文件夹在launch文件夹下面添加launch文件内容如下!--启动乌龟GUI和键盘控制节点--launch!-- 乌龟GUI --nodepkgturtlesimtypeturtlesim_nodenameturtleoutputscreen/!-- 键盘控制 --nodepkgturtlesimtypeturtle_teleop_keynamekeyoutputscreen//launch这样可以通过roslaunch命令同时启动小乌龟节点和小乌龟键盘控制节点source./devel/setup.bash roslaunch plumbing_test start_turtle.launch2.1 写cpp文件在功能包下面的src目录下创建新的cpp文件内容如下#includeros/ros.h#includeturtlesim/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 clientnh.serviceClientturtlesim::Spawn(/spawn);// 5.组织数据并发送//5.1 组织请求数据turtlesim::Spawn spawn;spawn.request.x1.0;spawn.request.y4.0;spawn.request.theta1.57;spawn.request.nameturtle2;//5.2 发送请求//判断服务器状态//ros::service::waitForService(/spawn);client.waitForExistence();boolflagclient.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.老师的视频在笔记上理论部分大量参考了老师的文档