当前位置:网站首页>ROS之service编程的学习和理解
ROS之service编程的学习和理解
2022-07-31 05:16:00 【xp_fangfei】
近期由于工作需要,需要学习service编成,故写该博客记录一下,以便日后查询方便,也可以方便各位网友的学习。
下面开始正题。。。。
创建工作空间
mkdir -p ros_practice/src
cd ros_practice/src/
catkin_init_workspace
cd ../
catkin_make
//添加环境变量
echo "source ~ros_practice/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
创建Ros功能包和元功能包
cd ros_practice/src/
catkin_create_pkg learn_service roscpp rospy std_msgs // catkin_create_pkg [package_name] [dependency1] [dependency1] ...
cd ../ //回退到ros_prctice目录下
catkin_make //编译
创建服务
- 在元功能包文件夹下创建名为srv的文件夹
- 在srv文件夹下创建multnum.srv文件
multnum.srv内容:
float32 a
float32 b
---
float32 c
string d
package.xml内容更改
以上三行取消注释
CMakeLists.txt内容修改
cmake_minimum_required(VERSION 3.0.2)
project(learn_service)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation //添加
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## Generate services in the 'srv' folder
add_service_files(
FILES
multnum.srv //添加
)
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learn_service
CATKIN_DEPENDS roscpp rospy std_msgs message_generation //添加
# DEPENDS system_lib
)
include_directories(
# include
${
catkin_INCLUDE_DIRS}
)
add_executable(service src/service.cpp)
target_link_libraries(service ${
catkin_LIBRARIES})
add_dependencies(service learn_service_gencpp)
add_executable(client src/client.cpp)
target_link_libraries(client ${
catkin_LIBRARIES})
add_dependencies(client learn_service_gencpp)
编译:
cd 到learn_service目录下
catkin_make
查看服务:
[email protected]-virtual-machine:~/ros_practice$ rossrv show learn_service/multnum
float32 a
float32 b
---
float32 c
string d
以上就说明编译成功,接下来就可以写节点实现自己的功能了。
节点的编写:
client.cpp
#include <cstdlib>
#include "ros/ros.h"
#include "learn_service/multnum.h"
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "lient");
// 从终端命令行获取两个加数
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
}
// 创建节点句柄
ros::NodeHandle n;
// 创建一个client,请求add_two_int service,service消息类型是learning_communication::AddTwoInts
ros::ServiceClient client = n.serviceClient<learn_service::multnum>("add_two_ints");
// 创建learning_communication::AddTwoInts类型的service消息
learn_service::multnum addsrv;
addsrv.request.a = atoll(argv[1]);
addsrv.request.b = atoll(argv[2]);
// 发布service请求,等待加法运算的应答结果
if (client.call(addsrv))
{
ROS_INFO("Sum: %ld", (long int)addsrv.response.c);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
service.cpp
#include "ros/ros.h"
#include "learn_service/multnum.h"
#include "std_msgs/String.h"
// service回调函数,输入参数req,输出参数res
bool AddCallback(learn_service::multnum::Request &req,
learn_service::multnum::Response &res)
{
// 将输入参数中的请求数据相加,结果放到应答变量中
std::stringstream ss;
ss << "hello world ";
res.c = req.a + req.b;
res.d = ss.str();
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.c);
ROS_INFO("%s", res.d.c_str());
return true;
}
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "service");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个名为add_two_ints的server,注册回调函数add()
ros::ServiceServer service = n.advertiseService("add_two_ints", AddCallback);
// 循环等待回调函数
ROS_INFO("Ready to add two ints.");
ros::spin();
return 0;
}
编译完成就可以运行啦!
边栏推荐
猜你喜欢
VTK:Could not locate vtkTextRenderer object.
Principle analysis of famous website msdn.itellyou.cn
二进制转换成十六进制、位运算、结构体
Sqlite column A data is copied to column B
unicloud cloud development record
Global scope and function scope in js
VTK环境配置
MySql to create data tables
For penetration testing methods where the output point is a timestamp (take Oracle database as an example)
flutter arr dependencies
随机推荐
Chinese garbled solution in UTF-8 environment in Powershell
微信小程序启动优化
通信原理——纠错编码 | 汉明码(海明码)手算详解
Sqlite column A data is copied to column B
安装Multisim出现 No software will be installed or removed解决方法
二进制转换成十六进制、位运算、结构体
Flow control statement in js
The feign call fails, JSON parse error Illegal character ((CTRL-CHAR, code 31)) only regular white space (r
podspec 校验依赖出错问题 pod lib lint ,需要指定源
Understanding of objects and functions in js
VS2017连接MYSQL
著名网站msdn.itellyou.cn原理分析
Attention based ASR(LAS)
Markdown 帮助文档
A simple bash to powershell case
quick-3.5 无法正常显示有混合纹理的csb文件
cocos2d-x-3.2创建项目方法
360 加固 file path not exists.
js中的break与continue退出
unicloud 云开发记录