news 2026/5/13 4:05:05

Day3:拆箱ROS2|一起搭建机器人开发车间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day3:拆箱ROS2|一起搭建机器人开发车间

Day1:一起学习了ros2是什么以及ros2为机器人开发提供了哪些核心功能.
Day2一起安装了ros2。
接下来自然会想到如果现在要用ROS2开发一个机器人,应该怎样开始?
下面我们以雷达小车机器人举例说明:

1、需要为机器人创建一个【工作空间】作为顶层容器,统一管理雷达小车所有代码资源

(1)【工作空间】功能说明

  • 项目隔离:为雷达小车创建专属工作空间,避免与其他机器人系统冲突
  • 集中构建:将所有相关功能包集中管理(如雷达驱动、运动控制、导航)。通过colcon统一编译传感器驱动、控制算法、导航模块等关联功能包
  • 环境管理:install/setup.bash激活后,所有功能包和节点可直接调用

(2)具体操作

创建名为 “XXXX” 的工作空间

mkdir-pXXXX/src 例如:mkdir-pxiyue_robot/src

(3)特殊说明:


/src里面存放功能包及源码

2、根据机器人的模块设计在工作空间中创建【功能包】模块化封装雷达小车的功能单元

(1)【功能包】功能说明:

功能解耦(雷达小车典型划分):

  • 雷达驱动包:处理雷达数据采集
  • 运动控制包:控制电机和底盘
  • 导航包:路径规划与避障
  • 机器人模型包:URDF描述与传感器配置
  • 接口标准化:通过package.xml声明依赖关系(如雷达驱动依赖sensor_msgs)
    独立开发:每个功能包可单独编译测试

(2)具体操作:

进入src目录

cdXXXX/src ros2 pkg create XXXXX --build-type ament_python 例如:cdxiyue_robot/src ros2 pkg create firstpkg --build-type ament_python

避坑手记:功能包需要在src目录下创建。创建的时候可以选择python的包或者c++的

(3)特殊说明:

创建功能包后新增了一些文件夹和文件,看看都有什么用:

a. 新增文件夹:src/<package_name>/<package_name>
代码目录:存放Python模块代码,目录名与功能包名一致。包含:

  • init.py:标识该目录为Python包。
  • 业务代码文件

    b. 新增文件夹:resource/<package_name>
    资源文件:存放配置文件(YAML)、模型、图标等非代码资源。

    c. 新增文件夹:test/
    测试脚本:包含代码质量检查工具(如test_flake8.py检查代码风格,test_pep257.py检查文档字符串),确保代码符合ROS2规范。

    d. 新增文件:package.xml
  • 元数据描述:定义包名、版本、作者、维护者、许可证等基础信息。
  • 依赖声明:通过标签声明运行时依赖(如rclpy、std_msgs),<build_depend>声明编译依赖,<test_depend>声明测试依赖

    e. 新增文件:setup.py
  • 安装配置:定义Python包的安装规则,通过setuptools管理。
  • 入口点(entry_points):将Python代码映射为可执行命令。例如:

    可执行文件名字为demo_node,功能包名demo_pkg,源代码python文件名字demo_node。后续运行ros2 run demo_pkg demo_node时候就是运行可执行文件里面的main函数
  • 依赖管理:通过install_requires声明Python依赖
    避坑手记:可执行文件的名字可以随便起可以和.py文件名字不一样。

    f. 新增文件:setup.cfg
  • 路径配置:指定可执行文件的安装路径,确保ros2 run能定位到命令。
    避坑手记:Install_scripts这句是明确可执行文件的安装路径。当使用colcon build构建功能包时,setup.cfg的路径配置会被ament_python构建工具解析,将可执行文件和库安装到install目录下的指定位置

3、在功能包中根据要实现的功能创建【python】可执行文件

(1)具体操作:

在功能包同名文件夹下创建XXXX.py文件(可以下载个vscode创建或者用命令行)

例如sudonanofirst.py

避坑手记:创建之前要进入src/<package_name>/<package_name>目录下然后创建

4、在python文件中创建【节点】并运行。

(1)【节点】功能说明:

  • 单一职责原则:每个节点负责自己的单一任务
  • 通信拓扑设计:话题、服务、动作、参数

(2)具体操作:

a. 在python文件中写入程序(节点通过rclcpp库创建)
例如:

importrclpyfromrclpy.nodeimportNodeclassfirstNode(Node):def__init__(self):super().__init__('first_node')self.get_logger().info('Hello ROS2 World!')defmain(args=None):rclpy.init(args=args)node=firstNode()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if__name__=='__main__':main()

b. 添加依赖声明
例如:

修改 firstpkg/package.xml:<depend>rclpy</depend>

c. 配置安装脚本
例如:

修改 firstpkg/setup.py:'firstexe = firstpkg .first:main',

d. 编译功能包
例如:

cdxiyue_robot#假如没有colcon需要单独安装一下sudoaptinstallpython3-colcon-build-common-extensions#编译colcon build

避坑手记:colcon build 是 ROS 2 的核心构建工具,编译的核心作用是将源代码转化为可执行程序、库和配置文件,并管理依赖关系与环境配置。编译的时候必须在工作空间文件夹下执行,不可以在src目录下。编译前记得修改package.xml添加依赖,修改setup.py添加可执行文件。

e. 修改环境变量
例如:

sourceinstall/setup.bash

避坑手记:每一个打开的新终端都需要执行这条命令,才可以成功使用ros2 run否则会报错
f. 启动可执行文件
例如:

ros2 run firstpkg firstexe

(3)特殊说明:

编译后,新增了一些文件夹和文件,看看都有什么用:

a. 新增文件夹build

  • 存放中间构建文件,如对象文件(.o)、CMake 缓存、编译日志等。每个包有独立子目录(如 build/your_package),用于加速后续构建。

    b. 新增文件夹log
  • 存储构建日志,包含错误、警告和进度信息,每个构建生成独立子目录(如 log/build_<时间戳>)

    c. 新增文件夹Install:
  • 存放最终输出文件,包括可执行文件、库(.so/.dll)、头文件、配置文件等。

    d. 新增一个轻量级的启动脚本,路径为 install/<包名>/lib/<包名>/<setup.py中写的可执行文件名>
  • 定位 Python 解释器和关联的包路径。
  • 调用目标函数(如 my_package.module:main)
  • 允许直接通过终端运行命令(无需输入 .py 后缀)

    e. 新增文件install/<包名>/lib/python3.x/site-packages/<包名>/ .py 源代码
  • ROS 2 的 Python 包需要被其他 Python 模块导入(例如在其他节点或工具中)
  • Setuptools 将包源码安装到 site-packages,这是 Python 的标准包搜索路径
    f. 新增文件setup.bash:
  • 通过 source install/setup.bash 激活环境。(setup.bash:设置整个工作空间的环境变量,适用于运行所有包)

总结:

(1)机器人设计开发流程:

a. 创建工作空间:建立代码容器
b. 创建功能包:划分模块(雷达、控制、导航)
c. 实现节点:

  • 雷达节点:发布 /scan(数据类型:sensor_msgs/LaserScan)
  • 控制节点:订阅 /cmd_vel(数据类型:geometry_msgs/Twist)
  • 导航节点:订阅/scan并发布/cmd_vel

(2)机器人关键设计原则

a. 高内聚低耦合:每个功能包只处理单一职责(如雷达驱动包不涉及运动控制)。
b. 标准化接口:使用ROS2标准消息(如LaserScan/Twist)保证模块兼容性。
c. 可扩展性:新增传感器时,只需添加新功能包(如camera_pkg),订阅已有话题。
通过工作空间组织代码→功能包划分功能→节点实现具体逻辑,雷达小车的模块化设计清晰且易于维护。

题外问题:

(1)一个功能包是否可以包含多个可执行文件?

可以
设计实例:雷达小车中的 navigation 功能包可包含:

  • path_planner(路径规划可执行文件)
  • obstacle_avoidance(避障可执行文件)
  • localization(定位可执行文件)

(2)一个可执行文件是否可以包含多个节点?

可以(但有条件)
设计实例:雷达小车的 sensor_fusion 可执行文件可同时运行:

  • 激光雷达数据处理节点
  • IMU数据处理节点
    注意事项:节点间共享同一进程内存空间,需处理线程安全问题,调试难度高于单节点单进程模式

(3)一个节点是否可以发布多个话题?

可以(常规操作)
设计实例:雷达小车的控制节点可能发布:

  • /motor_speed(电机转速指令)
  • /brake_signal(刹车信号)
  • /status_led(状态指示灯控制)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 4:03:05

虚拟机 VMDK 文件损坏怎么修复?两种官方方法一键恢复教程

在 ESXi 运维过程中&#xff0c;突然断电、存储异常、虚拟机非法关机&#xff0c;很容易导致虚拟机 VMDK 磁盘文件损坏&#xff0c;出现无法开机、磁盘挂载失败、提示 VMDK 损坏或找不到磁盘等故障&#xff0c;很多新手遇到就只能重装虚拟机。其实修复损坏 VMDK 有两种成熟可行…

作者头像 李华
网站建设 2026/5/13 4:02:06

基于Go的MCP框架:标准化AI工具集成与智能体开发实践

1. 项目概述&#xff1a;一个面向AI应用开发的MCP框架最近在折腾AI应用开发&#xff0c;特别是想把不同来源的工具和数据源整合到一个智能体&#xff08;Agent&#xff09;里&#xff0c;发现这事儿挺麻烦的。每个工具都有自己的API&#xff0c;数据格式千差万别&#xff0c;想…

作者头像 李华
网站建设 2026/5/13 4:00:09

【Prometheus】如何为 Kubernetes 集群的核心组件(API Server, etcd, Scheduler, Controller Manager)配置监控?

深度监控 Kubernetes 核心组件:从 API Server 到 etcd 的全链路可观测性 用户问题原文:“如何为 Kubernetes 集群的核心组件(API Server, etcd, Scheduler, Controller Manager)配置监控?” 本文将系统性地阐述如何对 Kubernetes 集群的“心脏”——核心控制平面组件(API…

作者头像 李华
网站建设 2026/5/13 3:58:04

Linux---开发工具(1)(vim,gcc/g++)

序言Linux下安装软件的常见方式主要有三种&#xff0c;源代码安装(下载到程序的源代码&#xff0c;自行进行编译&#xff0c;得到可执行程序)&#xff0c;rpm包安装(获取rpm安装包&#xff0c;通过rpm命令进行安装。(未解决软件的依赖关系))&#xff0c;包管理器安装。其中包管…

作者头像 李华
网站建设 2026/5/13 3:56:06

UIFO:动态可编程包调度技术的硬件实现与优化

1. UIFO&#xff1a;重新定义可编程包调度的硬件抽象在网络数据平面中&#xff0c;包调度技术如同交通信号灯系统&#xff0c;负责管理数据包的传输顺序和优先级。传统调度算法如WFQ&#xff08;加权公平队列&#xff09;和DRR&#xff08;赤字轮询&#xff09;就像固定的红绿灯…

作者头像 李华
网站建设 2026/5/13 3:53:17

深度强化学习在航天控制中的仿真到实物迁移挑战

1. 深度强化学习在航天控制领域的应用背景卫星近距离操作是航天任务中的一项关键技术挑战&#xff0c;涉及轨道交会、在轨服务、空间目标检测等多种场景。传统基于模型预测控制&#xff08;MPC&#xff09;的方法需要精确的环境动力学模型&#xff0c;而实际太空环境中存在诸多…

作者头像 李华