【ROS教程】话题通信

@TOC


1.流程

话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。在ROS中,实现话题通信只需要如下几步:

  1. 确定要发布的数据类型,一般都需要自定义.msg文件,修改好CMakeLists.txt文件和package.xml文件并重编译

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

  3. 分别启动发布方节点和订阅方节点,顺序无所谓

2.自定义发布数据

在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型。但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据, std_msgs 由于描述性较差而显得力不从心,这种场景下必须通过编写.msg文件来自定义消息类型。

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 编写.msg文件

示例如下:

2.3 修改package.xml文件

  • 查看是否存在如下编译依赖

  • 查看是否存在如下执行依赖

2.3.1 完整的package.xml文件

2.4 修改CMakeLists.txt文件

2.4.1 修改find_package指令

2.4.2 添加add_message_files指令

2.4.3 添加generate_messages指令

2.4.4 修改catkin_package指令

其中,add_message_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.2.4 完整的CMakeLists.txt

  • 其中很多语句都是catkin_make自动生成的

3.3 发布方cpp

示例如下:

3.4 订阅方cpp

示例如下:

4.效果

在这里插入图片描述
  • 如果找不到可执行文件,就把工作目录下的build文件夹和devel文件夹删了重新编译。

最后更新于

这有帮助吗?