鱼香ROS2基本功
1. ROS 2 是什么?
ROS 2 是一套用来搭建机器人软件系统的框架和工具集合。
它名字叫 Robot Operating System,但不要把它理解成 Windows、Ubuntu 那种完整操作系统。ROS 2 是运行在 Ubuntu 上面的机器人软件平台。
机器人通常不是一个程序干所有事情,而是很多模块:
雷达程序
↓
SLAM建图
↓
定位
↓
Nav2导航
↓
底盘控制
↓
STM32
↓
电机
ROS 2 最大的价值,就是让这些不同程序可以规范地通信、组合和调试。
ROS 2 架构分为操作系统层、DDS 实现层、DDS 接口层、ROS 2 客户端层和应用层;C++/Python ROS 2 程序主要就在应用层,通过 rclcpp 或 rclpy 使用 ROS 2。
通俗的类比:
Ubuntu = 地基
ROS 2 = 机器人软件框架
你的代码 = 真正完成任务的程序
2. Node 是什么?
Node = 节点。
节点就是 ROS 2 中承担某个具体功能的程序单元。
比如机器人可以有:
/lidar_node
负责读激光雷达
/slam_node
负责建图
/navigation_node
负责导航
/base_controller
负责底盘控制
/imu_node
负责IMU
不是做一个几万行代码的“超级程序”,而是把机器人拆成很多节点。
书里的海龟例子就是两个节点:
/teleop_turtle
键盘控制节点
/turtlesim
海龟模拟器节点
键盘控制节点把命令发给海龟节点,因此你按方向键,海龟才会运动。
用 Node Graph 显示了两个节点之间的通信关系:
特别说明:节点除了发布和订阅话题,还可以使用服务、参数和动作等功能。
比如说做一个STM32 小车,可以出现一个:
/base_controller_node
它负责:
接收 /cmd_vel
↓
计算左右轮速度
↓
发给 STM32
这就是一个 Node。
查系统现在有哪些节点:
ros2 node list
查某个节点:
ros2 node info /节点名
检查自己创建的 Python/C++ 节点是否成功启动。
3. Package 是什么?
Package 中文叫:
功能包
这个概念非常重要。
Package 不是 Node。
可以这样理解:
Package
│
├── Node A
├── Node B
├── 配置文件
├── launch文件
├── 头文件
├── 参数
└── 其他资源
也就是说:
Node 是实际干活的功能单元,Package 是组织这些程序和资源的文件夹/工程单元。
功能包(Package)是 ROS 2 中组织和管理节点的工具,可以把相关节点放在同一个功能包中,方便编译、安装、分享和使用。
比如自己做:
my_robot_base/
这个 Package 里面可以有:
my_robot_base/
├── src/
│ ├── base_controller.cpp
│ └── serial_node.cpp
│
├── launch/
│ └── robot.launch.py
│
├── config/
│ └── params.yaml
│
├── CMakeLists.txt
└── package.xml
其中:
base_controller.cpp
运行后可能产生:
/base_controller
这个 Node。
所以:
.cpp是源代码 → 编译成可执行程序 → 启动以后成为 ROS 2 Node。
4. Workspace 是什么?
Workspace 中文就是:
工作空间
这是比 Package 再高一级的东西。
关系一定要记住:
Workspace
│
└── src
│
├── Package A
│ ├── Node A
│ └── Node B
│
├── Package B
│ └── Node C
│
└── Package C
大小关系:
[
Workspace > Package > Node
]
真实机器人通常由很多不同的功能模块组成,因此需要把多个功能包组织起来,Workspace 就是 ROS 2 推荐的多功能包开发组织方式。
比如可以创建:
mkdir -p ~/robot_ws/src
得到:
robot_ws/
└── src/
然后把所有自己的功能包放进去:
robot_ws/
└── src/
├── robot_base/
├── robot_description/
├── robot_bringup/
└── robot_navigation/
进入工作空间:
cd ~/robot_ws
编译:
colcon build
编译后就会出现:
robot_ws/
├── src/
├── build/
├── install/
└── log/
Workspace 例子采用的结构:src 放源码,build、install、log 由构建过程产生。
特别重要的:
source install/setup.bash
为什么?
因为你刚刚编译出来的新 Package,当前终端不一定知道它在哪里。source install/setup.bash 后,ROS 2 才能找到你的新功能包。例子也是在 colcon build 后执行这个步骤。
这两个命令以后会无数次输入:
colcon build
source install/setup.bash
这两个命令可以先眼熟。
把前四个东西一次串起来
假设以后你做自己的机器人:
robot_ws ← Workspace
│
└── src
│
├── robot_base ← Package
│ ├── base_controller ← Node
│ └── serial_bridge ← Node
│
├── robot_lidar ← Package
│ └── lidar_node ← Node
│
└── robot_navigation ← Package
└── navigation_node ← Node
所以一句口诀:
ROS 2 是整个平台,Workspace 是项目工作区,Package 是功能模块,Node 是真正运行干活的单元。
这个关系你如果记住,ROS 2 已经入门一半了。
5. Linux 基本操作到底要学哪些?
你不需要先学成 Linux 运维工程师。
从终端开始,机器人开发常用的那些操作,包括查看目录、切换目录、创建文件夹和文件、编辑、查看、删除、安装软件、环境变量等。
现在先熟练这些就够:
| 命令 | 含义 | 例子 |
|---|---|---|
pwd |
我现在在哪 | pwd |
ls |
看当前目录有什么 | ls |
cd |
切换目录 | cd ~/robot_ws |
cd .. |
回上一级 | cd .. |
cd ~ |
回用户主目录 | cd ~ |
mkdir |
创建文件夹 | mkdir test |
mkdir -p |
连续创建目录 | mkdir -p robot_ws/src |
touch |
创建空文件 | touch test.txt |
cat |
查看文本 | cat test.txt |
nano |
编辑文本 | nano test.txt |
rm |
删除文件 | rm test.txt |
rm -r |
删除目录 | rm -r test |
cp |
复制 | cp a.txt b.txt |
mv |
移动/重命名 | mv old.txt new.txt |
sudo |
管理员权限运行 | sudo apt install xxx |
apt |
安装软件 | sudo apt install git |
source |
在当前终端加载环境 | source install/setup.bash |
从 pwd → cd → ls → mkdir → touch → nano → cat → rm 这一套开始学。
现在马上可以做一个 5 分钟练习
打开 Ubuntu 终端,亲手输入:
cd ~
pwd
mkdir -p ~/ros2_test/src
cd ~/ros2_test
pwd
ls
cd src
touch hello.txt
ls
nano hello.txt
进去以后写:
hello ros2
保存退出,再:
cat hello.txt
应该显示:
hello ros2
然后:
cd ..
pwd
如果这些命令你能不看答案自己做出来,那么 Linux 基础第一关就够了。
下一步就应该正式进入 Node → Topic。其中 Topic 是最关键的,因为你以后会直接看到:
Nav2
│
│ /cmd_vel
▼
底盘节点
│
▼
STM32
这正是 ROS 2 真正开始“让机器人各部分互相说话”的地方。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)