【ROS教程】服务通信

@TOC


1.流程

服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。在ROS中,实现服务通信只需要如下几步:

  1. 确定客户端发送的请求的数据类型和服务端响应的数据类型需要自定义.srv文件,修改好CMakeLists.txt文件和package.xml文件并重编译

  2. 编写发布方和订阅方的cpp文件,修改好CMakeLists.txt文件并重编译

  3. 分别启动发布方节点和订阅方节点,必须先启动服务端再启动客户端

2.自定义请求和响应的数据

2.1 std_msgs内置类型

  • 内置类型与 C++ 和 Python 中的对应关系:

Primitive Type
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 中的对应关系:

Primitive Type
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.效果

最后更新于

这有帮助吗?