ROS学习——通信机制(话题通信④—自定义msg)

该教程详细讲解了在ROS中如何创建和使用自定义消息(msg)。首先,通过定义msg文件,包括创建Person.msg文件并设置字段。接着,配置编译过程,依赖message_generation并修改CMakeLists.txt文件。然后,分别展示了如何编写发布和订阅节点的C++代码,发布节点以10Hz频率发送自定义消息,订阅节点接收并打印消息内容。最后,提到了编译和运行订阅节点的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 052话题通信_自定义msg_实现_Chapter2-ROS通信机制_哔哩哔哩_bilibili

 2.1.4 话题通信自定义msg · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

一、自定义msg实现

需求:创建自定义消息,该消息包含人的信息:姓名、身高、年龄等。

1.定义msg文件 

(1)新建msg文件夹,再创建Person.msg文件

注意:在plumbing_pub_sub文件下新建

(2)设置字段

 (3)配置

 ②编译功能包,需要依赖message_generation

 ③放开注释( 取消多行注释:Ctrl+K+U)

 更改为: 这个实现意味着我们要编译message目录下的Person.msg文件;

④放开注释,意味着如果要编译generate_messages需要依赖std_msgs

⑤ 放开注释,添加

 这里的catkin_package是和find_package对应,

 find_package意思是如果编译自定义的功能包(plumbing_pub_sub),必须依赖于find_package里面的包,而这些包又依赖于catkin_package里面的功能包;

可以将 find_package理解为编译时依赖,catkin_package理解为运行时依赖;

(4)编译(ctrl+shift+B)

编译成功后会生成一些中间文件

 二、自定义msg使用( C++)

需求:

编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布自定义消息,订阅方订阅自定义消息并将消息内容打印输出

流程:

  1. 按照固定格式创建 msg 文件
  2. 编辑配置文件
  3. 编译生成可以被 Python 或 C++ 调用的中间文件

1.vscode配置

 

 12行可对照上行修改为:

 记得加逗号与上行隔开

2.发布方实现

(1)新建文件demo03_pub_person.cpp

(2)添加头文件

(3)初始化ros节点

 banZhuRen——节点名称

(4)创建节点句柄

(5)创建发布者对象

 liaoTian——话题名称

(6)发布逻辑

①创建被发布数据

 中文输出需要添加该函数:

②设置发布频率

③循环发布数据

 (7)配置


 映射名最好和原文件名一致

 ②

③ 

更改为:

 第一个参数是原文件映射名称;

(8)编译

(9)测试

①启动roscore

②再开终端,发布节点

③ 打印

注意不能直接如下操作:

 因为打印的消息类型是person类型,在当前命令行找不到,必须进入工作空间

④结果

 (10)输出打印优化

 重新编译,结果:

 三、订阅方实现

1.新建文件

 2.订阅方和发布方对比

 (1) 代码

/*
    需求: 订阅人的信息

*/

#include "ros/ros.h"
#include "demo02_talker_listener/Person.h"

void doPerson(const demo02_talker_listener::Person::ConstPtr& person_p){
    ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height);
}

int main(int argc, char *argv[])
{   
    setlocale(LC_ALL,"");

    //1.初始化 ROS 节点
    ros::init(argc,argv,"listener_person");
    //2.创建 ROS 句柄
    ros::NodeHandle nh;
    //3.创建订阅对象
    ros::Subscriber sub = nh.subscribe<demo02_talker_listener::Person>("chatter_person",10,doPerson);

    //4.回调函数中处理 person

    //5.ros::spin();
    ros::spin();    
    return 0;
}

(2)配置

需要添加 add_dependencies 用以设置所依赖的消息相关的中间文件。

add_executable(person_talker src/person_talker.cpp)
add_executable(person_listener src/person_listener.cpp)



add_dependencies(person_talker ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(person_listener ${PROJECT_NAME}_generate_messages_cpp)


target_link_libraries(person_talker
  ${catkin_LIBRARIES}
)
target_link_libraries(person_listener
  ${catkin_LIBRARIES}
)

(3)编译,运行

  • 启动 roscore;
  • 启动发布节点;
  • 启动订阅节点。
  • PS:可以使用 rqt_graph 查看节点关系。
### ROS1与ROS2之间的通信方式 尽管ROS1和ROS2的设计目标相似,但由于两者底层架构的不同(如消息传递协议、编译系统等),它们无法直接相互通信。然而,为了满足实际应用中的需求,社区提出了几种互操作方案。 #### 方案一:桥接工具 `ros1_bridge` `ros1_bridge` 是一种常用的解决方案,用于在ROS1和ROS2之间建立桥梁[^1]。它允许开发者在同一网络环境中运行ROS1和ROS2节点,并使这些节点能够互相通信。以下是其实现原理: - `ros1_bridge` 提供了一个双向的消息转换机制,能够在ROS1和ROS2之间自动映射并传输消息。 - 它依赖于共享的 `.msg` 文件定义,确保两种框架下的消息格式一致。 - 开发者需要分别在ROS1和ROS2端启动对应的节点,并配置好网络环境以便两者的Master和服务发现功能正常工作[^4]。 ```bash # 在ROS1端启动bridge rosrun ros1_bridge dynamic_bridge # 或者,在ROS2端启动bridge ros2 run ros1_bridge dynamic_bridge --bridge-all-topics ``` 这种方案的优点在于简单易用,适合快速原型设计阶段;缺点则是性能开销较大,尤其是在高频率或大数据量的情况下可能成为瓶颈。 #### 方案二:基于DDS的自定义网关 由于ROS2使用了DDS作为其核心通信层,理论上可以通过构建一个专门的DDS客户端来充当中介角色,从而实现与ROS1系统的对接[^2]。具体做法如下: - 创建一个新的应用程序或者库文件,该程序同时实现了对标准ROS API的支持以及针对特定DDS供应商API的操作接口。 - 将此组件部署至靠近物理硬件的位置,这样既可以减少延迟又能提高可靠性。 需要注意的是,这种方法要求较高的技术门槛,并且维护成本也相对较高,因此通常只适用于那些对于实时性和稳定性有特殊要求的应用场景。 #### 方案三:RESTful Web Services 另一种替代方法是利用HTTP REST风格的服务暴露各自的功能模块给对方调用[^3]。这种方式不涉及复杂的跨平台集成问题,只需保证双方都支持常见的Web协议即可完成交互过程。 例如,可以开发一套轻量级服务器脚本,把来自一方的数据封装成JSON对象并通过GET/POST请求发送出去;接收方则解析收到的内容后再做进一步处理。 虽然这种方法较为通用但也存在局限性——比如带宽消耗较多、难以同步更新状态变化等问题都需要额外考虑进去。 --- ### 实际案例分析 假设有一个项目需要用到视觉识别算法(由团队A负责,偏好使用稳定成熟的ROS1)同时也希望接入最新版SLAM算法成果(出自团队B手中,已经迁移到了ROS2之上)。那么就可以按照上面提到的第一种办法搭建起一座临时性的沟通渠道:先让两边各自的计算单元保持独立运作态势不变的前提下引入第三方软件包即`ros1_bridge`,再经过适当调整参数设定之后便能顺利达成预期效果啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小老大MUTA️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值