welcom ! Handel home

2025年2月17日 星期一

OS 2 中,建立自定義包(package)和節點(node)

 在 ROS 2 中,建立自定義包(package)和節點(node)是一個重要的步驟。以下是逐步操作示例:

步骤 1:建立工作區

假設你已經按照之前的指南創建了工作區,並將其命名為 my_ros2_ws

bash
mkdir -p ~/ros2_workspaces/my_ros2_ws/src
cd ~/ros2_workspaces/my_ros2_ws/

步骤 2:創建新包

ROS 使用一個工具來幫助快速生成基本的套件結構。你可以使用 ament 工具來創建一個新的包:

bash
source /opt/ros/<distro>/setup.bash # 替換 <distro> 為你的 ROS 版本,例如 humble
cd ~/ros2_workspaces/my_ros2_ws/src
ament init .
ament new my_package --build-type ament_python

這會在 src 目錄下創建一個名為 my_package 的包。這裡我使用了 ament_python 建構類型,意味著此套件將以 Python 編寫。

步骤 3:創建新節點

my_package 中加入一個簡單的節點。首先,打開 src/my_package/package.xmlsrc/my_package/setup.py 來確認基本設置。

接下來,在 src/my_package/src/ 目錄中創建一個新文件:

bash
cd src/my_package/src/
touch my_node.py

my_node.py 中添加以下程式碼以實現一個簡單的節點,該節點會連續打印訊息:

python
import rclpy
from rclpy.node import Node

class MyNode(Node):
def __init__(self):
super().__init__('my_node')
self.timer = self.create_timer(1.0, self.timer_callback)

def timer_callback(self):
self.get_logger().info('Hello ROS 2!')

def main(args=None):
rclpy.init(args=args)
my_node = MyNode()
try:
rclpy.spin(my_node)
except KeyboardInterrupt:
pass

# 停止節點
my_node.destroy_node()
rclpy.shutdown()

if __name__ == '__main__':
main()

步骤 4:構建和測試包

返回工作區根目錄:

bash
cd ~/ros2_workspaces/my_ros2_ws/
colcon build --packages-select my_package
source install/setup.bash

接著,可以運行你剛才創建的節點:

bash
ros2 run my_package my_node

驗證

在另一個終端中,來源工作區,然後執行以下命令以查看輸出訊息:

bash
source ~/ros2_workspaces/my_ros2_ws/install/setup.bash
ros2 topic list # 查看可用的主題(應該是空的)
ros2 run my_package my_node

你應該能在另一個終端中看到:

plaintext
[INFO] [my_node]: Hello ROS 2!

注意事項

  • 包和節點命名規則 :ROS 的包和節點應該使用簡單的、有意義的名稱,通常是小寫字母加下劃線。

  • 依賴管理 :如果你的套件有其他依賴,需要在 package.xmlsetup.py 中進行相應配置。

  • 調試和日誌記錄 :ROS 2 提供了豐富的工具用於調試和日誌記錄,如 rclpy.logging.add_logger_level() 可以增加日誌級別。

這是一個簡單範例,但它涵蓋了 ROS 2 創建套件和基本節點的核心步驟。在此基礎上,你可以開始構建更加複雜的功能,如主題通信、服務呼叫等。

沒有留言: