welcom ! Handel home

2025年2月3日 星期一

ROS 工作空間 (Workspace)、套件 (Package)、節點 (Node) 架構專案目錄介紹

 

ROS 工作空間 (Workspace)、套件 (Package)、節點 (Node) 架構與專案目錄介紹

ROS (Robot Operating System) 中,開發環境遵循一個標準的層級架構,主要由 Workspace(工作空間)、Package(套件)、Node(節點)等組成,並且依照特定的目錄結構來組織程式碼。


1. ROS 工作空間 (Workspace)

工作空間 是 ROS 專案的根目錄,包含所有 ROS 程式碼與設定檔。通常使用 Catkin (ROS1) 或 Colcon (ROS2) 來管理工作空間。

典型 ROS1 工作空間結構

bash
my_ros_workspace/ # 工作空間名稱 (可自訂) │── src/ # 原始碼目錄 (存放 ROS 套件) │ ├── package_1/ │ ├── package_2/ │ ├── CMakeLists.txt -> /opt/ros/noetic/share/catkin/cmake/toplevel.cmake │── build/ # 建置 (compile) 目錄 │── devel/ # 開發環境 (包含編譯後的執行檔與設定) │── install/ # 安裝目錄 (用於佈署套件)

📌 常見指令

  • catkin_make:編譯工作空間
  • source devel/setup.bash:設定環境變數

典型 ROS2 工作空間結構

bash
my_ros2_workspace/ │── src/ # 原始碼 (存放 ROS2 套件) │ ├── package_1/ │ ├── package_2/ │── build/ # 建置目錄 │── install/ # 安裝後的目錄 │── log/ # 記錄 Log 資訊

📌 常見指令

  • colcon build:編譯工作空間
  • source install/setup.bash:設定環境變數

2. ROS 套件 (Package)

套件 (Package) 是 ROS 中的基本單位,所有的程式碼、節點、訊息 (Message)、服務 (Service)、動作 (Action) 等都在套件內。

典型 ROS1 套件結構

bash
my_ros_package/ │── CMakeLists.txt # CMake 設定檔 │── package.xml # ROS 套件描述檔 (包含依賴資訊) │── src/ # 存放程式碼 (C++ / Python) │── scripts/ # Python 執行檔 │── include/ # C++ 標頭檔 │── launch/ # 啟動檔 (.launch, 用於啟動多個節點) │── msg/ # 訊息類型 (.msg) │── srv/ # 服務類型 (.srv) │── config/ # 設定檔 (YAML 或 JSON)

📌 建立 ROS1 套件

bash
cd ~/my_ros_workspace/src catkin_create_pkg my_ros_package std_msgs rospy roscpp

📌 編譯

bash
cd ~/my_ros_workspace catkin_make

典型 ROS2 套件結構

bash
my_ros2_package/ │── CMakeLists.txt # CMake 設定檔 │── package.xml # ROS2 套件描述檔 │── src/ # 程式碼 (C++ / Python) │── include/ # C++ 標頭檔 │── launch/ # 啟動檔 (.py 格式) │── msg/ # 訊息類型 │── srv/ # 服務類型 │── config/ # 設定檔 (YAML) │── tests/ # 測試程式

📌 建立 ROS2 套件

bash
cd ~/my_ros2_workspace/src ros2 pkg create --build-type ament_cmake my_ros2_package

📌 編譯

bash
cd ~/my_ros2_workspace colcon build

3. ROS 節點 (Node)

節點 (Node) 是 ROS 中的執行單位,每個節點負責處理不同的功能,如感測、控制、影像處理等。

ROS1 C++ 節點範例

檔案:src/my_node.cpp

cpp
#include "ros/ros.h" int main(int argc, char **argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; ROS_INFO("Hello from my_node!"); ros::spin(); return 0; }

📌 編譯與執行

bash
catkin_make rosrun my_ros_package my_node

ROS2 Python 節點範例

檔案:src/my_node.py

python
import rclpy from rclpy.node import Node class MyNode(Node): def __init__(self): super().__init__('my_node') self.get_logger().info('Hello from my_node!') def main(args=None): rclpy.init(args=args) node = MyNode() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

📌 執行

bash
ros2 run my_ros2_package my_node

4. 其他重要 ROS 元件

(1) 訊息 (Message)

ROS 透過 Message 在節點間通訊。使用 .msg 定義自訂訊息格式。

📌 建立訊息格式

bash
mkdir -p my_ros_package/msg echo "int32 num" > my_ros_package/msg/Num.msg

📌 修改 CMakeLists.txt

cmake
add_message_files( FILES Num.msg ) generate_messages()

(2) 服務 (Service)

Service 允許節點進行同步請求/回應。

📌 建立 .srv

bash
mkdir -p my_ros_package/srv echo "int32 a\nint32 b\n---\nint32 sum" > my_ros_package/srv/AddTwoInts.srv

📌 修改 CMakeLists.txt

cmake
add_service_files( FILES AddTwoInts.srv ) generate_messages()

(3) 啟動檔 (Launch File)

啟動檔讓我們可以一次啟動多個節點。

📌 ROS1 .launch 範例

xml
<launch> <node pkg="my_ros_package" type="my_node" name="my_node" output="screen"/> </launch>

📌 執行

bash
roslaunch my_ros_package my_launch_file.launch

📌 ROS2 .py 啟動檔

python
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='my_ros2_package', executable='my_node', name='my_node', output='screen' ) ])

📌 執行

bash
ros2 launch my_ros2_package my_launch_file.py

結論

ROS 專案的開發架構主要由 工作空間 (Workspace)套件 (Package)節點 (Node) 所組成,並透過 Message、Service、Launch Files 來管理節點間的通訊與執行流程。掌握這些基本概念能夠更有效地開發與維護 ROS 專案 🚀

沒有留言: