当前位置: 首页 > ops >正文

【ROS2】通信部署概述(以话题(Topic)通信为例)

写在前面

很多内容参考了赵虚左老师的ROS2教程

概念说明

工作空间:相当于一个项目,比如一台机械臂,或者一个机器人
功能包:相当于一个项目中的一台设备,如电机、雷达、相机等

大概构建流程

以话题通信机制为例

  1. 创建工作空间与功能包
    • 创建一个ROS2工作空间(如~/ros2_ws),并在src目录下创建功能包(例如demo_nodes_cpp):
      ros2 pkg create your_topic_name --build-type ament_cmake --dependencies rclcpp std_msgs base_interfaces_demo
      

指令解析:
该命令的作用是创建一个名为 your_topic_name 的 ROS2 功能包,具体行为如下:

  1. 创建功能包框架
    - 生成一个名为 your_topic_name 的文件夹,包含 ROS2 功能包的标准结构:
	     your_topic_name/├── CMakeLists.txt        # CMake 构建配置├── package.xml           # 包的元数据(名称、依赖、版本等)├── include/              # 头文件目录(可选)└── src/                  # 源代码目录(用户需手动添加代码)
  1. 指定构建系统 (--build-type ament_cmake)
    - 使用 ament_cmake 作为构建工具,表明这是一个 C++ 项目
    - 自动生成适配 ROS2 的 CMakeLists.txt 文件,包含 ROS2 的构建规则(如查找依赖、安装节点等)。
  2. 声明依赖 (--dependencies ...)
    自动在 package.xml 中添加以下依赖项:
    - rclcpp: ROS2 的 C++ 客户端库,用于编写节点。
    - std_msgs: ROS2 标准消息类型(如 Int32, String 等)。
    - base_interfaces_demo: 用户自定义的接口包(假设是自定义的 .msg/.srv 文件)。
    - 如果不需要自定义接口,在使用指令时,不要添加base_interfaces_demo,否则会产生依赖错误(或者手动在cmakelist中删除find_package(base_interfaces_demo REQUIRED))
  3. 自动配置 package.xml
    - 填充包的元信息(名称、描述、许可证等,部分字段需用户手动补充)。
    - 在 <depend>...</depend> 标签中写入指定的依赖项。
  4. 生成适配 ROS2 的 CMakeLists.txt
    - 自动包含 find_package() 指令,用于查找依赖的 ROS2 包(如 rclcpp)。
    - 提供模板供用户添加自己的可执行文件和库。

这一步一定一定要注意路径,功能包要放在xxx_ws/src目录下,否则在最后运行时会找不到节点或功能包


  1. 编写发布者节点A

  2. 编写订阅者节点B

  3. 配置构建系统

    • 修改CMakeLists.txt,添加可执行文件和依赖项,具体实现看这篇博客

    • package.xml中添加依赖,该文件的配置相对简单,关注标签即可,例如:

         <depend>rclcpp</depend><depend>std_msgs</depend>```
    

5. 编译与运行

  • 编译功能包:
    colcon build --packages-select demo_nodes_cpp
    source install/setup.bash
    
  • 启动两个终端分别运行节点A和节点B:
    # 终端1运行发布者节点A
    ros2 run demo_nodes_cpp publisher_node# 终端2运行订阅者节点B
    ros2 run demo_nodes_cpp subscriber_node
    
  • 节点B将输出接收到的消息(如Received: Hello from Node A)。

关键点说明

  • 话题通信:节点A通过create_publisher发布消息到指定话题(如message_topic),节点B通过create_subscription订阅同一话题并处理数据。
  • 消息类型:示例使用标准消息类型std_msgs::msg::String,可根据需求自定义消息结构。
  • 节点命名:节点A和B需具有唯一名称(如node_anode_b),避免冲突。
http://www.xdnf.cn/news/5696.html

相关文章:

  • The 2024 Sichuan Provincial Collegiate Programming Contest部分题解(L,H,E,B,I)
  • vue H5解决安卓手机软键盘弹出,页面高度被顶起
  • 连接词化归律详解
  • Linux系统管理与编程19:自动部署dns
  • 十二、操作符重载
  • 多媒体预研
  • 基于STM32、HAL库的BME680气压传感器 驱动程序设计
  • 如何找正常运行虚拟机
  • 【Kubernetes】初识基础理论(第一篇)
  • OSCP - Hack The Box - Sau
  • 【面试真题】王者荣耀亿级排行榜,如何设计?
  • 项目售后服务承诺书,软件售后服务方案,软件安装文档,操作文档,维护文档(Word原件)
  • MySQL性能调优探秘:我的实战笔记 (下篇:深入内核、锁与监控)
  • java反序列化commons-collections链1
  • 如何使用 WMIC 命令在 Windows 11 或 10 上卸载软件
  • 每周靶点分享:CD20、GIPR及文献分享
  • el-table滚动条,都悬浮在页面的底层显示,表格吸底滚动条效果
  • bootstrap自助(抽样)法
  • 机器学习实战:归一化与标准化的选择指南
  • Spring Boot 参数验证
  • 【TTS学习笔记】:语音合成领域基本术语
  • 关系型数据库和非关系型数据库
  • Redis数据类型
  • 结合 GWAS 和 TWAS 鉴定玉米籽粒中生育色醇水平的候选致病基因
  • Java Spring Boot项目目录规范示例
  • 【Python训练营打卡】day23 @浙大疏锦行
  • 基于Backtrader库的实时回测与模拟交易策略实战
  • day06_java中的流程控制语句
  • Milvus 2.4 使用详解:从零构建向量数据库并实现搜索功能(Python 实战)
  • 力扣-138.随机链表的复制