【ROS教程】话题通信
@TOC
1.流程
话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。在ROS中,实现话题通信只需要如下几步:
确定要发布的数据类型,一般都需要自定义.msg文件,修改好CMakeLists.txt文件和package.xml文件并重编译
编写发布方和订阅方的cpp文件,修改好CMakeLists.txt文件并重编译
分别启动发布方节点和订阅方节点,顺序无所谓
2.自定义发布数据
在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型。但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据, std_msgs 由于描述性较差而显得力不从心,这种场景下必须通过编写.msg文件来自定义消息类型。
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 编写.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文件夹删了重新编译。
最后更新于
这有帮助吗?