【ROS教程】服务通信
@TOC
1.流程
服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。在ROS中,实现服务通信只需要如下几步:
确定客户端发送的请求的数据类型和服务端响应的数据类型,需要自定义.srv文件,修改好CMakeLists.txt文件和package.xml文件并重编译
编写发布方和订阅方的cpp文件,修改好CMakeLists.txt文件并重编译
分别启动发布方节点和订阅方节点,必须先启动服务端再启动客户端
2.自定义请求和响应的数据
2.1 std_msgs内置类型
内置类型与 C++ 和 Python 中的对应关系:
bool
uint8_t
bool
int8
int8_t
int
uint8
uint8_t
int
int16
int16_t
int
uint16
uint16_t
int
int32
uint32_t
int
uint64
uint64_t
long int
float32
float
float
float64
double
float
string
std::string
str bytes
time
ros::Time
rospy.Time
duration
ros::Duration
rospy.Duration
内置类型的数组与 C++ 和 Python 中的对应关系:
variable-length
std::vector
tuple
fixed-length
boost::array<T, length>或std::vector
tuple
2.2 编写.srv文件
示例如下:
中间的三横用以区分请求数据和响应数据
2.3 修改package.xml文件
查看是否存在如下编译依赖
查看是否存在如下执行依赖
2.4 修改CMakeLists.txt文件
2.4.1 修改find_package指令
2.4.2 添加add_message_files指令
2.4.3 添加generate_messages指令
其中,add_service_files指令必须要在generate_messages指令的前面,然后在工作空间目录编译即可。
2.5 查看头文件
经过以上几步,在${workspace}/devel/include/${package}/目录下应该会出现头文件:
如果没有出现,是无法进行接下来的步骤的。这时,只需要把
${workspace}/目录下的build目录和devel目录全部删除,然后重新编译即可。
3.编写cpp文件
3.1 功能包目录文件树
3.2 修改CMakeLists.txt文件
3.2.1 添加add_executable指令
3.2.2 添加add_dependencies指令
3.2.3 添加target_link_libraries指令
3.3 服务端cpp
示例如下:
创建服务对象时的回调函数的返回值必须是布尔类型
3.4 客户端cpp
示例如下:
4.效果
最后更新于
这有帮助吗?