前言
ROS的话题和服务的对比如下图,图片取自https://blog.csdn.net/hmd3394969/article/details/115274820
一、创建ROS服务
在包的目录下创建srv文件夹
mkdir srv
新建一个srv文件
cd srv
gedit test.srv
添加如下:
int64 a
int64 b
---
int64 sum
其中,三条短线上⽅的代表请求参数,下⽅的代表相应参数.
与创建msg时一样
确保package.xml中包含以下两行且没有被注释
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
在CMakeLists.txt文件中,将message_generation添加到COMPONENTS列表中,添加运行时依赖关系
添加运行时依赖关系CATKIN_DEPENDS message_runtime
在CMakeLists.txt文件中添加srv文件,注意文件名前不能有空格,否则编译时会不通过
取消注释或添加
generate_messages(
DEPENDENCIES
std_msgs
)
无需编译,在工作空间目录下使用下面的命令查看服务是否创建成功
source devel/setup.bash
rossrv show test
如果成功的话端口输出如下
二、创建测试节点
最后在工作空间目录执行catkin_make
编译,编译完后会在以下目录生成消息和服务的C++头文件.
在功能包的src目录下创建test_client.cpp
和test_server.cpp
两个问价
在test_server.cpp中填入下面内容:
#include "ros/ros.h"
#include "test_srv/test.h"
bool addCallback(test_srv::test::Request &req, test_srv::test::Response &res)
{
res.sum = req.a * req.b;
return true;
}
int main(int argc,char**argv)
{
ros::init(argc, argv,"server");
ros::NodeHandle nh;
ros::ServiceServer server = nh.advertiseService("add_service", addCallback);
ros::spin();
return 0;
}
在test_client.cpp中填入下面内容:
#include "ros/ros.h"
#include "test_srv/test.h"
int main(int argc,char**argv)
{
ros::init(argc, argv,"client");
ros::NodeHandle nh;
ros::ServiceClient client = nh.serviceClient<test_srv::test>("add_service");
test_srv::test srv;
srv.request.a =5;
srv.request.b =5;
if(client.call(srv))
{
ROS_INFO("Success! %ld + %ld = %ld\n", srv.request.a, srv.request.b, srv.response.sum);
}
else
{
ROS_INFO("Failed to call service multiply_service");
return 1;
}
return 0;
}
将两个cpp文件添加到功能包的CMakeLists.txt文件中
add_executable(test_server src/test_server.cpp)
target_link_libraries(test_server ${catkin_LIBRARIES})
add_executable(test_client src/test_client.cpp)
target_link_libraries(test_client ${catkin_LIBRARIES})
然后catkin_make
编译
编译完后,先运行:
roscore
然后运行:
rosrun test_srv test_server
最后运行:
rosrun test_srv test_client
结果如下:
源码地址:
链接: https://pan.baidu.com/s/1K-a9f72LliohToUrgIWaWA 提取码: phi5
–来自百度网盘超级会员v5的分享