welcom ! Handel home

顯示具有 (Robot_arm) 標籤的文章。 顯示所有文章
顯示具有 (Robot_arm) 標籤的文章。 顯示所有文章

2025年6月11日 星期三

ROS 2 Gazebo 並整合控制與感測器

將模型放入 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 等,我可以進一步提供協助。

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月14日 星期一

檢查 RRC (ROS Robot Control) 馬達控制板的連線狀態

 如何檢查 RRC (ROS Robot Control) 馬達控制板的連線狀態,並提供完整的 通訊範例(使用 /dev/ttyACM0 串列通訊)。


🧭 一、RRC 控制板連線檢查步驟

✅ 1. 確認設備是否出現

bash
ls /dev/ttyACM*

應該會顯示:

bash
/dev/ttyACM0

✅ 2. 查看系統訊息確認驅動載入

bash
dmesg | grep ttyACM

會看到類似:

csharp
[12345.678901] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device

✅ 3. 使用 screen / minicom 測試控制板回應

如果你知道板子會在接收特定命令後回傳資料,可以用:

bash
sudo apt install screen screen /dev/ttyACM0 115200

或:

bash
minicom -b 115200 -D /dev/ttyACM0

手動輸入命令(如 STATUS\n),觀察是否回應。


🧪 二、簡單 Python 測試腳本(非 ROS)

📄 test_rrc.py

python
import serial try: ser = serial.Serial('/dev/ttyACM0', 115200, timeout=2) print("[INFO] Connected to RRC") # 傳送測試命令(根據 RRC 協定自行修改) test_command = 'STATUS\n' ser.write(test_command.encode()) # 等待回應 response = ser.readline().decode().strip() print("[RESPONSE] ", response) except serial.SerialException as e: print("[ERROR] Serial connection failed:", e)

執行:

bash
python3 test_rrc.py

🧩 三、ROS 通訊完整示範

📄 rrc_serial_node.py(ROS 節點)

python
#!/usr/bin/env python import rospy import serial from std_msgs.msg import String class RRCSerialNode: def __init__(self): port = rospy.get_param("~port", "/dev/ttyACM0") baud = rospy.get_param("~baud", 115200) try: self.ser = serial.Serial(port, baud, timeout=1) rospy.loginfo("✅ Connected to RRC on %s", port) except serial.SerialException as e: rospy.logerr("❌ Could not open port: %s", e) exit(1) rospy.Subscriber("rrc_command", String, self.command_cb) self.status_pub = rospy.Publisher("rrc_status", String, queue_size=10) rospy.Timer(rospy.Duration(1.0), self.read_status) def command_cb(self, msg): cmd = msg.data.strip() rospy.loginfo("Sending command: %s", cmd) self.ser.write((cmd + '\n').encode()) def read_status(self, event): if self.ser.in_waiting: line = self.ser.readline().decode(errors='ignore').strip() if line: rospy.loginfo("RRC says: %s", line) self.status_pub.publish(line) if __name__ == '__main__': rospy.init_node("rrc_serial_node") node = RRCSerialNode() rospy.spin()

📄 rrc_driver.launch

xml
<launch> <node pkg="your_rrc_pkg" type="rrc_serial_node.py" name="rrc_serial_node" output="screen"> <param name="port" value="/dev/ttyACM0"/> <param name="baud" value="115200"/> </node> </launch>

🧪 發送控制指令範例

bash
rostopic pub /rrc_command std_msgs/String "data: 'MOTOR 1 FORWARD 100'"

🔄 接收回應

查看:

bash
rostopic echo /rrc_status

✅ 常見指令範例(依你板子的協定修改)

指令功能說明
STATUS查詢狀態
MOTOR 1 FORWARD 100控制 1 號馬達正轉 100PWM
MOTOR 2 BACKWARD 80控制 2 號馬達反轉 80PWM
STOP停止所有馬達

📦 建議的 ROS 套件結構

go
your_rrc_pkg/ ├── launch/ │ └── rrc_driver.launch ├── scripts/ │ └── rrc_serial_node.py ├── package.xml └── CMakeLists.txt

記得讓 scripts/rrc_serial_node.py 有執行權限:

bash
chmod +x scripts/rrc_serial_node.py

📚 補充

如果你願意提供 RRC 控制板的命令格式、通訊協定或簡易手冊,我可以:

  • 幫你寫出專屬 ROS 驅動節點

  • 做 topic/service 封裝

  • 對應 motor encoder / IMU feedback 等功能

RRC(ROS Robot Control)馬達控制板 是透過 USB 串列裝置(/dev/ttyACM0)

 有一塊 RRC(ROS Robot Control)馬達控制板 是透過 USB 串列裝置(/dev/ttyACM0)與系統連線,並想要在 ROS + Docker 環境中驅動這塊控制板,你可以依照下列步驟設定。


🔧 系統目標

  • 控制板連接主機的 /dev/ttyACM0

  • ROS 在 Docker 容器中執行,透過 serial 通訊與 RRC 溝通

  • 控制板可能使用自定協議或標準如 rosserial, pyserial, ros_control 相關 Node


✅ 步驟 1:讓 Docker 容器存取 /dev/ttyACM0

啟動容器時加上:

bash
--device=/dev/ttyACM0 \ --group-add=dialout \

docker-compose.yml 中:

yaml
devices: - "/dev/ttyACM0:/dev/ttyACM0" group_add: - dialout

這樣容器內就能看到這個序列裝置。


✅ 步驟 2:主機使用者加入 dialout 群組(如尚未)

bash
sudo usermod -aG dialout $USER

登出再登入以生效,確保 Docker 能存取該設備。


✅ 步驟 3:在容器中安裝 serial 通訊函式庫

Python 通訊(使用 pyserial

bash
pip install pyserial

✅ 步驟 4:ROS 中寫 Serial 節點驅動 RRC 板

📄 rrc_serial_node.py(Python 範例)

python
#!/usr/bin/env python import rospy import serial from std_msgs.msg import String ser = None def command_callback(msg): rospy.loginfo("Sending command: %s", msg.data) ser.write((msg.data + '\n').encode()) if __name__ == '__main__': rospy.init_node('rrc_serial_node') port = rospy.get_param('~port', '/dev/ttyACM0') baud = rospy.get_param('~baud', 115200) try: ser = serial.Serial(port, baud, timeout=1) rospy.loginfo("Connected to RRC on %s", port) except serial.SerialException as e: rospy.logerr("Failed to connect to RRC: %s", e) exit(1) rospy.Subscriber('rrc_command', String, command_callback) rospy.spin()

✅ 步驟 5:撰寫 launch

📄 rrc_driver.launch

xml
<launch> <node pkg="your_rrc_pkg" type="rrc_serial_node.py" name="rrc_serial_node" output="screen"> <param name="port" value="/dev/ttyACM0"/> <param name="baud" value="115200"/> </node> </launch>

✅ 步驟 6:啟動並測試

在 Docker 容器內執行:

bash
roslaunch your_rrc_pkg rrc_driver.launch

若成功連線,你會看到:

pgsql
[INFO] Connected to RRC on /dev/ttyACM0

你可以透過發送指令給 /rrc_command topic 來控制馬達:

bash
rostopic pub /rrc_command std_msgs/String "data: 'M1:100'"

✅ 選擇性:使用 rosserial(若控制板支援)

若 RRC 支援 rosserial 協定,可用:

bash
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=115200

搭配控制板端跑 ros.h 的程式,能實現 ROS topic/service 控制。


📦 Docker Compose 範例

yaml
ros_rrc: image: your_ros_image container_name: ros_rrc devices: - "/dev/ttyACM0:/dev/ttyACM0" group_add: - dialout environment: - DISPLAY=${DISPLAY} volumes: - /tmp/.X11-unix:/tmp/.X11-unix command: bash -c "source /opt/ros/noetic/setup.bash && roslaunch your_rrc_pkg rrc_driver.launch"

✅ 總結

項目說明
/dev/ttyACM0是你的 RRC 控制板的 USB 串列埠
Docker 中使用加上 --device 參數讓容器能看到該埠
ROS 節點通訊使用 Python pyserial or rosserial 建立 Serial Node
Topic 控制可透過 /rrc_command 傳送控制指令
可加強加入解析協定 / 讀取回傳 / 發佈狀態等

如果你提供 RRC 指令格式(如:M1:100STOP 之類),我可以幫你擴寫完整 ROS 控制驅動節點!要嗎?

2025年4月13日 星期日

控制器對 4 通道編碼器馬達的支援

 #4 通道編碼器馬達

  • 控制器驅動 4 通道編碼器馬達,採用 PID 速度控制
    • 這表示控制器能夠同時控制四個獨立的編碼器馬達。
    • 編碼器馬達提供馬達轉動的精確位置和速度資訊。
    • PID(比例-積分-微分)速度控制是一種常用的控制演算法,用於精確地調整馬達的速度,使其達到期望值。PID控制能夠提高馬達速度的精確度與穩定度。

#支援多種車輛類型

  • 支援多種車輛,包括 2WD、4WD 差速、麥克納姆輪、全向輪、轉向和阿克曼車:
    • 這強調了控制器的多功能性,適用於各種不同的移動機器人平台。
    • 2WD (Two-Wheel Drive): 兩輪驅動車輛。
    • 4WD 差速 (Four-Wheel Drive differential): 四輪驅動差速車輛,常見的四輪驅動模式。
    • 麥克納姆輪 (Mecanum wheel): 麥克納姆輪車輛,能夠實現全向移動。
    • 全向輪 (Omnidirectional wheel): 使用全向輪的車輛,提供全方位的移動能力。
    • 轉向 (Steering): 使用轉向輪的車輛,像是前輪轉向的車輛。
    • 阿克曼車 (Ackermann car): 阿克曼轉向車輛,符合汽車轉向幾何原理,提供更穩定的轉彎性能。

MPU6050 介紹


MPU6050 是一款由 InvenSense 公司生產的微機電系統(MEMS)晶片,它結合了 3 軸陀螺儀和 3 軸加速度計,

能夠提供 6 個自由度(6-DoF)的運動追蹤數據。MPU6050 是一個功能強大的 IMU 晶片

#主要特性:

• 3 軸陀螺儀: 

○ 用於測量物體的角速度,即物體繞三個軸(X、Y、Z)旋轉的速度。

• 3 軸加速度計: 

○ 用於測量物體在三個軸上的加速度,包括重力加速度。

• 數位輸出: 

○ 透過 I2C 介面提供數位輸出,方便與微控制器或其他數位設備連接。

• 數位運動處理器(DMP): 

○ 內建 DMP,能夠進行複雜的運動處理運算,例如姿態解算(將陀螺儀和加速度計的數據融合,計算出物體的姿態)。

• 低功耗: 

○ 具有低功耗特性,適合用於電池供電的應用。


#應用:

MPU6050 廣泛應用於各種需要運動追蹤的領域,包括:

• 機器人: 

○ 用於機器人的姿態控制、平衡控制和導航。

• 無人機: 

○ 用於無人機的姿態穩定和飛行控制。

• 虛擬實境(VR)和擴增實境(AR): 

○ 用於頭戴式顯示器和控制器,追蹤使用者的頭部和手部運動。

• 運動追蹤: 

○ 用於運動分析、步態追蹤和手勢識別。

• 遊戲: 

○ 用於遊戲控制器,實現體感控制。

在機器人控制板中的作用:

在機器人控制板中,MPU6050 主要用於:

• 姿態估計: 

○ 提供機器人的姿態信息,例如傾斜角度和旋轉角度。

• 平衡控制: 

○ 幫助機器人保持平衡,特別是對於雙足或輪式機器人。

• 運動檢測: 

○ 檢測機器人的運動狀態,例如是否在移動、加速或減速。

• 震動檢測: 

○ 檢測機器人是否產生不正常的震動。

數位運動處理器(DMP)簡介

數位運動處理器(Digital Motion Processor,簡稱DMP)是整合在某些慣性測量單元(IMU)內的專用硬體處理器。

它的主要功能是處理來自陀螺儀和加速度計等感測器的原始數據,並將其轉換為更有用的運動資訊。


DMP 的主要功能:

• 感測器數據融合: 

○ DMP 能夠將來自陀螺儀和加速度計的數據進行融合,透過複雜的演算法(例如卡爾曼濾波器)來消除雜訊和誤差,並提供更準確的運動資訊。

• 姿態解算: 

○ DMP 可以計算出物體的姿態,包括傾斜角度、旋轉角度和方向。這對於需要精確姿態控制的應用(例如無人機和機器人)非常重要。

• 運動追蹤: 

○ DMP 可以追蹤物體的運動軌跡,並提供位置、速度和加速度等資訊。這對於運動分析、步態追蹤和手勢識別等應用很有用。

• 降低 CPU 負載: 

○ 由於 DMP 負責處理複雜的運動運算,因此可以減輕主處理器的負擔,使其能夠執行其他任務。

• 硬體加速: 

○ DMP 是專門設計用於運動處理的硬體,因此可以比軟體實現更快地執行運算。

DMP 的優點:

• 提高準確性: 

○ DMP 能夠提供更準確的運動資訊,因為它可以使用複雜的演算法來消除雜訊和誤差。

• 降低功耗: 

○ DMP 可以比軟體實現更有效地執行運動運算,因此可以降低功耗。

• 提高反應速度: 

○ DMP 可以更快地處理運動數據,因此可以提高系統的反應速度。

DMP 的應用:

• 無人機: 

○ DMP 用於無人機的姿態穩定和飛行控制。

• 機器人: 

○ DMP 用於機器人的姿態控制、平衡控制和導航。

• 虛擬實境(VR)和擴增實境(AR): 

○ DMP 用於頭戴式顯示器和控制器,追蹤使用者的頭部和手部運動。

• 運動追蹤: 

○ DMP 用於運動分析、步態追蹤和手勢識別。

• 遊戲: 

○ DMP 用於遊戲控制器,實現體感控制。

2025年4月9日 星期三

10 軸慣性導航 ARHS [CMP10A]

  "CMP10A" 相關的資訊,是 Yahboom 推出的一款 10 軸慣性導航 ARHS (Attitude and Heading Reference System) 感測器模組

這個模組整合了:

  • 3 軸陀螺儀 (Gyroscope)
  • 3 軸加速度計 (Accelerometer)
  • 3 軸磁力計 (Magnetometer)
  • 氣壓計 (Barometer)

因此,當您提到 "CMP10A IMU" 時,很可能指的是這款 Yahboom 的產品。

根據我搜尋到的資料,以下是 Yahboom CMP10A IMU 的一些技術規格和特性:

主要特性:

  • 10 軸感測器: 整合了三軸陀螺儀、三軸加速度計、三軸磁力計和氣壓計。
  • 通訊方式: 支援 USB、UART 和 I2C 多種通訊介面。
  • 內建演算法: 內建卡爾曼濾波器 (Kalman Algorithm),可穩定獲取並輸出姿態數據,例如歐拉角 (Roll, Pitch, Yaw)、四元數 (Quaternion)、位置、速度、加速度、角速度和磁場向量。
  • 高資料回傳率: 資料回傳率可達 200Hz。
  • 高精準度: 專為高精度慣性測量應用設計。
  • 金屬外殼: Yahboom 特有的金屬外殼,有助於散熱並減少外部環境的干擾。
  • ROS 支援: 支援 ROS 系統,並提供相關的教學和原始碼。
  • PC 軟體: 提供 PC 軟體,使用者可以即時調整模組參數,並透過 3D 模型即時反映模組的姿態。

一些可能的技术規格 (具體數值可能因文件版本而異,建議查閱 Yahboom 官方文件):

  • 陀螺儀 (Gyroscope):
    • 量程 (Range): 可能為 ±2000°/s (根據 Hiwonder IM10A 的規格推測,CMP10A 可能類似)
    • 零點漂移 (Zero Drift): 可能在 ±0.5 ~ ±1°/s 範圍內 (根據 Hiwonder IM10A 的規格推測)
  • 加速度計 (Accelerometer):
    • 量程 (Range): 可能為 ±16g (根據 Hiwonder IM10A 的規格推測)
  • 磁力計 (Magnetometer):
    • 量程 (Range): 可能是 ±1300 uT (根據 NGIMU 的規格推測,作為參考)
  • 氣壓計 (Barometer):
    • 用於測量氣壓和計算海拔高度。
  • 輸出數據:
    • 歐拉角 (Roll, Pitch, Yaw)
    • 四元數 (Quaternion)
    • 加速度 (Acceleration)
    • 角速度 (Angular Velocity)
    • 磁場向量 (Magnetic Field Vector)
    • 可能包含位置和速度資訊 (取決於內建演算法)
    • 氣壓 (Pressure)
    • 海拔高度 (Altitude)
  • 通訊介面:
    • USB
    • UART (預設 Baud Rate 可能為 921600)
    • I2C
  • 電源供應:
    • 通常為 3.3V 或 5V (建議查閱官方文件)
  • 尺寸:
    • 帶外殼尺寸可能約為 60mm x 46mm x 11mm (根據 AliExpress 的資訊)
  • 重量:
    • 可能約 50g (根據 Amazon UK 的資訊)
  • 資料更新率 (Output Data Rate):
    • 最高可達 200Hz。
  • 支援系統:
    • ROS1
    • ROS2
    • Windows (透過 PC 軟體)
    • 支援多種硬體平台,如 PC、Raspberry Pi、NVIDIA Jetson、STM32 等。

重要提示:

由於 "CMP10A" 似乎是 Yahboom 產品的特定型號,最準確和詳細的技術規格應參考 Yahboom 官方提供的 CMP10A IMU 的產品頁面、使用者手冊或技術規格書 (Datasheet)。 您可以在 Yahboom 的官方網站或相關的產品頁面尋找這些文件。

2025年3月24日 星期一

完整的 ORB-SLAM3 Docker 啟動與使用範例

 當然可以,這裡提供你一套 完整的 ORB-SLAM3 Docker 啟動與使用範例,適合你在乾淨環境中測試自有資料(像你之前處理的影片轉影格 + rgb.txt)。


🧱 假設你的資料結構如下:

bash
orbslam3_ws/ ├── Dockerfile ├── ORB_SLAM3/ ← GitHub clone 下來的 ORB_SLAM3 原始碼 ├── Vocabulary/ORBvoc.txt ← 詞彙檔 ├── my_dataset/ │ ├── slam_frames/ ← 拆出來的影格圖像 │ ├── rgb.txt ← 時間戳與圖像對應 │ └── camera.yaml ← 相機內參設定檔

Docker 會以當前目錄 orbslam3_ws/ 作為 build context,所以你必須確保:

orbslam3_ws/ ├── Dockerfile ├── ORB_SLAM3/ ← ✅ 這個資料夾必須存在!

🧩 修正步驟如下:

1️⃣ 複製 ORB-SLAM3 原始碼到該資料夾

bash
cd orbslam3_ws git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

這樣會產生:

orbslam3_ws/ORB_SLAM3

2️⃣ 確認 DockerfileORB_SLAM3 是同層


🧰 Dockerfile(支援 ORB-SLAM3 + GTSAM)

dockerfile
FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive # 基本工具與依賴 RUN apt update && apt install -y \ build-essential cmake git wget curl pkg-config \ libeigen3-dev libboost-all-dev libtbb-dev libyaml-cpp-dev \ libopencv-dev libpangolin-dev libglew-dev \ libpython3-dev python3 python3-pip # 安裝 GTSAM(用於 IMU 模式) WORKDIR /opt RUN git clone https://github.com/borglab/gtsam.git && \ cd gtsam && mkdir build && cd build && \ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local && \ make -j$(nproc) && make install # 複製 ORB-SLAM3 原始碼 WORKDIR /root COPY ORB_SLAM3 /root/ORB_SLAM3 # 編譯 ORB-SLAM3 WORKDIR /root/ORB_SLAM3 RUN chmod +x build.sh && ./build.sh # 預設工作目錄 WORKDIR /root/ORB_SLAM3

🏗️ 建立 Docker 映像

bash
cd orbslam3_ws docker build -t orbslam3 .

▶️ 啟動 Docker 容器並掛載資料

bash
xhost +local:root # 允許 GUI 顯示 docker run -it --rm \ --net=host \ --env DISPLAY=$DISPLAY \ --volume=$HOME/.Xauthority:/root/.Xauthority:rw \ --volume=$(pwd)/ORB_SLAM3:/root/ORB_SLAM3 \ --volume=$(pwd)/Vocabulary:/root/Vocabulary \ --volume=$(pwd)/my_dataset:/root/my_dataset \ orbslam3

🚀 Docker 容器內啟動 ORB-SLAM3(Monocular)

bash
cd /root/ORB_SLAM3 ./Examples/Monocular/mono_tum \ /root/Vocabulary/ORBvoc.txt \ /root/my_dataset/camera.yaml \ /root/my_dataset/rgb.txt \ /root/my_dataset/slam_frames

🎥 建議影格大小與 fps 與 camera.yaml 中一致(640x480、30Hz 等)


📄 camera.yaml 範例

yaml
%YAML:1.0 Camera.fx: 525.0 Camera.fy: 525.0 Camera.cx: 319.5 Camera.cy: 239.5 Camera.k1: 0.0 Camera.k2: 0.0 Camera.p1: 0.0 Camera.p2: 0.0 Camera.width: 640 Camera.height: 480 Camera.fps: 30.0 Camera.bf: 0.0 Camera.RGB: 1

🧪 執行結果

你會看到:

  • OpenCV 視窗顯示影像與特徵點

  • Pangolin 視窗顯示相機軌跡與建圖結果

結束後按 Ctrl+C,可在 terminal 中看到 summary 與儲存軌跡(可改程式匯出)


📁 Optional:將 pose 輸出為檔案

你可以編輯 Examples/Monocular/mono_tum.cc

cpp
SLAM.SaveKeyFrameTrajectoryTUM("KeyFrameTrajectory.txt");

然後重新 make,即可輸出 .txt 軌跡供你做後續分析或轉成 /odom


✅ 總結:快速跑 ORB-SLAM3 流程

bash
# 主機建映像 docker build -t orbslam3 . # 啟動容器 docker run -it --rm ... orbslam3 # 容器內執行 ./Examples/Monocular/mono_tum ORBvoc.txt camera.yaml rgb.txt slam_frames

如果你要跑 stereo / RGB-D / Mono+IMU 模式,我也可以幫你整理範例指令,或者加入 rosbag 播放、ROS Bridge 支援。

你是否要我幫你整合 docker + rosbag + ORB-SLAM3 自動啟動腳本?還是打包你的影片流程成一鍵跑 slam 的容器?我可以幫你完成 ✅


=== use Docker image cchicc/orb_slam3_ubuntu20.04 =========================

你提到的 Docker 映像:

cchicc/orb_slam3_ubuntu20.04
包含 ORB-SLAM3 + Ubuntu 20.04 + ROS Noetic

這是一個非常適合直接使用的容器環境,用來部署 ORB-SLAM3 到 ROS Noetic 專案中。


✅ 如何使用這個 Docker 映像

1️⃣ 拉取映像:

bash
docker pull cchicc/orb_slam3_ubuntu20.04

2️⃣ 執行容器(含 GUI 顯示與掛載)

bash
xhost +local:root docker run -it --rm \ --net=host \ --env DISPLAY=$DISPLAY \ --volume=$HOME/.Xauthority:/root/.Xauthority:rw \ --volume=$(pwd)/my_dataset:/root/my_dataset \ cchicc/orb_slam3_ubuntu20.04

這樣你就可以把你原本的影像資料(如 slam_frames + rgb.txt)掛入 /root/my_dataset 使用。


3️⃣ 容器內使用範例

bash
cd /root/ORB_SLAM3 ./Examples/Monocular/mono_tum \ Vocabulary/ORBvoc.txt \ /root/my_dataset/camera.yaml \ /root/my_dataset/rgb.txt \ /root/my_dataset/slam_frames

📁 相機設定 camera.yaml 範例

如果你沒有內參,可先用這個:

yaml
%YAML:1.0 Camera.fx: 525.0 Camera.fy: 525.0 Camera.cx: 319.5 Camera.cy: 239.5 Camera.k1: 0.0 Camera.k2: 0.0 Camera.p1: 0.0 Camera.p2: 0.0 Camera.width: 640 Camera.height: 480 Camera.fps: 30.0 Camera.bf: 0.0 Camera.RGB: 1

🎯 適合用於:

  • ✅ 開箱即用 ORB-SLAM3 測試影片

  • ✅ 配合 rosbag 播放 /camera/image_raw

  • ✅ 快速接上 ROS Noetic 專案做導航、地圖、視覺處理


如果你希望我幫你整合:

  • 把影片轉成 rgb.txt + slam_frames

  • 建立一鍵執行的 docker+bash 啟動腳本

  • 撰寫 ROS Launch 自動播放 rosbag 並串 ORB-SLAM3

我可以幫你出完整的 run_slam.sh + launch 結構 ✅
是否要我幫你做一份範本?只要提供影片或 rosbag 名稱即可。