2025年2月26日 星期三

(Robot_arm),gazebo.launch 分析

 gazebo.launch  檔案的作用是 在 Gazebo 中加載機械手臂模型,並提供基本的坐標變換與校準信號。以下是詳細解析:


1. 載入空的 Gazebo 世界

xml
<include file="$(find gazebo_ros)/launch/empty_world.launch" />
  • 這行 include 指令會加載 Gazebo 空白世界 (empty_world.launch)。
  • $(find gazebo_ros)/launch/empty_world.launch 來自 gazebo_ros package,這是一個標準的 Gazebo 啟動文件:
    • 啟動 Gazebo 模擬環境。
    • 沒有預設加載機器人或其他物件。

2. 設定坐標變換 (TF)

xml
<node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" />
  • 這行指令啟動 tf 變換發布器 (static_transform_publisher)。
  • 作用:
    • 靜態發布 base_footprintbase_link 的坐標變換
    • 設定 (x=0, y=0, z=0, roll=0, pitch=0, yaw=0),代表 base_linkbase_footprint 在同一個位置。
    • 40 Hz 的頻率持續發布。
  • 為什麼需要這個 TF?
    • 一般來說,機器人的 base_footprint 是它與地面的接觸點,而 base_link 是它的主體中心。
    • 在導航應用 (如 robot_localization) 中,這個 TF 變換通常是必要的。

3. 在 Gazebo 中生成機器人

xml
<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" args="-file $(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf -urdf -model robot_arm_urdf" output="screen" />
  • 這個節點 (node) 來自 gazebo_ros 套件,負責將機械手臂模型加載到 Gazebo
  • args 參數:
    • -file $(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf
      • 指定機器人的 URDF 文件 (來自 robot_arm_urdf package)。
    • -urdf:告訴 Gazebo 這個模型是 URDF 格式 (而非 SDF)。
    • -model robot_arm_urdf:在 Gazebo 內部的機器人名稱。
  • output="screen":確保節點輸出顯示在終端,以便檢查錯誤或加載資訊。

4. 發布假校準訊號

xml
<node name="fake_joint_calibration" pkg="rostopic" type="rostopic" args="pub /calibrated std_msgs/Bool true" />
  • 這是一個手動發布 /calibrated 訊號的 ROS 節點,目的是假裝機械手臂已完成關節校準
  • rostopic pub /calibrated std_msgs/Bool true
    • 直接向 /calibrated Topic 發布 true
    • 為什麼這樣做?
      • 在真實機器人中,關節校準 (joint calibration) 需要透過感測器或外部設備進行。
      • 某些控制器 (如 ros_control) 可能會 等待 /calibrated 訊號為 true 才開始運行,所以這裡手動發送 true,讓控制器可以繼續工作。

總結

這個 launch 檔案的主要功能:

  1. 啟動 Gazebo (空白世界)
  2. 設定 base_linkbase_footprint 的 TF 變換
  3. 在 Gazebo 中加載機器人 URDF 模型
  4. 發布 /calibrated 訊號,讓控制器可以運行

適用場景

  • 在 Gazebo 中測試機械手臂的加載 (不包含控制器)。
  • 為了開發控制器,手動繞過關節校準 (/calibrated)。
  • 準備讓其他 ROS 節點 (如 MoveIt!) 控制機械手臂

如果你想讓這個 launch 檔案更完整,可以:

  • 加入控制器 (透過 controller_manager)。
  • 加入 RViz 來可視化機械手臂狀態。
  • 設置初始關節位置 (spawn_model 時使用 -J joint_1 0.0 這類參數)。

有任何進一步需求都可以討論!🚀

(Robot_arm)display.launch 分析

 display.launch 檔案主要用於 ROS (Robot Operating System),負責啟動機械手臂 (robot_arm_urdf) 的可視化與狀態發布,並與 RViz 一起使用以進行機器人模型的觀察。以下是詳細的解析:


1. 定義引數 (Arguments)

xml
<arg name="model" /> <arg name="gui" default="False" />
  • model:一個未設定預設值的引數,可能用於指定不同的機器人模型 (但此 launch 檔案中未使用到它)。
  • gui
    • 預設值為 False,用來控制是否啟動 Joint State Publisher GUI (關節狀態發布器的圖形界面)。
    • 在某些情境下,可以透過 use_gui 來決定是否啟動該圖形界面。

2. 載入機器人模型 (URDF)

xml
<param name="robot_description" textfile="$(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf" />
  • 設定 robot_description 參數,內容來自機械手臂的 URDF (Unified Robot Description Format) 檔案。
  • $(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf
    • $(find robot_arm_urdf) 會尋找 ROS package robot_arm_urdf,並讀取其中的 urdf/robot_arm_urdf.urdf 文件。
    • 這個 URDF 文件描述機器人的關節、連結、材質等資訊,讓 ROS 可以建立對應的 TF (Transform) 資訊。

3. 設定 GUI 參數

xml
<param name="use_gui" value="$(arg gui)" />
  • use_gui 這個參數的值來自 gui 引數。
  • 它通常影響 Joint State Publisher 是否顯示 GUI:
    • True → 顯示一個 GUI 界面,讓使用者可以手動調整機器人的關節位置。
    • False → 只會發布關節狀態,不會開啟 GUI。

4. 啟動 Joint State Publisher

xml
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  • joint_state_publisher 是一個 ROS 節點,用於發布機器人的關節狀態 (sensor_msgs/JointState)。
  • 它的主要功能:
    1. 如果沒有實體硬體,它可以模擬機器人的關節運動。
    2. use_gui 設定為 True,它會開啟一個 GUI 來手動調整關節的角度。

5. 啟動 Robot State Publisher

xml
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  • robot_state_publisher 負責將機器人的 URDF 轉換成 TF 變換資訊
  • 它會根據 joint_state_publisher 發布的關節狀態 (/joint_states topic),計算並發布機器人各個關節的 TF (Transform) 資訊。
  • 這樣 RViz 就可以根據 TF 來正確顯示機器人的運動狀態。

6. 啟動 RViz

xml
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find robot_arm_urdf)/urdf.rviz" />
  • rviz 是 ROS 的 可視化工具,用來顯示機器人的 3D 模型、TF 變換、感測器數據等。
  • args="-d $(find robot_arm_urdf)/urdf.rviz"
    • -d 參數指定要載入的 RViz 配置檔案 (.rviz)
    • $(find robot_arm_urdf)/urdf.rviz 代表此 RViz 配置文件應該位於 robot_arm_urdf package 中。
    • RViz 配置檔案可以存儲:
      • 顯示哪些 topic (例如 /tf, /joint_states)。
      • 設定視角、顯示選項 (如機器人模型、3D Grid、關節軌跡等)。

總結

這個 launch 檔案的主要作用是:

  1. 加載機器人模型 (URDF),並將其存入 robot_description 參數。
  2. 啟動 joint_state_publisher 來發布機器人關節的狀態。
  3. 啟動 robot_state_publisher 來轉換關節資訊為 TF 變換 (供 RViz 使用)。
  4. 啟動 rviz 來視覺化機器人模型,並載入 .rviz 配置文件。

適用場景

  • 這個 launch 檔案適合用於:
    • 查看機器人 URDF 是否正確 (不需 Gazebo)。
    • 模擬機器人關節運動 (透過 joint_state_publisher GUI)。
    • 測試 RViz 配置,確保機器人模型與 TF 正確顯示。

如果你有進一步的需求,例如整合 Gazebo、加入控制器等,可以擴展這個 launch 檔案!🚀

(Robot_arm)arm_urdf.launch 分析

 這個 launch 檔案是用於 ROS (Robot Operating System) 的一個 Gazebo 模擬環境啟動文件,負責載入機械手臂 (robot arm) 模型,設定機器人初始位置與狀態,並啟動相關控制節點。以下是詳細解析:


1. 定義引數 (Arguments)

xml
<arg name="arg_x" default="0.00" /> <arg name="arg_y" default="0.00" /> <arg name="arg_z" default="0.00" /> <arg name="arg_R" default="0.00" /> <arg name="arg_P" default="0.00" /> <arg name="arg_Y" default="0.00" />
  • 這些 arg 用來設定機器人模型在 Gazebo 中的初始位置與旋轉角度 (RPY)。
  • arg_x, arg_y, arg_z:機器人初始的 X、Y、Z 位置座標。
  • arg_R, arg_P, arg_Y:機器人初始的旋轉角度 (Roll, Pitch, Yaw)。

2. 載入機器人模型 URDF

xml
<param name="robot_description" textfile="$(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf"/>
  • 這行參數 (param) 負責加載機器人模型的 URDF (Unified Robot Description Format) 文件。
  • 這個 URDF 檔案描述機器人的連結 (links) 和關節 (joints) 配置。
  • $(find robot_arm_urdf) 會尋找 ROS package robot_arm_urdf,並載入該 package 中的 URDF 檔案。

3. 加載空的 Gazebo 環境

xml
<include file="$(find gazebo_ros)/launch/empty_world.launch" />
  • 這行指令會啟動一個空的 Gazebo 世界,準備讓機械手臂模型加入。
  • $(find gazebo_ros)/launch/empty_world.launch 來自 gazebo_ros 套件,提供一個基礎的 Gazebo 模擬環境。

4. 設定 TF (坐標變換)

xml
<node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" />
  • tf 是 ROS 提供的變換坐標系統工具,用於機器人模型的不同參考點轉換。
  • static_transform_publisher 負責發布一個靜態的坐標變換:
    • 位置 (x=0, y=0, z=0)
    • 旋轉 (roll=0, pitch=0, yaw=0)
    • 這個變換描述 base_footprint 座標系與 base_link 之間的靜態關係。
    • 發布頻率為 40 Hz

5. 在 Gazebo 中生成機器人模型

xml
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model robot_arm_urdf -x $(arg arg_x) -y $(arg arg_y) -z $(arg arg_z) -Y $(arg arg_Y) -J joint_1 0.0 -J joint_2 0.0 -J joint_3 0.0 -J joint_4 0.0 -J joint_5 0.0 -J joint_6 0.0"/>
  • 這個節點 (node) 來自 gazebo_ros 套件,負責將機器人模型加載到 Gazebo 中。
  • -param robot_description:使用前面定義的 robot_description URDF 來加載機器人。
  • -urdf:指明這是一個 URDF 格式的模型。
  • -model robot_arm_urdf:設定機器人的名稱為 robot_arm_urdf
  • -x, -y, -z, -Y:設置機器人在 Gazebo 中的初始位置。
  • -J joint_X 0.0:初始化每個關節 (joint_1 ~ joint_6) 的角度為 0.0

(備註:有一段被註解的 spawn_urdf,但主要的功能與這個版本類似,只是排版不同。)


6. 加載關節軌跡控制器

xml
<rosparam file ="$(find robot_arm_urdf)/config/joint_trajectory_controller.yaml" command="load"/>
  • rosparam 讀取並加載 joint_trajectory_controller.yaml 檔案。
  • 該 YAML 檔案內部應該包含關節控制器的設定,例如:
    • 控制模式 (位置控制、速度控制、力矩控制等)
    • 關節名稱與限制
    • PID 參數

7. 啟動控制器

xml
<node name= "controller_spawner" pkg= "controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller robot_arm_controller hand_ee_controller"/>
  • 啟動 controller_manager 來管理 ROS 控制器。
  • joint_state_controller:負責發布當前關節的狀態 (如位置、速度)。
  • robot_arm_controller:控制機械手臂的運動 (應該對應 joint_trajectory_controller)。
  • hand_ee_controller:可能負責機械手末端執行器 (End Effector, EE) 的控制。

8. 啟動 robot_state_publisher

xml
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen"/>
  • robot_state_publisher 是 ROS 用來發布機器人關節狀態 (TF 變換) 的工具。
  • 這樣 RViz (ROS 視覺化工具) 就可以根據機器人狀態來顯示其模型。

總結

這個 launch 檔案的主要作用:

  1. 初始化變數:定義機器人的初始位置與旋轉角度 (arg_x, arg_y, arg_z, arg_R, arg_P, arg_Y)。
  2. 加載 URDF 模型:載入機器人模型 (robot_description)。
  3. 啟動 Gazebo:打開一個空的 Gazebo 模擬環境。
  4. 發布靜態坐標變換 (tf 用於 base_linkbase_footprint)。
  5. 在 Gazebo 中生成機器人 (spawn_urdf)。
  6. 加載關節控制器 (joint_trajectory_controller.yaml)。
  7. 啟動控制器管理器 (controller_manager)。
  8. 發布機器人狀態 (robot_state_publisher),讓 TF 可以正確顯示關節運動。

這樣的 launch 檔案主要用於 ROS + Gazebo 模擬機械手臂,確保:

  • 機器人模型能正確載入。
  • 在 Gazebo 中出現並能被控制。
  • 透過 controller_manager 管理機械手臂關節的運動。


Gazebo 啟動後的ROS 內建節點 (nodes) 和話題 (topics)

 🚀 ROS Gazebo 啟動後的內建節點 (nodes) 和話題 (topics)

Gazebo 與 ROS 整合 後,啟動 Gazebo 模擬環境 (gazebo_ros) 會產生一系列 內建的 ROS 節點與話題,這些節點和話題用於:

  • 控制模擬機器人
  • 發佈模擬環境的狀態
  • 提供感測器數據
  • 允許 ROS 節點與 Gazebo 互動

📌 如何啟動 Gazebo 與 ROS

sh
roslaunch gazebo_ros empty_world.launch

這將會啟動 Gazebo 並加載一個空場景 (empty_world)。

如果你要載入機器人:

sh
roslaunch <your_robot_package> <your_robot>.launch

例如:

sh
roslaunch turtlebot3_gazebo turtlebot3_world.launch

🟢 啟動後的內建節點 (rosnode list)

當 Gazebo 啟動後,執行:

sh
rosnode list

你會看到以下內建節點:

節點名稱功能
/gazeboGazebo 主控節點,負責整個模擬環境的運行
/gazebo_gui控制 Gazebo 圖形界面 (GUI)
/clock提供模擬時間
/rosout記錄並發布 ROS 記錄訊息

如果有加載機器人,可能還會有:

機器人相關節點功能
/robot_state_publisher發佈機器人連桿 (TF) 變換關係
/controller_manager控制器管理,負責運動控制
/joint_state_publisher發佈關節 (/joint_states)

🔵 啟動後的內建話題 (rostopic list)

sh
rostopic list

你會看到以下話題:

1️⃣ Gazebo 基礎話題

話題名稱類型功能
/gazebo/link_statesgazebo_msgs/LinkStates發佈所有模型的 link 狀態 (位置、方向)
/gazebo/model_statesgazebo_msgs/ModelStates發佈所有模型的 整體位姿 (pose, twist)
/gazebo/set_model_stategazebo_msgs/SetModelState設定 模型的位置
/gazebo/set_link_stategazebo_msgs/SetLinkState設定 Link 的狀態
/gazebo/reset_simulationstd_srvs/Empty重置整個模擬
/gazebo/reset_worldstd_srvs/Empty重置世界但不影響時間
/gazebo/pause_physicsstd_srvs/Empty暫停物理模擬
/gazebo/unpause_physicsstd_srvs/Empty恢復物理模擬

2️⃣ 模擬時間 (/clock)

話題名稱類型功能
/clockrosgraph_msgs/ClockGazebo 內部時間,ROS 會根據此時間同步

📌 使用範例

sh
rostopic echo /clock

輸出:

yaml
clock: secs: 123 nsecs: 456789000

這表示 Gazebo 模擬時間 已經運行 123 秒


3️⃣ 機器人控制 (/cmd_vel/joint_states)

話題名稱類型功能
/cmd_velgeometry_msgs/Twist控制機器人速度 (線速度 + 角速度)
/joint_statessensor_msgs/JointState提供機器人的關節狀態 (位置、速度、力矩)

📌 控制機器人移動

如果機器人支援 cmd_vel,可用以下方式讓機器人前進:

sh
rostopic pub /cmd_vel geometry_msgs/Twist "linear: {x: 0.5, y: 0.0, z: 0.0} angular: {x: 0.0, y: 0.0, z: 0.0}"

這會讓機器人 以 0.5 m/s 的速度前進


4️⃣ 感測器數據 (/camera/image_raw/scan)

如果模擬環境中有感測器,例如相機或雷射雷達 (LiDAR),會額外出現這些話題:

話題名稱類型功能
/camera/image_rawsensor_msgs/Image相機拍攝的影像
/scansensor_msgs/LaserScan雷射雷達 (LiDAR) 掃描數據
/imu/datasensor_msgs/ImuIMU 傳感器數據 (加速度、角速度)

📌 監聽相機影像

sh
rostopic echo /camera/image_raw

📌 監聽 LiDAR 掃描數據

sh
rostopic echo /scan

📌 Gazebo 內建節點與話題列表

🌟 1. Gazebo 內建節點 (rosnode list)

節點名稱功能
/gazeboGazebo 模擬管理
/gazebo_gui控制 Gazebo 圖形界面
/clock提供模擬時間
/rosout記錄 ROS 記錄訊息
/robot_state_publisher發佈機器人狀態
/joint_state_publisher發佈關節狀態

🌟 2. Gazebo 內建話題 (rostopic list)

話題名稱類型功能
/gazebo/model_statesgazebo_msgs/ModelStates獲取機器人和物體的狀態
/gazebo/set_model_stategazebo_msgs/SetModelState設定機器人的位置
/cmd_velgeometry_msgs/Twist控制機器人運動
/joint_statessensor_msgs/JointState監測機器人關節狀態
/scansensor_msgs/LaserScan雷射雷達 (LiDAR) 數據
/camera/image_rawsensor_msgs/Image相機影像
/clockrosgraph_msgs/Clock模擬時間

🔎 總結

Gazebo 在 ROS 中是一個強大的模擬工具,啟動後會產生許多內建節點與話題,用於控制機器人、監測環境以及提供模擬時間
關鍵節點 包括 /gazebo (管理模擬)、/clock (同步時間) 和 /cmd_vel (控制機器人移動)。
關鍵話題 包括 /gazebo/model_states (獲取機器人位置)、/cmd_vel (控制機器人) 和 /scan (雷射雷達數據)。

🚀 這些知識對於開發 ROS 機器人模擬與控制至關重要! 🚀




ROS2 中取代 roscore 的 DDS 機制

 ROS2 中取代 roscore 的機制

ROS1 中,roscore 是整個 ROS 系統的核心,負責管理 節點、話題 (Topics)、參數 (Parameters) 和 服務 (Services)。但在 ROS2 中,沒有 roscore,因為 ROS2 採用了去中心化架構,也就是說,不需要 ROS Master 來協調節點間的通訊。

📌 roscore 在 ROS1 中的主要功能

功能ROS1 (roscore) 負責ROS2 替代方案
節點發現 (Node Discovery)rosmasterDDS (Data Distribution Service)
話題管理 (Topics Management)rosmasterDDS + ros2 topic 工具
參數伺服器 (Parameter Server)rosparamros2 param 工具
服務管理 (Service Management)rosmasterDDS + ros2 service 工具
記錄日誌 (Logging)/rosoutros2 logging (內建到節點)

ROS2 如何取代 roscore

ROS2 中,roscore 被拆分成不同的機制:

  1. 去中心化架構

    • ROS2 使用 DDS (Data Distribution Service) 作為 通信中介,不需要 rosmaster 來維護節點、話題或服務的狀態。
    • 節點一啟動,就能自動發現彼此 (Discovery),這是 DDS 內建的功能。
  2. 節點發現 (Discovery)

    • ROS2 使用 DDS 動態發現節點,類似 roscore 但完全分散式。
    • 可以使用:
      sh
      ros2 node list
      來檢查有哪些節點正在運行。
  3. 話題管理 (Topics)

    • ROS1 需要 roscore 來維護話題列表 (rostopic list)。
    • ROS2 直接透過 DDS 管理,可以使用:
      sh
      ros2 topic list
      來查看目前的話題。
  4. 參數伺服器 (Parameter Server)

    • ROS1 使用 rosparam 作為中央參數伺服器。
    • ROS2 的節點 各自管理自己的參數,可以透過:
      sh
      ros2 param list
      來查看所有節點的參數。
  5. 日誌 (Logging)

    • ROS1 使用 /rosout 來記錄所有節點的日誌。
    • ROS2 內建 統一的日誌機制 (rcl_logging),可以直接查詢:
      sh
      ros2 topic echo /rosout

📌 ROS2 的 roscore 替代方案

雖然 ROS2 沒有 roscore,但仍有一些等效指令可用:

1️⃣ 啟動 ROS2 的核心功能

sh
ros2 daemon start

這會啟動 ROS2 後台管理程序 (ros2 daemon),讓指令運行更快。


2️⃣ 查詢 ROS2 節點

sh
ros2 node list

顯示當前運行的所有節點。


3️⃣ 查詢 ROS2 話題

sh
ros2 topic list

檢視目前的話題列表,等效於 ROS1 的 rostopic list

監聽某個話題:

sh
ros2 topic echo /example_topic

4️⃣ 查詢 ROS2 參數

sh
ros2 param list

列出所有節點的參數。

設定參數:

sh
ros2 param set /my_node my_param 42

5️⃣ 查詢 ROS2 服務

sh
ros2 service list

等效於 ROS1 的 rosservice list,列出當前的 ROS2 服務。

呼叫某個服務:

sh
ros2 service call /example_service std_srvs/srv/Trigger "{}"

🔎 roscore 在 ROS2 中的對應指令

ROS1 (roscore 功能)ROS2 替代指令
roscore 啟動🚫 不需要
rosnode listros2 node list
rostopic listros2 topic list
rostopic echo /topicros2 topic echo /topic
rosparam listros2 param list
rosservice listros2 service list
/rosout (日誌)ros2 topic echo /rosout

🚀 總結

  1. ROS2 不需要 roscore,因為它採用了去中心化架構,由 DDS 負責節點發現與通訊
  2. 所有 roscore 的功能(話題管理、節點管理、參數伺服器等)已被 ros2 CLI 指令取代
    • ros2 node list 取代 rosnode list
    • ros2 topic list 取代 rostopic list
    • ros2 param list 取代 rosparam list
    • ros2 service list 取代 rosservice list
  3. ROS2 仍有 ros2 daemon 來加速 CLI 查詢,但不是 roscore

🔹 ROS2 更加靈活,不再依賴中心化的 roscore,並且透過 DDS 自動管理通訊! 🚀

ROS1 roscore 介紹 for rosmaster 核心功能

 ROS1 roscore 介紹

📌 roscore 是什麼?

ROS1 中,roscoreROS 主節點 (Master),負責管理 節點間的通訊。它相當於 ROS 系統的 中央伺服器,用來協調所有的 ROS 節點。

🚀 roscore 的作用

  • 啟動 ROS Master (rosmaster),用於管理節點與話題 (topics)。
  • 啟動 ROS 參數伺服器 (rosparam),用於儲存全局參數。
  • 啟動 ROS 記錄與日誌系統 (rosout),提供日誌記錄與錯誤回報機制。

🔧 roscore 啟動後產生的 Topics

執行 roscore 後,使用以下指令檢視 系統內建的話題 (topics)

sh
rostopic list

常見的 系統內建 ROS 話題

Topic 名稱類型 (Message Type)功能
/rosoutrosgraph_msgs/Log記錄 ROS 節點的日誌與錯誤訊息
/rosout_aggrosgraph_msgs/Log聚合所有日誌資訊,提供更完整的記錄
/clock (可選)rosgraph_msgs/Clock提供 ROS 時間訊號,常用於模擬環境

這些話題由 roscore 內建的 rosout 節點 (/rosout) 自動建立。


📡 roscore API 與功能

roscore 本身不提供 API,但 roscore 啟動後,ROS Master (rosmaster) 會提供 ROS XMLRPC API,允許開發者查詢與操作 ROS 內部狀態。

🔹 ROS Master XMLRPC API

可透過 rosmaster 提供的 HTTP 服務 (默認 http://localhost:11311) 進行操作,主要函式包括:

函式名稱功能範例
registerPublisher註冊一個新的話題 (Topic)rospy.Publisher() 內部呼叫
registerSubscriber註冊一個新的訂閱者 (Subscriber)rospy.Subscriber() 內部呼叫
lookupNode查找 ROS 節點名稱rosnode info /node_name
getSystemState獲取目前的話題、服務與節點狀態rosservice call /rosapi/get_system_state
getTopicTypes獲取目前可用的話題類型rosservice call /rosapi/get_topic_types

💻 roscore 相關指令與 API 呼叫範例

📌 1. 啟動 roscore

sh
roscore

啟動後,會看到類似輸出:

bash
... logging to ~/.ros/log/... started roslaunch server http://localhost:34311/ ros_comm version 1.15.9 SUMMARY ======== PARAMETERS * /rosdistro: noetic * /rosversion: 1.15.9 NODES / rosout (rosout)

📌 2. 查詢目前話題

sh
rostopic list

範例輸出:

bash
/rosout /rosout_agg

進一步檢視 /rosout 訊息格式:

sh
rostopic type /rosout

輸出:

mathematica
rosgraph_msgs/Log

檢視訊息內容:

sh
rostopic echo /rosout

📌 3. 查詢參數伺服器

roscore 會自動啟動 參數伺服器,可使用 rosparam 操作:

sh
rosparam list

輸出:

bash
/rosdistro /rosversion

讀取 ROS 參數:

sh
rosparam get /rosversion

輸出:

1.15.9

📌 4. 使用 Python API 呼叫 ROS Master

可以使用 xmlrpc.client 直接呼叫 ROS Master API:

python
import xmlrpc.client # 連接到 ROS Master (默認在 http://localhost:11311) ros_master = xmlrpc.client.ServerProxy("http://localhost:11311") # 查詢 ROS 系統狀態 code, msg, system_state = ros_master.getSystemState("/test_client") print("Topics:", system_state[0]) # 發布中的話題 (publishers) print("Services:", system_state[2]) # 服務 (services)

📌 5. 查詢目前運行中的節點

sh
rosnode list

範例輸出

bash
/rosout

查詢 /rosout 節點資訊:

sh
rosnode info /rosout

🔎 roscore 相關 API 與指令總結

功能指令 / API用途
啟動 ROS Masterroscore啟動 ROS 核心服務
列出所有 ROS 話題rostopic list顯示所有可用的話題
查詢某個話題的型別rostopic type /rosout查詢某個話題的訊息格式
監聽話題數據rostopic echo /rosout監聽 /rosout 訊息
列出目前 ROS 節點rosnode list顯示所有已啟動的節點
查詢某個節點資訊rosnode info /rosout查看某個節點的詳細資訊
列出參數伺服器內的參數rosparam list查詢所有儲存的參數
讀取某個參數的值rosparam get /rosversion取得 ROS 版本參數
Python API (系統狀態)getSystemState("/test_client")取得話題、服務與節點資訊

📌 總結

roscore 是 ROS1 的核心服務,用來管理 節點、話題、服務與參數
✅ 它自動啟動 /rosout 話題來記錄 所有 ROS 節點的日誌
✅ 可以透過 rostopicrosnoderosparam 來檢查系統狀態。
✅ 也可以使用 Python XMLRPC API 來查詢 ROS Master 狀態。

🚀 這些工具和指令是管理 ROS 系統的關鍵,確保你的機器人應用運行順暢! 🚀


強制停止  ros node command

$rosnode kill -a

方法使用場景指令
rosnode kill正常關閉特定節點rosnode kill /node_name
Ctrl + C在終端手動運行 rosrunroslaunchCtrl + C
kill強制終止特定節點kill -9 <PID>
pkill直接結束 Python 腳本pkill -f script.py
killall關閉所有 ROS 節點killall -9 rosmaster

如果你只是想停止單個節點,最好的方式是 rosnode kill

如果節點無法關閉,可以使用 kill -9 <PID> 強制終止。