[具身智能-678]:ROS2 功能包 = 动态库 + 可执行节点 + launch 文件 三合一!
一、一句话终极结论
绝大多数 ROS2 功能包,既是动态链接库(.so),又是独立可执行节点(程序)。
- 动态库:给你写代码时调用(API)
- 可执行节点:直接运行就能用(开箱即用)
- launch 文件:一键启动多个节点
它们同时存在,不冲突!
二、用一张表彻底分清
| 形态 | 是什么 | 怎么用 | 例子 |
|---|---|---|---|
| 动态链接库 (.so) | 提供 API、算法、类、函数 | 你写代码#include调用 | tf2_ros,cv_bridge,nav2_core |
| 独立可执行节点 | 编译好的二进制程序 | 直接ros2 run运行 |
|
| 启动文件 (launch) | 配置脚本 | ros2 launch启动 | nav2_bringup,slam_toolbox |
三、逐包举例说明(你马上就懂)
1.tf2
- 库:
libtf2_ros.so→ 你写代码调用 - 节点:
static_transform_publisher→ 直接运行发坐标
bash
运行
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 base_link laser2.robot_localization
- 库:
librobot_localization.so→ 算法核心 - 节点:
ekf_node、ukf_node→ 直接运行定位融合
bash
运行
ros2 run robot_localization ekf_node --ros-args ...3.Nav2
- 库:
libnav2_core.so、libnav2_controller.so→ 路径规划算法 - 节点:
nav2_planner、nav2_controller、nav2_recoveries - 直接运行,不用写代码
4.cv_bridge
- 纯库:
libcv_bridge.so - 没有可执行节点,只给你代码调用
5.laser_filters
- 库:滤波算法
- 节点:
scan_to_scan_filter_chain→ 直接运行过滤激光
6.slam_toolbox
- 库:SLAM 算法
- 节点:
slam_toolbox→ 直接运行建图
7.MoveIt2
- 库:运动学、轨迹算法
- 节点:
move_group→ 直接运行控制机械臂
四、最关键的底层真相(你必须懂)
1.功能包 = 库 + 工具 + 节点
一个 ROS2 包里面:
- 有
.cpp源码 → 编译成.so 动态库 - 有
main()函数 → 编译成可执行节点 - 有
.launch.py→ 启动脚本
2.库给开发者用,节点给使用者用
- 你写算法、二次开发→ 调用.so 库
- 你直接跑功能→ 运行可执行节点
3.所有库都是动态链接库
- 所有 ROS2 功能包编译出来都是.so
- 内存共享,不浪费空间
- 你的节点程序运行时自动加载
五、最直白比喻(秒懂)
ROS2 功能包 = 手机 APP
- 动态库 = APP 的内部功能代码
- 可执行节点 = APP 图标,点开就能用
- launch = 一键打开多个 APP
你可以:
- 点开 APP 直接用(运行节点)
- 也可以在自己的程序里调用 APP 功能(链接库)
六、最终总结(背下来)
- ROS2 功能包 = 动态库 + 可执行节点 + launch
- 库:给开发者写代码调用
- 节点:直接运行,开箱即用
- 所有库都是 .so 动态链接库
- 你的节点程序既可以调用库,也可以和其他节点通信
