需求描述
编码实现向turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。
实现分析
1.首先,需要启动乌龟显示节点。
2.要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
3.编写服务请求节点,生成新的乌龟。
实现流程
1.通过ros命令获取服务与服务消息信息。
2.编码实现服务请求节点。
3.启动roscore、turtlesim_node、乌龟生成节点,生成新的乌龟。
1.服务名称与服务消息获取
获取话题:/spawn
rosservice list
/spawn可以在乌龟界面新建乌龟
获取消息类型:turtlesim/Spawn
rosservice type /spawn
获取消息格式:
rossrv info turtlesim/ Spawn
简单实现
终端中继续输入rosservice call /spawn "然后tab自动补齐,就可以开始设置了
分别是x,y坐标,唯一需要注意的是theta是乌龟的脑袋朝向,是用弧度来做单位的,3.14为一弧度,要想朝上,就是一半的弧度,就是1.57.
x:0,0
y:0,0
theta:0.0
name:“随便设置”
设置后,回车:
用c++实现,需要的功能包有roscpp,rospy,std_msgs,turtlesim
之前功能包有这些,直接在src下面新建文件test03_service_client.cpp
粘贴以下代码:
#include "ros/ros.h"
#include "turtlesim/Spawn.h"
/*需求:是向服务端发送请求,生成一只新的乌龟
话题:/spawn
消息: turtlesim/Spawn
1.包含头文件;
2.初始化·ROS·节点;
3.创建节点句柄;
4.创建客户端对象;
5.组织数据并发送:
6.处理响应。
8*/
int main(int argc, 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-l
// 6.处理响应。
//5-2.发送请求
//判断服务器状态
// ros : : service: :waitForService( " /spawn" );
client.waitForExistence( );
bool flag = client.call(spawn);// flag 接收响应状态,响应结果也会被设置进spwan对象//6.处理响应。
if (flag){
ROS_INFO("乌龟生成成功,新乌龟叫:8s " , spawn. response.name.c_str());}
else{
ROS_INFO("请求失败!!!");
}
return 0;
}
其中代码按照之前的代码进行修改数字还有文件名字即可。
spawn.request.x = 1.0;
spawn. request.y = 4.0;
spawn. request.theta = 1.57;
spawn. request.name = "turtle2" ;
判断服务器是否响应的函数,二选一即可。
ros : : service: :waitForService( " /spawn" );
client.waitForExistence( );
//判断服务器状态
// ros : : service: :waitForService( " /spawn" );这个也可以
client.waitForExistence( );
bool flag = client.call(spawn);// flag 接收响应状态,响应结果也会被设置进spwan对象//6.处理响应。
if (flag){
ROS_INFO("乌龟生成成功,新乌龟叫:8s " , spawn. response.name.c_str());}
else{
ROS_INFO("请求失败!!!");
}
然后配置cmakelist.txt文件:
add_dependencies(test03_service_client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test03_service_client
${catkin_LIBRARIES}
)
然后ctrl+shift+b编译运行无误即可。
运行
先启动roslaunch plumbing_test start_turtle.launch
新建一个:
source ./devel/setup.bash
rosrun plumbing_test test03_service_client
再来一次会失败:
原因是名字turtle2名字重复需要修改name,即可。