welcom ! Handel home

顯示具有 ROS2 標籤的文章。 顯示所有文章
顯示具有 ROS2 標籤的文章。 顯示所有文章

2025年6月23日 星期一

ROS2 build the new package for maze world 建立迷宮套件

 


ros2 pkg create --build-type ament_cmake my_maze_world 這個命令是 ROS 2 中用來創建一個新的 ROS 2 套件 (package) 的指令。讓我來為您詳細解釋這個命令的每個部分及其用途:


命令拆解與說明

  • ros2 pkg create

    • 這是基礎命令,用於創建 ROS 2 套件。在 ROS 2 中,所有的程式碼、配置檔案、模型、啟動檔案等都被組織在套件中。這有助於模組化、重用和管理您的機器人專案。
  • --build-type ament_cmake

    • 這個參數指定了您要創建的套件的建構系統類型
    • 在 ROS 2 中,主要的建構系統有兩種:
      • ament_cmake: 這是基於 CMake 的建構系統,主要用於編譯 C++ 程式碼。它也支援處理 Python 模組、設定檔等。對於包含 C++ 節點、模型檔案、啟動檔案等,這是最常用的建構類型。
      • ament_python: 這是專為純 Python 套件設計的建構系統。如果您只打算用 Python 編寫程式碼且沒有任何 C++ 部分,可以使用這個。
    • 對於您打算在其中放置 Gazebo 模型、世界檔案和 ROS 2 啟動檔案的套件,ament_cmake正確且推薦的選擇,因為它提供了更廣泛的靈活性來管理這些資源。
  • my_maze_world

    • 這是您要創建的新套件的名稱。您可以將其替換為任何您喜歡的、有意義的名稱。
    • 命名慣例通常建議使用小寫字母和下劃線 (snake_case)。

執行這個命令會發生什麼?

當您在您的 ROS 2 工作空間的 src 目錄中執行這個命令時(例如,在 ~/ros2_ws/src),ros2 pkg create --build-type ament_cmake my_maze_world 將會:

  1. 創建一個新的目錄:在當前目錄下創建一個名為 my_maze_world 的新資料夾。
  2. 生成套件結構:在這個新資料夾內自動生成一個基本的套件結構,包括:
    • CMakeLists.txt:CMake 建構系統的主要配置檔案,用於定義如何編譯和安裝套件中的內容。
    • package.xml:套件的元資料檔案,包含套件的名稱、版本、描述、作者、維護者、以及最重要的依賴關係。ROS 2 使用這個檔案來了解套件所需的所有其他套件。
    • src/:一個空的目錄,通常用於放置 C++ 原始碼檔案。
    • include/:一個空的目錄,通常用於放置 C++ 頭檔案。
  3. 預設配置CMakeLists.txtpackage.xml 會被預先填充一些基礎的配置,讓您可以直接開始添加自己的程式碼和資源。

為什麼要創建這個套件?

創建像 my_maze_world 這樣的套件有以下幾個主要目的:

  1. 組織與管理:它提供了一個結構化的方式來組織所有與您的迷宮環境相關的檔案,例如:
    • 3D 模型檔案 (STL)。
    • Gazebo 模型描述檔案 (SDF)。
    • Gazebo 世界檔案 (World)。
    • ROS 2 啟動檔案 (Launch)。
    • 任何未來可能與迷宮互動的自定義 ROS 2 節點(例如,用於生成目標點或監控迷宮狀態的 Python/C++ 節點)。
  2. 依賴性管理:透過 package.xml,您可以明確定義您的迷宮套件所依賴的其他 ROS 2 套件(例如 gazebo_rosrclpyxacro 等)。這使得其他人在使用您的套件時,可以更容易地安裝所有必要的依賴項。
  3. 可重用性與分享:將迷宮相關的資源封裝在一個套件中,使得您可以輕鬆地在不同的專案中重用它,或與其他人分享您的迷宮環境。
  4. 建構系統集成ament_cmake 確保您的套件能夠被 colcon build 正確地編譯和安裝,從而將所有資源放置到 ROS 2 的安裝目錄中,方便被其他 ROS 2 節點或工具找到和使用。

簡而言之,my_maze_world 這個套件將成為您在 ROS 2 Humble 中管理和啟動迷宮模擬環境的中心。

ROS 2 (Humble) 中建置「迷宮環境(Maze)」模擬場景 的完整說明

關於 ROS 2 (Humble) 中建置「迷宮環境(Maze)」模擬場景 的完整說明,

包含如何使用 .STL 格式建模物件、載入到 Gazebo 中,

以及整合 ROS 2 模組(如地圖、定位、導航)。


🔷 一、什麼是 STL 格式(Stereolithography)

  • .STL 是一種表示三角形網格的 3D 模型格式,常用於機構建模、3D 列印。

  • 特點:

    • 僅描述幾何形狀(不包含顏色 / 材質 / 質感)

    • 可匯入到 Gazebo 作為靜態碰撞體或視覺模型

STL 在 Gazebo 中會透過 <mesh> 標籤載入成 visualcollision 組件。


🔷 二、建立迷宮 STL 並匯入 Gazebo

1️⃣ 建模(你可使用以下任一工具)

  • Blender:免費強大的 3D 建模軟體(可輸出 .stl

  • Fusion 360 / FreeCAD:適合精密機械建模

  • TinkerCAD:簡易建模(教育用途)

匯出時請注意單位(cm / m),Gazebo 使用公尺為單位。


2️⃣ STL 模型放置到資源資料夾

建議結構如下(符合 ROS package):

bash
my_maze_world/ ├── meshes/ │ └── maze_model.stl ├── models/ │ └── maze/ │ ├── model.config │ └── model.sdf ├── launch/ │ └── maze_world.launch.py ├── worlds/ │ └── maze.world

3️⃣ 建立 model.sdf(用於 Gazebo 載入 STL)

xml
<!-- models/maze/model.sdf --> <sdf version="1.6"> <model name="maze"> <static>true</static> <link name="maze_link"> <visual name="maze_visual"> <geometry> <mesh> <uri>model://maze/meshes/maze_model.stl</uri> <scale>1 1 1</scale> </mesh> </geometry> </visual> <collision name="maze_collision"> <geometry> <mesh> <uri>model://maze/meshes/maze_model.stl</uri> <scale>1 1 1</scale> </mesh> </geometry> </collision> </link> </model> </sdf>

4️⃣ 建立 model.config

xml
<!-- models/maze/model.config --> <model> <name>maze</name> <version>1.0</version> <sdf version="1.6">model.sdf</sdf> <author> <name>Handel</name> <email>you@example.com</email> </author> <description>Maze simulation model</description> </model>

🔷 三、建立 Gazebo 世界檔(maze.world)

xml
<!-- worlds/maze.world --> <sdf version="1.6"> <world name="default"> <include> <uri>model://sun</uri> </include> <include> <uri>model://ground_plane</uri> </include> <include> <uri>model://maze</uri> </include> </world> </sdf>

🔷 四、ROS 2 Humble 中整合 Gazebo

1️⃣ 安裝 ROS 2 Gazebo 套件(如尚未安裝)

bash
sudo apt install ros-humble-gazebo-ros-pkgs ros-humble-gazebo-ros2-control

2️⃣ 建立 launch file

python
# launch/maze_world.launch.py from launch import LaunchDescription from launch_ros.actions import Node from launch.actions import ExecuteProcess def generate_launch_description(): return LaunchDescription([ ExecuteProcess( cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_factory.so', './worlds/maze.world'], cwd='<YOUR_PACKAGE_PATH>', output='screen' ) ])

或使用 gazebo_ros 提供的 gazebo.launch.py,只需指定世界檔。


🔷 五、啟動迷宮模擬環境

bash
cd ~/ros2_ws colcon build source install/setup.bash ros2 launch my_maze_world maze_world.launch.py

🔷 六、常見延伸整合

功能使用方式
導入 SLAM 地圖建構加入 SLAM node + SLAM toolbox (slam_toolbox)
AMCL 定位使用 nav2_bringup,載入 .pgm + .yaml 地圖並配置初始位姿
自走導航使用 Nav2 的 lifecycle bringup、設定路徑、goal pose
加入自走車模型使用 URDF 或 XACRO 匯入機器人模型,搭配差速控制與 sensor plugin
使用 Rviz2 配合觀察ros2 run rviz2 rviz2,載入機器人與地圖顯示,設定 Frame = map/base_link

✅ 小結

模組任務
.stl建立迷宮模型
model.sdf將 STL 載入 Gazebo 物件模型
maze.world定義整個模擬場景
launch.py啟動 Gazebo + 模型
Nav2導航與避障
RViz2觀察 SLAM / AMCL / 路徑等結果

如需:

  • 範例 STL 模型 + SDF + 世界地圖

  • 輸出 .pgm/.yaml 地圖給 Nav2 用

  • 加入機器人模型與差速控制器

我可以幫你整理完整的 ROS 2 專案架構與腳本,是否需要一份 zip 專案樣板或 Docker 化模擬環境?

ROS2 建立 my_maze_world 迷宮模型的 package

以下是你要建立 my_maze_world 這個 ROS 2 Humble 套件的完整流程與建議放置位置,包含:

  1. 建立 ROS 2 package

  2. 放置 STL 模型、SDF 檔、world 檔、launch 檔

  3. 編譯與啟動


✅ 1. 推薦放置目錄

請在你的 ROS 2 開發空間(通常是 ~/ros2_ws)中操作:

bash
cd ~/ros2_ws/src ros2 pkg create --build-type ament_cmake my_maze_world

這會產生以下目錄結構:

css
ros2_ws/ └── src/ └── my_maze_world/ ├── CMakeLists.txt ├── package.xml

✅ 2. 加入 STL / SDF / world / launch 等資源檔案

建議加入以下資料夾結構:

lua
my_maze_world/ ├── CMakeLists.txt ├── package.xml ├── launch/ │ └── maze_world.launch.py ├── meshes/ │ └── maze_model.stl ├── models/ │ └── maze/ │ ├── model.config │ └── model.sdf ├── worlds/ │ └── maze.world ├── resource/ │ └── ...

✅ 3. 修改 CMakeLists.txt(加入安裝設定)

請在 CMakeLists.txt 加入:

cmake
install(DIRECTORY launch models meshes worlds DESTINATION share/${PROJECT_NAME} )

✅ 4. 修改 package.xml(加入依賴)

加入 gazebo 相關依賴(必要時):

xml
<exec_depend>gazebo_ros</exec_depend>

✅ 5. 編譯套件

bash
cd ~/ros2_ws colcon build --packages-select my_maze_world source install/setup.bash

✅ 6. 啟動模擬環境

bash
ros2 launch my_maze_world maze_world.launch.py

確保你有正確安裝 Gazebo 並設好環境變數(如:GAZEBO_MODEL_PATH


✅ 7. 設定 GAZEBO_MODEL_PATH(讓 Gazebo 找到模型)

bash
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/ros2_ws/install/my_maze_world/share/my_maze_world/models

建議你可以加入 .bashrc

bash
echo 'export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$HOME/ros2_ws/install/my_maze_world/share/my_maze_world/models' >> ~/.bashrc source ~/.bashrc

✅ 範例專案完成後執行畫面

成功後你會看到:

  • Gazebo 啟動,載入 ground_plane、sun、maze.stl 迷宮模型

  • 可手動放入機器人進行 SLAM、Nav2 等應用


如果你需要我幫你建立這個 ROS 2 my_maze_world package 的初始專案 zip 包,包含:

  • STL 測試模型

  • Gazebo 世界檔

  • SDF 模型定義

  • 含啟動 launch 的完整專案

也可以提供,請告訴我你要的格式。

2025年6月11日 星期三

ROS2_Gazebo_URDF build and Load

將模型放入 ROS 2 Gazebo 並整合控制與感測器

將模型放入 ROS 2 Gazebo 並整合控制與感測器

本指南將詳細說明如何將您的 URDF 模型整合到 ROS 2 Gazebo 環境中,並加入控制插件、感測器模擬以及 RViz 可視化配置。內容基於您提供的資訊進行組織。

關於檔案名稱的注意事項: 您提供的 zip 檔案包含一個資料夾 ROS小車URDF-02,其中有一個 .urdf 檔案和多個 .stl 檔案(機構模型),命名中有中文亂碼(例如 Φ╗èΘ½ö_IMU.stl),這可能是編碼問題造成的。在實際操作中,建議將這些檔案重新命名為英文或純數字名稱,以避免潛在問題。本指南中的範例會使用簡化的英文名稱。

✅ 一、前置需求

請確保您已安裝以下軟體:

  • ROS 2(如 Humble / Iron)
  • Gazebo(通常是 Gazebo Classic,非 Ignition)
  • ros_ign_gazebo(如果您使用的是 Ignition 版本)
  • gazebo_ros_pkgs
✅ 二、解壓模型檔案

假設您有一個 ROS 2 workspace 位於 ~/ros2_ws。請使用以下指令將壓縮包解壓到您的 ROS 2 工作區:

bash 已複製!
cd ~/ros2_ws/src
unzip /mnt/data/ROS小車URDF-02.zip -d urdf_car

這會將內容解壓到 ~/ros2_ws/src/urdf_car 資料夾中。

✅ 三、檢查模型目錄結構

解壓後,請確保目錄內包含類似以下結構(請根據實際情況調整檔案名稱):

swift 已複製!
urdf_car/
├── CMakeLists.txt
├── package.xml
├── launch/
│   └── gazebo.launch.py
├── urdf/
│   └── car.urdf.xacro  或 car.urdf (根據您提供的檔案應為 .urdf)
├── meshes/
│   └── *.dae / *.stl
└── world/
    └── your_world.world (optional)

如果檔案是 .xacro 格式,您需要在啟動前轉換成 URDF 格式。由於您提供的檔案是 .urdf,通常不需要額外轉換,但請檢查內容是否完整。

✅ 四、建立 launch 檔來載入模型至 Gazebo

這是一個典型的 gazebo.launch.py 範例,可以用來載入車模到 Gazebo。請將此內容儲存到 urdf_car/launch/gazebo.launch.py。確保 arguments=['urdf/car.urdf'] 中的檔案名稱與您的模型實際名稱一致。

python 已複製!
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess

def generate_launch_description():
    return LaunchDescription([
        # 啟動 Gazebo 模擬器 
        ExecuteProcess(
            cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_factory.so'],
            output='screen'),

        # 載入車輛模型
        Node(
            package='robot_state_publisher',
            executable='robot_state_publisher',
            name='robot_state_publisher',
            output='screen', 
            parameters=[{'use_sim_time': True}],
            arguments=['urdf/car.urdf']  # 根據實際檔名修改,例如 'urdf/ROS小車URDF-02.urdf'
        ),

        # Spawn Model 到 Gazebo 中
        Node(
            package='gazebo_ros',
            executable='spawn_entity.py',
            arguments=['-entity', 'urdf_car', '-file', 'urdf/car.urdf', '-x', '0', '-y', '0', '-z', '0.2'], 
            output='screen'
        )
    ])
✅ 五、編譯並啟動
  1. 回到工作區根目錄並編譯您的 package:
  2. bash 已複製!
    cd ~/ros2_ws
    colcon build --packages-select urdf_car
    source install/setup.bash
  3. 啟動模擬:
  4. bash 已複製!
    ros2 launch urdf_car gazebo.launch.py
✅ 六、建議補充(選用)

以下是進一步增強您的模型與模擬環境的建議:

  • 加入控制插件(如 diff_drive_controller)
  • 加入感測器模擬(如 lidar、camera、IMU)
  • 撰寫控制節點與 RViz 可視化配置

接下來的步驟

以下將說明如何加入控制器、感測器模擬、RViz 可視化設定及控制節點。

① 修改 URDF:加入 Plugin 和 Sensor 模組

請將以下範例片段加入到您的 URDF 檔案中。通常這些 <gazebo> 標籤會放在 </robot> 標籤之前,或者與對應的 <link> 標籤在相同的 <robot> 範圍內。請確保連接 (reference) 的 link name 正確。

✅ 加入 Diff Drive Controller Plugin
xml 已複製!
<gazebo>
  <plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so">
    <ros>
      <namespace>/</namespace> 
    </ros>
    <update_rate>50</update_rate>
    <left_wheel>left_wheel_joint</left_wheel>
    <right_wheel>right_wheel_joint</right_wheel>
    <wheel_separation>0.5</wheel_separation>
    <wheel_diameter>0.15</wheel_diameter>
    <command_topic>cmd_vel</command_topic>
    <odometry_topic>odom</odometry_topic>
    <odometry_frame>odom</odometry_frame>
    <robot_base_frame>base_link</robot_base_frame>
    <publish_tf>true</publish_tf>
  </plugin>
</gazebo>

注意: 請將 left_wheel_jointright_wheel_joint 替換為您 URDF 中實際定義的左右輪關節名稱。

✅ 加入 IMU 感測器模擬
xml 已複製!
<link name="imu_link">
  <inertial>
    <mass value="0.01"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/>
  </inertial>
</link>

<gazebo reference="imu_link">
  <sensor name="imu_sensor" type="imu">
    <always_on>true</always_on>
    <update_rate>50</update_rate>
    <imu> 
      <angular_velocity />
      <linear_acceleration />
    </imu>
    <plugin name="imu_plugin" filename="libgazebo_ros_imu_sensor.so"/>
  </sensor>
</gazebo>

注意: 您需要在 URDF 中定義一個名為 imu_link 的連結,並將其放置在模型中 IMU 實際位置。如果您的模型中已有名為 Φ╗èΘ½ö_IMU.stl 的 mesh,則可能需要創建一個對應的 linkjoint,並將此 <gazebo reference="imu_link"> 部分與其關聯。

✅ 加入相機模擬(RGB Camera)
xml 已複製!
<gazebo reference="camera_link">
  <sensor name="camera_sensor" type="camera">
    <camera>
      <horizontal_fov>1.39626</horizontal_fov>
      <image>
        <width>640</width>
        <height>480</height>
        <format>R8G8B8</format>
      </image>
      <clip>
        <near>0.1</near>
        <far>100</far> 
      </clip>
    </camera>
    <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
      <camera_name>camera</camera_name>
      <image_topic_name>image_raw</image_topic_name>
      <camera_info_topic_name>camera_info</camera_info_topic_name>
    </plugin>
  </sensor>
</gazebo>

注意: 您需要在 URDF 中定義一個名為 camera_link 的連結,並將其放置在模型中相機實際位置。

✅ 加入 LiDAR 模擬(單線雷達)
xml 已複製!
<gazebo reference="lidar_link">
  <sensor name="lidar_sensor" type="ray">
    <ray>
      <scan>
        <horizontal>
          <samples>720</samples>
          <resolution>1</resolution>
          <min_angle>-1.57</min_angle>
          <max_angle>1.57</max_angle> 
        </horizontal>
      </scan>
      <range>
        <min>0.1</min>
        <max>10.0</max>
        <resolution>0.01</resolution>
      </range>
    </ray>
    <plugin name="gazebo_ros_laser" filename="libgazebo_ros_ray_sensor.so"/>
  </sensor>
</gazebo>

注意: 您需要在 URDF 中定義一個名為 lidar_link 的連結,並將其放置在模型中 LiDAR 實際位置。

② RViz 可視化設定

在您的 urdf_car package 中新增一個 rviz 資料夾,並在其中創建一個 car_config.rviz 檔案。將以下內容複製到該檔案中。這是一個簡化示意,您可以根據需要添加更多顯示項。

ini 已複製!
Visualization Manager:
  Class: ""
  Displays:
    - Name: RobotModel
      Enabled: true
      Robot Description: robot_description 
    - Name: TF
      Enabled: true
    - Name: Odometry
      Topic: /odom
      Enabled: true
    - Name: LaserScan
      Topic: /scan
      Enabled: true

③ 控制節點(Teleop 範例)

要透過鍵盤控制車輛,您可以安裝 teleop_twist_keyboard package。

  1. 安裝:
  2. bash 已複製!
    sudo apt install ros-humble-teleop-twist-keyboard
  3. 執行:
  4. bash 已複製!
    ros2 run teleop_twist_keyboard teleop_twist_keyboard

    這會發布 /cmd_vel 主題,用於控制車子移動。

④ 啟動 Launch 檔整合

您可以建立一個新的 bringup.launch.py 檔案(例如在 urdf_car/launch/ 中)來一次性啟動 Gazebo、模型和 RViz。

python 已複製!
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node
import os
from ament_index_python.packages import get_package_share_directory # 需要添加此行以獲取包路徑

def generate_launch_description():
    pkg_share = get_package_share_directory('urdf_car') # 獲取 urdf_car 包的安裝路徑

    return LaunchDescription([
        # 啟動 Gazebo + 模型 
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource(os.path.join(pkg_share, 'launch', 'gazebo.launch.py'))
        ),

        # 啟動 RViz
        Node(
            package='rviz2',
            executable='rviz2',
            name='rviz2',
            arguments=['-d', os.path.join(pkg_share, 'rviz', 'car_config.rviz')], 
            output='screen'
        ),
    ])

注意: 您可能需要手動編輯 urdf_car/CMakeLists.txtpackage.xml,以確保這些新的 launchrviz 檔案會被安裝到 package 的 share 目錄中。例如,在 CMakeLists.txt 中加入類似以下行:

cmake 已複製!
install(
    DIRECTORY launch rviz
    DESTINATION share/${PROJECT_NAME}
)
install(
    FILES urdf/car.urdf # 如果您的urdf在urdf/下,請確保安裝
    DESTINATION share/${PROJECT_NAME}/urdf
)
install(
    DIRECTORY meshes # 如果您有 meshes 資料夾,請確保安裝
    DESTINATION share/${PROJECT_NAME}/meshes
)

並在 package.xml 中確認所有依賴都已聲明,例如 gazebo_ros, robot_state_publisher, rviz2 等。

✅ 總結

完成這些步驟後,您現在將擁有一個更完整的 ROS 2 Gazebo 模擬環境:

  • URDF 中加入了輪控器、IMU、雷達、相機模擬。
  • RViz 可視化:可顯示模型、雷達、IMU 等。
  • 控制節點:可用鍵盤控制車輛。
  • 啟動腳本:自動載入模型與視覺化環境。

若您需要實際修改您的 URDF 檔案並產出完整的工作範例,或者需要協助產生 package.xmlCMakeLists.txt 等,我可以進一步提供協助。

2025年4月16日 星期三

micro-ROS 搭配 ESP32

使用 micro-ROS 搭配 ESP32 建立 FreeRTOS firmware 時,流程會與 STM32 類似,

但會使用 ESP-IDF 或 Arduino 作為平台基礎。

以下是完整操作流程與測試方法:


✅ 一、準備工作

1️⃣ 安裝 ROS 2(建議版本:Humble)

bash
sudo apt update sudo apt install -y ros-humble-desktop

2️⃣ 安裝 ESP-IDF 開發環境(適用 micro-ROS ESP32)

bash
sudo apt install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util mkdir -p ~/esp cd ~/esp git clone --recursive https://github.com/espressif/esp-idf.git cd esp-idf ./install.sh

設定環境變數:

bash
. $HOME/esp/esp-idf/export.sh

✅ 二、建立 micro-ROS firmware workspace

bash
mkdir -p ~/microros_esp32_ws/src cd ~/microros_esp32_ws/src git clone -b humble https://github.com/micro-ROS/micro_ros_espidf_component.git

✅ 三、初始化 firmware project for ESP32

bash
cd ~/microros_esp32_ws ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32

這會產生 firmware/ 資料夾,裡面含有:

objectivec
firmware/ ├── components/ ├── freertos_apps/ │ └── apps/ │ └── app.c ← micro-ROS 程式寫在這裡 ├── build/ ├── CMakeLists.txt └── ...

✅ 四、撰寫 app.c 範例程式(micro-ROS 節點)

c
#include <rcl/rcl.h> #include <rclc/rclc.h> #include <std_msgs/msg/int32.h> void appMain(void *argument) { rcl_allocator_t allocator = rcl_get_default_allocator(); rclc_support_t support; rcl_node_t node; rcl_publisher_t publisher; std_msgs__msg__Int32 msg; msg.data = 0; rclc_support_init(&support, 0, NULL, &allocator); rcl_node_init_default(&node, "esp32_node", "", &support); rcl_publisher_init_default(&publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), "esp32_int"); while (1) { rcl_publish(&publisher, &msg, NULL); msg.data++; vTaskDelay(1000 / portTICK_PERIOD_MS); } }

✅ 五、建構韌體

bash
ros2 run micro_ros_setup build_firmware.sh

✅ 六、燒錄韌體至 ESP32

插入 ESP32,然後:

bash
ros2 run micro_ros_setup flash_firmware.sh

預設會找 /dev/ttyUSB0,你也可以自定:

bash
export PORT=/dev/ttyUSB1 ros2 run micro_ros_setup flash_firmware.sh

✅ 七、啟動 micro-ROS Agent on PC

在 ROS2 主機上執行:

bash
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0

✅ 八、驗證 Topic 傳送

bash
ros2 topic list ros2 topic echo /esp32_int

你應該會看到資料遞增輸出:

kotlin
data: 0 data: 1 data: 2 ...

📦 延伸支援

功能工具 or 建議
OTA 更新使用 ESP-IDF OTA 模組
WiFi UDP 支援改用 udp 模式啟動 Agent (udp4 --port 8888)
Topic → Servo PWM 控制app.c 內加入 rcl_subscription_t 接收控制訊號
與 STM32 共同架構使用 ROS2 Agent + DDS 完成同步




ROS 2 和 micro-ROS 通訊架構

以下是 ROS 2 和 micro-ROS 通訊架構的文字描述和 Markdown 圖示:

文字描述:

整個通訊架構的核心是 ROS 2 網路,它基於 DDS(Data Distribution Service)中介層。在這個 ROS 2 網路中,運行著各種 ROS 2 節點,它們可以發布主題 (Topics)、訂閱主題、提供和使用服務 (Services),以及執行動作 (Actions)。

當我們引入 micro-ROS 時,Arduino 微控制器上的應用程式會成為一個 micro-ROS Client。這個 Client 本身並不直接參與 DDS 通訊,而是透過一個在更強大的電腦上運行的 micro-ROS Agent 作為橋樑。

micro-ROS Client 和 Agent 之間使用特定的通訊方式進行資料交換,常見的方式包括序列埠 (Serial/UART) 或網路協定 (UDP/TCP)。Client 將其 ROS 2 操作(例如發布訊息到某個主題)封裝成 Agent 可以理解的格式,並透過選定的傳輸方式發送給 Agent。

micro-ROS Agent 接收到來自 Client 的請求後,會將其轉換為標準的 ROS 2 DDS 通訊,並將其發布到 ROS 2 網路中。同樣地,當 ROS 2 網路中有與 micro-ROS Client 訂閱的主題相關的訊息時,Agent 會接收到這些訊息,並將其轉換為 Client 可以理解的格式,再透過相同的傳輸方式發送給 Client。

因此,micro-ROS Agent 本質上是一個協調者和轉換器,它使得資源受限的微控制器能夠間接地參與到功能完善的 ROS 2 生態系統中。

Markdown 架構圖:

Markdown
graph LR
    subgraph ROS 2 Network
        ROS2Node1 -- DDS --> ROS2Node2
        ROS2Node1 -- DDS --> ROS2Agent
        ROS2Agent -- DDS --> ROS2Node2
    end

    subgraph micro-ROS System
        ArduinoClient -- Serial/UDP --> ROS2Agent
    end

    %%ROS2Agent -- Bridges Communication --> ArduinoClient
    %%ROS2Agent -- Bridges Communication --> ROS2Network

[text show]
    [ROS2Node1] <--DDS--> [ROS2Node2]
                   |
                   v
              [ROS2Agent] <--Serial/UDP--> [ArduinoClient]


圖示說明:

  • ROS 2 Network 子圖: 代表標準的 ROS 2 環境。
    • ROS2Node1ROS2Node2 是典型的 ROS 2 節點,它們之間直接透過 DDS 進行通訊。
    • ROS2Agent 在這個網路中也作為一個 ROS 2 節點存在,它可以與其他標準 ROS 2 節點進行 DDS 通訊。
  • micro-ROS System 子圖: 代表包含 Arduino 和 micro-ROS Agent 的部分。
    • ArduinoClient 代表運行在 Arduino 微控制器上的 micro-ROS Client 程式。
    • ArduinoClient -- Serial/UDP --> ROS2Agent 表示 Arduino Client 使用序列埠或 UDP 等通訊方式與 micro-ROS Agent 進行通訊。
  • 連接箭頭:
    • ROS2Agent -- Bridges Communication --> ArduinoClient 強調 Agent 作為 Client 和 ROS 2 網路之間的通訊橋樑。
    • ROS2Agent -- Bridges Communication --> ROS2Network 同樣強調 Agent 在 ROS 2 網路中的角色。

總結:

micro-ROS 的通訊架構是一種代理模式,微控制器上的 Client 並不直接參與底層的 DDS 通訊,而是依賴於運行在更強大電腦上的 Agent 來作為其在 ROS 2 網路中的代表。Agent 負責處理與 ROS 2 網路的通訊細節,並將資料轉換成 Client 可以理解的格式,反之亦然。這種架構使得資源受限的微控制器也能夠安全且有效地融入 ROS 2 生態系統。

micro-ROS 研究指南

 

form NotebookLM

測驗 (簡答題)


  1. 1#micro-ROS 的主要目標是什麼?它如何克服傳統 ROS 2 在資源受限環境中的限制?

  2. 2#請簡述 micro-ROS Client Library 和 micro-ROS Agent 的功能以及它們之間的關係。

  3. 3#micro-ROS Agent 在 micro-ROS 系統中扮演什麼關鍵角色?它如何促進微控制器與 ROS 2 網路之間的通訊?

  4. 4#列舉至少三種 micro-ROS 支援的微控制器平台或開發板。

  5. 5#使用預編譯的 micro-ROS 函式庫在 Arduino IDE 中建立 micro-ROS 專案的步驟是什麼?

  6. 6#如果開發者需要修改 micro-ROS 的組態或新增自定義的訊息類型,他們應該如何重新編譯 micro-ROS 函式庫?

  7. 7#micro-ROS 提供了哪些不同的傳輸方式來實現微控制器與 Agent 之間的通訊?請舉例說明。

  8. 8#ROSMicroPy 專案的目標是什麼?它試圖整合哪些技術?

  9. 9#根據提供的 GitHub Issue,開發者在使用 STM32CubeIDE 開發 micro-ROS 專案時可能會遇到什麼挑戰?

  10. 10#為什麼不能直接使用標準 ROS 2 的 colcon build 工具來為 Arduino 產生 micro-ROS 韌體?應該使用哪些替代方法?

測驗答案

  1. ans1#micro-ROS 的主要目標是將 ROS 2 的強大功能帶到資源受限的微控制器上。它透過輕量化的設計和最佳化,使得微控制器能夠運行 ROS 2 的核心概念,並無縫整合到 ROS 2 網路中,克服了傳統 ROS 2 通常運行在計算資源較高的單板電腦或 PC 上的限制。

  2. ans2#micro-ROS Client Library 運行在微控制器上,提供 ROS 2 的基本功能如節點、主題、服務等;micro-ROS Agent 運行在資源更豐富的電腦上,是 Client 和 ROS 2 DDS 中介軟體之間的橋樑,負責發現、訊息路由和協調。Client 透過 Agent 連接到 ROS 2 網路。

  3. ans3#micro-ROS Agent 是 micro-ROS 系統的核心中介,它負責代理微控制器上的 micro-ROS Client 與標準 ROS 2 網路進行通訊。Agent 處理 Client 的註冊與發現,並將 Client 發布和訂閱的訊息在 micro-ROS 世界和 ROS 2 世界之間進行轉發和路由,使得資源受限的微控制器也能參與到 ROS 2 的生態系統中。

  4. ans4#至少三種 micro-ROS 支援的微控制器平台或開發板包括:
  5. Arduino Portenta H7、Arduino Nano RP2040 Connect、
  6. ESP32 Dev Module、Teensy 系列(4.0, 4.1, 3.2/3.1, 3.6)、
  7. Raspberry Pi Pico。

  8. ans5#使用預編譯的 micro-ROS 函式庫在 Arduino IDE 中建立專案的步驟包括:前往 release 區下載最新的 micro-ROS Arduino 函式庫,然後在 Arduino IDE 中使用
  9. 「Sketch」->「Include library」->「Add .ZIP Library...」將其包含到專案中。
  10. 之後可以測試 examples 資料夾中的範例。

  11. ans6#如果開發者需要修改 micro-ROS 的組態或新增自定義的訊息類型,他們需要重新編譯 micro-ROS 函式庫。這通常涉及使用 Docker 容器來拉取 micro-ROS 的靜態函式庫建置工具,然後在容器中執行建置命令,指定自定義的 .meta 檔案或額外的套件路徑。

  12. ans7#micro-ROS 提供了多種傳輸方式,包括 USB 序列埠 (UART/USB) 和網路傳輸(例如 UDP)。在 Arduino IDE 中使用預編譯函式庫時,主要提供 USB 序列傳輸。對於 ESP32,預設使用 UDP 傳輸,但也支援 UART 和其他自定義傳輸,需要在 colcon.meta 檔案中進行設定。

  13. ans8#ROSMicroPy 專案的目標是整合 MicroROS 和 Micropython,以支援 ESP32 平台。它旨在讓開發者能夠使用 Micropython 語言在 ESP32 上開發 micro-ROS 應用,並正在尋求關於其文件清晰度、SDK 實作以及類型支援系統的回饋。

  14. ans9#根據 GitHub Issue #5,開發者在使用 STM32CubeIDE 開發 FreeRTOS 上的 micro-ROS 專案時,可能會遇到將 appMain() 內部調用的函數放置到 IDE 風格程式碼中的困難,尤其是在使用自己配置的 .ioc 檔案時,以及在透過 bash scripts 上傳程式碼後節點或主題不可見的問題。

  15. ans10#不能直接使用標準 ROS 2 的 colcon build 工具來為 Arduino 產生 micro-ROS 韌體,因為 Arduino 使用不同的微控制器架構,需要不同的編譯器和連結器,並且通常沒有作業系統抽象層。應該使用 Arduino 生態系統提供的工具(如 Arduino IDE、PlatformIO)或底層的嵌入式系統開發工具鏈,並搭配 micro-ROS 提供的特定函式庫(如 micro_ros_arduino)來開發、編譯和上傳韌體。


論述題 (不提供答案)

  1. 1##比較並對比在資源受限的微控制器上使用 micro-ROS 與直接使用 ROS 2 在更強大的硬體上進行開發的優缺點。在哪些應用場景下 micro-ROS 可能是更合適的選擇?

  2. 2##探討 micro-ROS Agent 在整個 micro-ROS 生態系統中的重要性。如果沒有 Agent,micro-ROS Client 的功能將會受到哪些限制?是否有可能設計一個完全無 Agent 的 micro-ROS 系統?

  3. 3##分析 micro-ROS 對於嵌入式機器人開發的潛在影響。它如何簡化開發流程,促進硬體和軟體的互操作性?同時,也請討論在實際應用中可能遇到的挑戰。

  4. 4##根據提供的資料,討論 micro-ROS 對不同微控制器平台(例如 Arduino、ESP32、STM32)的支援情況和整合方式。不同平台的整合方法有何異同?開發者在選擇平台時應考慮哪些因素?

  5. 5##評估 ROSMicroPy 專案將 MicroROS 與 Micropython 整合的潛力與挑戰。這種整合對於嵌入式開發者可能帶來哪些便利?同時,又可能面臨哪些技術難題和限制?

詞彙表

  • micro-ROS Client Library (μROS Client Library): 運行在微控制器上的輕量級函式庫,提供 ROS 2 的核心功能,如節點、主題、服務等。
  • micro-ROS Agent (μROS Agent): 運行在資源更豐富的電腦上的代理程式,充當 micro-ROS Client 和 ROS 2 DDS 中介軟體之間的橋樑,負責發現、訊息路由和協調。
  • ROS 2 (Robot Operating System 2): 開源的機器人作業系統,提供工具、函式庫和慣例,用於構建複雜的機器人應用。
  • Microcontroller Unit (MCU): 一種集成了處理器、記憶體和外設的單晶片微型電腦,通常用於嵌入式系統。
  • Arduino IDE: Arduino 官方提供的整合開發環境,用於編寫和上傳程式碼到 Arduino 開發板。
  • PlatformIO: 一個開源的跨平台建置系統,支援多種嵌入式開發板和框架。
  • ESP-IDF (Espressif IoT Development Framework): Espressif 提供的用於 ESP32 系列晶片的開發框架。
  • FreeRTOS: 一個輕量級的即時作業系統,常Used in嵌入式系統中用於任務管理和排程。
  • STM32CubeMX: STMicroelectronics 提供的圖形化工具,用於配置 STM32 微控制器和產生初始化程式碼。
  • DDS (Data Distribution Service): ROS 2 預設使用的資料分發服務中介軟體,提供即時、可靠和可擴展的資料交換。
  • RMW (ROS Middleware): ROS 2 的中介軟體抽象層,允許使用不同的 DDS 實作。
  • colcon: ROS 2 的命令行建置工具。
  • .meta file: micro-ROS 中用於定義函式庫組態和 RMW 參數的檔案。
  • Precompiled library: 已經編譯好的函式庫,可以直接在專案中使用而無需重新編譯。
  • Baremetal: 指程式直接運行在硬體上,沒有作業系統的支援。
  • RTOS (Real-Time Operating System): 一種專為即時應用設計的作業系統,能夠在嚴格的時間限制內處理任務。
  • Firmware: 燒錄到硬體設備(如微控制器)中的軟體,用於控制硬體的操作。
  • Transport: micro-ROS Client 和 Agent 之間通訊的方式,例如序列埠 (Serial)、UDP、TCP 等。
  • Node: ROS 2 中的一個執行單元,可以發布和訂閱主題、提供和使用服務。
  • Topic: ROS 2 中具名的資料流,節點可以發布訊息到主題,其他節點可以訂閱感興趣的主題以接收訊息。
  • Message: 以標準化的格式在 ROS 2 主題上傳輸的資料結構。
  • Publisher: 將訊息發布到特定主題的節點。
  • Subscriber: 接收來自特定主題訊息的節點。
  • Service: ROS 2 中一種請求-回應的通訊機制。
  • Action: ROS 2 中一種更複雜的非同步請求-回應機制,包含目標、回饋和結果。
  • Parameter: ROS 2 節點的可配置設定。
  • Type Support: ROS 2 中用於處理訊息序列化和反序列化的機制。