1、目錄結構
在 ROS 2 包中,launch
、urdf
、rviz
(通常指 RViz 配置文件)、config
?等文件夾應直接放在包的根目錄下(與?robot_arm/
?Python 模塊目錄同級)。這是 ROS 2 社區的通用約定,便于工具(如?ros2 launch
、rviz2
)自動查找資源。
推薦目錄結構
ros2_ws/src/robot_arm/
├── config/ # 配置文件(如 YAML 參數、控制器配置)
├── launch/ # Launch 文件(.launch.py 或 .xml)
├── rviz/ # RViz 配置文件(.rviz)
├── urdf/ # URDF/XACRO 機器人模型文件
├── robot_arm/ # Python 模塊目錄(核心代碼)
│ ├── __init__.py
│ └── robot_arm.py # 主節點
├── package.xml
├── setup.py
└── ... # 其他默認文件
編譯后install結構:
ros2_ws/install/
├── robot_arm/ # 與包同名的根目錄
│ ├── lib/ # 存放編譯生成的庫和可執行文件
│ │ ├── python3.10/ # Python 模塊目錄(Python 版本可能不同)
│ │ │ └── site-packages/
│ │ │ └── robot_arm/ # Python 模塊代碼(與包同名)
│ │ │ ├── __init__.py
│ │ │ └── robot_arm.py # 節點入口文件
│ │ └── robot_arm/ # C++ 可執行文件(如果存在)
│ │ └── robot_arm_node # C++ 編譯生成的可執行文件
│ ├── share/ # 存放資源文件和配置
│ │ ├── robot_arm/ # 包資源目錄
│ │ │ ├── config/ # 配置文件(如 YAML 參數)
│ │ │ │ └── robot_params.yaml
│ │ │ ├── launch/ # Launch 文件
│ │ │ │ └── arm_control.launch.py
│ │ │ ├── rviz/ # RViz 配置文件
│ │ │ │ └── arm_display.rviz
│ │ │ └── urdf/ # URDF/XACRO 文件
│ │ │ └── robot_arm.urdf.xacro
│ │ └── ament_cmake_core/ # CMake 構建元數據(自動生成)
│ └── setup.bash # 環境變量腳本(局部生效)
├── setup.bash # 全局環境變量腳本(激活工作空間)
└── local_setup.bash # 局部環境變量腳本(僅當前包)
2、編譯:
colcon build --packages-select robot_arm --symlink-install
--packages-select? 只編譯更新指定的包,并將編譯結果保存到install文件夾中
--symlink-install
是可選但推薦的,它會創建符號鏈接,修改 Python 文件后無需重新構建。
開發建議:如何讓修改立即生效?
方式 1(推薦開發時使用):使用?--symlink-install
第一次構建時使用:
colcon build --symlink-install
效果:
install/robot_arm/share/robot_arm/launch/display.launch.py
?會是一個符號鏈接(symlink),指向?src/robot_arm/robot_arm/launch/display.launch.py
- 你修改?
src
?中的文件,install
?中的內容自動更新 - 無需每次?
colcon build
,改完就能運行
ROS 2 不會自動安裝?rviz/
、launch/
、urdf/
?等目錄下的文件!
即使你用了 --symlink-install
,也必須通過 setup.py
明確告訴 ROS 2 哪些文件需要安裝。
否則,colcon build
只會安裝 Python 包、可執行腳本等默認內容,而不會安裝 rviz/
、launch/
、meshes/
等資源文件。
正確解決方案:修改?setup.py
你需要編輯你的 robot_arm
包中的 setup.py
文件,添加 data_files
配置,告訴 colcon
把 rviz/
、launch/
、urdf/
、meshes/
等目錄復制到 install/
。
3、清理
colcon clean workspace
4、檢查
# 檢查 rviz 文件是否存在
ls $(ros2 pkg prefix robot_arm)/share/robot_arm/rviz/robot_arm.rviz# 檢查是否是符號鏈接,且指向 src
ls -l $(ros2 pkg prefix robot_arm)/share/robot_arm/rviz/robot_arm.rviz