ROS 工作空間 (Workspace)、套件 (Package)、節點 (Node) 架構與專案目錄介紹
在 ROS (Robot Operating System) 中,開發環境遵循一個標準的層級架構,主要由 Workspace(工作空間)、Package(套件)、Node(節點)等組成,並且依照特定的目錄結構來組織程式碼。
1. ROS 工作空間 (Workspace)
工作空間 是 ROS 專案的根目錄,包含所有 ROS 程式碼與設定檔。通常使用 Catkin (ROS1) 或 Colcon (ROS2) 來管理工作空間。
典型 ROS1 工作空間結構
bashmy_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 工作空間結構
bashmy_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 套件結構
bashmy_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 套件
bashcd ~/my_ros_workspace/src
catkin_create_pkg my_ros_package std_msgs rospy roscpp
📌 編譯
bashcd ~/my_ros_workspace
catkin_make
典型 ROS2 套件結構
bashmy_ros2_package/
│── CMakeLists.txt # CMake 設定檔
│── package.xml # ROS2 套件描述檔
│── src/ # 程式碼 (C++ / Python)
│── include/ # C++ 標頭檔
│── launch/ # 啟動檔 (.py 格式)
│── msg/ # 訊息類型
│── srv/ # 服務類型
│── config/ # 設定檔 (YAML)
│── tests/ # 測試程式
📌 建立 ROS2 套件
bashcd ~/my_ros2_workspace/src
ros2 pkg create --build-type ament_cmake my_ros2_package
📌 編譯
bashcd ~/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;
}
📌 編譯與執行
bashcatkin_make rosrun my_ros_package my_node
ROS2 Python 節點範例
檔案:src/my_node.py
pythonimport 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()
📌 執行
bashros2 run my_ros2_package my_node
4. 其他重要 ROS 元件
(1) 訊息 (Message)
ROS 透過 Message 在節點間通訊。使用 .msg
定義自訂訊息格式。
📌 建立訊息格式
bashmkdir -p my_ros_package/msg
echo "int32 num" > my_ros_package/msg/Num.msg
📌 修改 CMakeLists.txt
cmakeadd_message_files( FILES Num.msg ) generate_messages()
(2) 服務 (Service)
Service 允許節點進行同步請求/回應。
📌 建立 .srv
檔
bashmkdir -p my_ros_package/srv
echo "int32 a\nint32 b\n---\nint32 sum" > my_ros_package/srv/AddTwoInts.srv
📌 修改 CMakeLists.txt
cmakeadd_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>
📌 執行
bashroslaunch my_ros_package my_launch_file.launch
📌 ROS2 .py
啟動檔
pythonfrom 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'
)
])
📌 執行
bashros2 launch my_ros2_package my_launch_file.py
結論
ROS 專案的開發架構主要由 工作空間 (Workspace)、套件 (Package)、節點 (Node) 所組成,並透過 Message、Service、Launch Files 來管理節點間的通訊與執行流程。掌握這些基本概念能夠更有效地開發與維護 ROS 專案 🚀
沒有留言:
張貼留言