welcom ! Handel home

顯示具有 ROS Gazebo 標籤的文章。 顯示所有文章
顯示具有 ROS Gazebo 標籤的文章。 顯示所有文章

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月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月20日 星期四

ROS 分散式IP 之 node 設定及通訊方式 (ROS master) link (ROS clinet)

 在 ROS1 (如 Noetic) 中,若 ROS Master 與 Client Node 分布於不同主機(多台電腦),你需要手動設定環境變數,讓節點之間能夠跨主機透過 TCP 通訊。


✅ 你問的兩個核心問題解答:

🔸 1. ROS Client 主機也要安裝 ROS 嗎?

👉 是的!

  • 即使只是運行 ROS Node,也必須安裝 ROS(至少基本套件 ros-<version>-ros-coreros-<version>-desktop)。
  • ROS Node 需要用到 roscpprospy 等函式庫來與 Master 溝通。
  • 不必安裝完整的 Gazebo/RViz,但 roscorerosnoderostopic 等基本功能必須存在。

🔸 2. ROS Master 與 Client 在不同 IP 該如何通訊?

💡 前提:兩台主機(例如 Master 為 192.168.0.10,Client 為 192.168.0.20)必須能 互 ping、無防火牆阻擋


📌 步驟:設定跨主機 ROS 通訊(環境變數)

ROS Master 機器設定

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.10

ROS Client 機器設定

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.20

🧠 說明:

變數名稱說明
ROS_MASTER_URI指定 ROS Master 的位置 (IP:Port)
ROS_HOSTNAME or ROS_IP自己的主機 IP,讓其他節點能回傳給你

🚨 注意:只能設定 ROS_HOSTNAMEROS_IP,不要同時設兩個!


🗂️ ROS 的檔案結構與網路通訊角色

🧩 ROS Master(主控端):

負責管理:

  • Node 名稱、註冊
  • Topic 訂閱者與發布者
  • Service 請求管理

啟動指令

bash
roscore

🧩 ROS Node(Client):

  • 可以是 Publisher / Subscriber / Service Client / Server。
  • 會從 ROS_MASTER_URI 取得其他節點的位置,再進行點對點 TCPROS 連線

🌐 節點連線架構示意:

plaintext
[Node A on 192.168.0.20] <------> [ROS Master on 192.168.0.10] <------> [Node B on 192.168.0.10] | | |---------------- TCPROS direct link ----------------------|

🧪 測試連線狀態

✅ 在 ROS Master 機器:

bash
roscore

✅ 在 Client 機器(設定環境變數後):

bash
rosnode list

👉 如果連線成功,你會看到來自 ROS Master 的節點清單。

✅ 訂閱測試:

在 Master 上發 topic:

bash
rostopic pub /chatter std_msgs/String "data: 'hello from master'"

在 Client 上訂閱:

bash
rostopic echo /chatter

✅ 建議:寫入 .bashrc

你可以將環境變數加入到對應主機的 ~/.bashrc

在 Master 機器中:

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.10

在 Client 機器中:

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.20

然後執行:

bash
source ~/.bashrc

🛠️ Troubleshooting Checklist

問題解法
ping 不通檢查防火牆、防火牆服務 (如 ufw) 是否有開放 TCP
沒有收到 topic檢查 topic 是否真的存在 (rostopic list),或主機名解析有問題
IP 變動建議固定 IP 或使用 ROS_IP 明確指定
Docker 中 ROS 多機使用 --net=host 模式,並設定 ROS_MASTER_URIROS_IP

✅ 小補充:必要 ROS 套件

若你不想在 Client 安裝整個 ROS,可以只裝核心元件:

bash
sudo apt install ros-noetic-ros-core

這樣可支援最基本的 Node 與 Topic 功能(無 RViz/Gazebo)。


✅ 總結

題目答案
Client 需要安裝 ROS 嗎?✅ 需要安裝 ROS(至少核心)
跨主機如何連線?✅ 設定 ROS_MASTER_URIROS_HOSTNAME/ROS_IP
IMU、Camera、Sensor 分布多台機器?✅ 各自設成 ROS Node,透過 ROS Master 協調
要用 Wi-Fi 還是 LAN?✅ 建議用有線網路(LAN)穩定性佳

若你提供你目前的 IP 配置與角色(Master 是哪一台、誰是 Client),我可以幫你生成 具體設定與 bashrc 檔案模版 👇

讓 imu_link 貼近 link_1 並確保 IMU 隨 link_1 一起運動

  讓 imu_link 貼近 link_1 並確保 IMU 隨 link_1 一起運動

目前 IMU 可能與 link_1 沒有貼合,導致它看起來懸浮或無法跟隨 link_1 運動。

我們需要 調整 imu_jointorigin 並確保它正確地附著到 link_1


📌 1️⃣ 修正 imu_joint 位置

目前 IMU 被定義為:

xml
<joint name="imu_joint" type="fixed"> <parent link="link_1"/> <child link="imu_link"/> <origin xyz="0 0 0.1"/> </joint>

🚨 問題:

  • imu_link 目前的 origin xyz="0 0 0.1",表示它在 link_1 上方 0.1m,但這可能不準確。
  • link_1 的實際幾何形狀 (STL 模型) 可能導致 IMU 懸空。

修正方法: 📌 imu_link 貼合 link_1

xml
<joint name="imu_joint" type="fixed"> <parent link="link_1"/> <child link="imu_link"/> <origin xyz="0 0 0.05"/> <!-- IMU 距離 link_1 只有 5cm --> </joint>

🔹 你可以根據 link_1 的 STL 模型來微調 xyz 位置!

  • 如果 IMU 懸浮,減小 z 值 (xyz="0 0 0.02")
  • 如果 IMU 被卡住或重疊,增加 z 值 (xyz="0 0 0.07")

📌 確保 IMUlink_1 適當位置

bash
roslaunch robot_arm_urdf robot_arm_control.launch

📌 如果 IMU 仍然沒有貼近 link_1,請用 rviz 查看模型

bash
rosrun rviz rviz

rviz 內手動檢查 imu_link 相對於 link_1 的位置


📌 2️⃣ 確保 IMU 正確感測 link_1 的運動

📌 加入 Gazebo IMU 插件

xml
<gazebo reference="imu_link"> <sensor type="imu" name="imu_sensor"> <update_rate>100.0</update_rate> <plugin name="imu_plugin" filename="libgazebo_ros_imu_sensor.so"> <alwaysOn>true</alwaysOn> <updateRate>100.0</updateRate> <bodyName>imu_link</bodyName> <topicName>imu/data</topicName> <frameName>imu_link</frameName> </plugin> </sensor> </gazebo>

這樣 IMU 會感測 link_1 的旋轉與加速度,並發送到 /imu/data

📌 監測 IMU 數據

bash
rostopic echo /imu/data

如果 IMU 沒有數據,請確認 imu_plugin 是否正確載入

bash
rosparam list | grep imu

📌 3️⃣ 測試 IMUlink_1 運動

📌 rosrun 直接控制 link_1 的旋轉

bash
rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory '{ joint_names: ["joint_1"], points: [{ positions: [1.57], # 旋轉 90 度 time_from_start: {secs: 2} }] }'

IMU 數據應該會變化,並反映 link_1 的旋轉

📌 監聽 IMU 數據

bash
rostopic echo /imu/data

如果 IMU 設定正確,你應該會看到 angular_velocity 變化


🚀 總結

項目**設定 / 調整影響
imu_joint 位置xyz="0 0 0.05"IMU 貼近 link_1
IMU 連接的關節parent="link_1"確保 IMU 跟隨 link_1 運動
Gazebo 插件libgazebo_ros_imu_sensor.soIMU 發布 /imu/data
測試 IMU 旋轉數據rostopic pub /robot_arm_controller/command確認 IMU 能感測 link_1

🚀 這樣 IMU 就能正確貼近 link_1 並測量其運動! 🚀

imu_link 解析與 link_1 追蹤設定檢查

 imu_link 解析與 link_1 追蹤設定檢查

ROS Gazebo / MoveIt! 內,IMU (Inertial Measurement Unit) 用來測量 

角速度 (gyroscope)、加速度 (accelerometer)、方向 (orientation)

並發布到 imu/data topic。

以下是 imu_linklink_1 之間的關係,以及如何確保 IMU 可以正確跟隨 link_1 運動


📌 1️⃣ imu_link 結構解析

xml
<link name="imu_link"> <inertial> <mass value="0.01"/> <origin xyz="0 0 0" /> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/> </inertial> <visual> <geometry> <sphere radius="0.02"/> </geometry> <material name="Gray"/> </visual> <collision> <geometry> <sphere radius="0.02"/> </geometry> </collision> </link>

imu_link 代表 IMU 的物理模型

  • inertial 設定:質量 0.01 kg,影響 Gazebo 物理運算
  • visual (可視化):IMU 以 球體 (radius=0.02m) 顯示,顏色為 Gray
  • collision (碰撞):和 visual 相同,影響 Gazebo 物理交互

📌 2️⃣ imu_joint 連接 imu_linkbase_link

xml
<joint name="imu_joint" type="fixed"> <parent link="base_link"/> <child link="imu_link"/> <origin xyz="0 0 0.1"/> </joint>

imu_jointimu_link 固定在 base_link

  • type="fixed"imu_link完全跟隨 base_link 運動
  • parent="base_link"imu_link 直接連結 base_link
  • child="imu_link"imu_link 是附屬元件
  • origin xyz="0 0 0.1"IMU 放在 base_link 上方 0.1m

🔹 🚨 但這樣 IMU 不會跟隨 link_1,需要改成掛載在 link_1 上!


📌 3️⃣ 讓 imu_link 跟隨 link_1

目前 IMU 掛載在 base_link,如果 link_1 轉動,IMU 不會跟隨
如果 IMU 應該裝在 link_1 上,請修改 parentlink_1

修改 imu_joint

xml
<joint name="imu_joint" type="fixed"> <parent link="link_1"/> <!-- 讓 IMU 連到 link_1 --> <child link="imu_link"/> <origin xyz="0 0 0.1"/> <!-- 放在 link_1 上方 10cm --> </joint>

🔹 這樣 IMU 會跟著 link_1 旋轉! 🎯


📌 4️⃣ 確保 IMU 正確發布數據

Gazebo 內,IMU 需要使用 libgazebo_ros_imu_sensor.so 插件,否則 IMU 只是一個靜態模型,不會發布任何數據!

gazebo 標籤內加入 IMU 插件

xml
<gazebo reference="imu_link"> <sensor type="imu" name="imu_sensor"> <update_rate>100.0</update_rate> <plugin name="imu_plugin" filename="libgazebo_ros_imu_sensor.so"> <alwaysOn>true</alwaysOn> <updateRate>100.0</updateRate> <bodyName>imu_link</bodyName> <topicName>imu/data</topicName> <frameName>imu_link</frameName> </plugin> </sensor> </gazebo>

這樣 Gazebo 會自動將 IMU 數據發布到 /imu/data

📌 啟動 Gazebo

bash
roslaunch robot_arm_urdf robot_arm_control.launch

📌 監聽 IMU 數據

bash
rostopic echo /imu/data

應該輸出

yaml
header: seq: 123 stamp: secs: 10 nsecs: 123456 frame_id: "imu_link" orientation: x: 0.001 y: -0.002 z: 0.003 w: 1.000 angular_velocity: x: 0.01 y: -0.01 z: 0.02 linear_acceleration: x: 0.05 y: -0.03 z: 9.81

表示 IMU 正確運作!


📌 5️⃣ Rviz 內可視化 IMU

📌 啟動 rviz

bash
rosrun rviz rviz

📌 rviz 1️⃣ 點擊 Add 2️⃣ 選擇 IMU 3️⃣ 設定 Topic/imu/data你應該會看到 IMU 的方向變化!


🚀 總結

項目**設定說明
IMU 連接的連結link_1IMU 會跟隨 link_1 旋轉
關節類型fixedIMU 固定在 link_1
Gazebo 插件libgazebo_ros_imu_sensor.soIMU 發布 /imu/data
監聽 IMU 數據rostopic echo /imu/data檢查 IMU 是否運作
Rviz 可視化Add -> IMU顯示 IMU 方向

🚀 這樣 IMU 就能跟隨 link_1 並正確發布數據! 🚀