一、目的
Server端等待信号,每次接收到Client端的信号,海龟的运动状态就切换一次(运动→停止、停止→运动)
二、创建服务器代码
在~/catkin_ws/src/learning_service/src
目录下创建一个turtle_command_server.cpp
的文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
#include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <std_srvs/Trigger.h>
ros::Publisher turtle_vel_pub; bool pubCommand = false;
bool commandCallback(std_srvs::Trigger::Request &req, std_srvs::Trigger::Response &res) { pubCommand = !pubCommand;
ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");
res.success = true; res.message = "Change turtle command state!";
return true; }
int main(int argc, char **argv) { ros::init(argc, argv, "turtle_command_server");
ros::NodeHandle n;
ros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);
turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
ROS_INFO("Ready to receive turtle command.");
ros::Rate loop_rate(10);
while(ros::ok()) { ros::spinOnce(); if(pubCommand) { geometry_msgs::Twist vel_msg; vel_msg.linear.x = 0.5; vel_msg.angular.z = 0.2; turtle_vel_pub.publish(vel_msg); }
loop_rate.sleep(); }
return 0; }
|
实现过程:
- 初始化ROS节点
- 创建Server实例
- 循环等待服务请求,进入回调函数
- 在回调函数中完成服务功能的处理,并反馈应答数据
三、配置服务器代码编译规则
打开learning_service
中的CMakeLists.txt
,在图示区域添加代码
1 2
| add_executable(turtle_command_server src/turtle_command_server.cpp) target_link_libraries(turtle_command_server ${catkin_LIBRARIES})
|
把turtle_command_server.cpp编译成turtle_command_server文件,同时去链接需要依赖的库文件。
四、编译并运行
编译服务器
1 2
| cd ~/catkin_ws cadkin_make
|
生效环境变量(如果已经在.bashrc
中添加了环境变量则不需要再执行此步)
再运行以下代码(以下三行需要各自启动一个终端)
1 2 3
| roscore rosrun turtlesim turtlesim_node rosrun learning_service turtle_command_server
|
再启动一个终端,输入代码rosservice call /turtle_command+空格+两次Tab
发送信号,海龟开始运动,再次发送同样的信号,小海龟停止。