2025年3月11日 星期二

(Robot_arm) robotxtest5 prj 關節定義控制

 #robotxtest5 prj 控制關節定義及範例

"joint_1"  Base_link 基座 範圍 (0    .. +360" )

"joint_2"  支架1  範圍 (-90"  .. +90" )

"joint_3"  支架2  範圍 (-90"  .. +90" )

"joint_4"  支架3  範圍 (-90"  .. +90" )

"joint_5"  手軸 旋轉 範圍 (  0"  ..   180"   )

"joint_6"  左夾  範圍 (  0m    ..  0.030m)

"joint_7"  右夾  範圍 (-0.030m ..  0m    )


$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory '

joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6", "joint_7"]

points:

  - positions: [0 , 0, 0 , 0 ,0 , 0.0 ,0.0 ]

    time_from_start: {secs: 3, nsecs: 0}'

ROS Gazebo 清除方法 and Docker exec Gazebo Path

 

ROS Gazebo 清除方法

當 Gazebo 出現異常或機器人模型錯誤時,可以透過以下方法來 重置、清除、或完全重新啟動 Gazebo。


1. 重置 Gazebo 物理引擎

如果 Gazebo 模擬卡住或機器人無法運動,可以嘗試 重置 Gazebo 物理狀態

bash
rosservice call /gazebo/reset_simulation

重置整個 Gazebo 模擬,包括時間、機器人狀態、關節位置等

如果只想 重置機器人的位置與關節狀態(保留時間):

bash
rosservice call /gazebo/reset_world

重置世界但不影響時間進度


2. 刪除 Gazebo 內的機器人

如果想要 刪除機器人模型 並重新載入:

bash
rosservice call /gazebo/delete_model '{model_name: "robot_arm"}'

刪除指定的機器人 robot_arm(名稱需與 rosparam get /robot_description 內的機器人名稱一致)。

如果需要 刪除所有模型

bash
for model in $(rosservice call /gazebo/get_world_properties | grep name | awk -F'"' '{print $2}'); do rosservice call /gazebo/delete_model "{model_name: '$model'}" done

刪除 Gazebo 內所有模型(包括機器人、環境物件)。


3. 重新載入機器人模型

當機器人模型消失或有問題時,可以手動 重新載入機器人

bash
roslaunch robot_arm_urdf robot_arm_control.launch

重新啟動機械手臂控制的 Launch 檔案

或者手動 重載 URDF

bash
rosparam load ~/data/robotxtest5_ws/src/robot_arm_urdf/urdf/robot_arm_urdf.urdf robot_description

4. 清除 Gazebo 內的 Topic 訂閱

如果 Gazebo 內部 Topics 出錯,可以使用以下指令重新整理:

bash
rosservice call /gazebo/clear_joint_forces rosservice call /gazebo/clear_body_wrenches

清除關節與機械手臂上的力矩,避免無法運動


5. 停止並重新啟動 Gazebo

如果 Gazebo 無法正常運行,可手動 關閉並重新啟動

bash
killall -9 gzserver gzclient roslaunch gazebo_ros empty_world.launch

強制關閉 Gazebo 並重新啟動


6. 清除 Gazebo 殘存記錄

如果 Gazebo 長時間運行導致緩存積累,可手動刪除 暫存檔案

bash
rm -rf ~/.gazebo/log/*

清除 Gazebo 紀錄檔案,避免影響新測試。


7. 確保 Gazebo 物理引擎沒有暫停

如果機器人卡住,確認 Gazebo 是否暫停

bash
rosservice call /gazebo/unpause_physics

解除 Gazebo 物理引擎的暫停狀態

如果需要暫停:

bash
rosservice call /gazebo/pause_physics

8. 清除並完全重啟 ROS 與 Gazebo

如果所有方法都無效,可以完全 重新啟動 ROS 與 Gazebo

bash
rosnode kill -a killall -9 gzserver gzclient roscore & roslaunch gazebo_ros empty_world.launch

清除所有 ROS 節點、重啟 ROS 核心與 Gazebo


總結

方法指令功能
重置 Gazeborosservice call /gazebo/reset_simulation重置整個 Gazebo 模擬
重置世界rosservice call /gazebo/reset_world重置機器人位置但保留時間
刪除機器人rosservice call /gazebo/delete_model '{model_name: "robot_arm"}'刪除特定機器人
刪除所有模型`for model in $(rosservice call /gazebo/get_world_propertiesgrep name
重新載入機器人roslaunch robot_arm_urdf robot_arm_control.launch重新啟動機器人控制 Launch
清除 Gazebo 力矩rosservice call /gazebo/clear_joint_forces清除機械手臂的力矩
重啟 Gazebokillall -9 gzserver gzclient && roslaunch gazebo_ros empty_world.launch強制關閉並重新啟動 Gazebo
清除暫存檔案rm -rf ~/.gazebo/log/*刪除 Gazebo 記錄檔
解除暫停rosservice call /gazebo/unpause_physics恢復 Gazebo 物理引擎
完全重啟 ROS & Gazeborosnode kill -a && killall -9 gzserver gzclient && roscore & roslaunch gazebo_ros empty_world.launch完全清除 ROS 並重新啟動

這些方法可以有效解決 Gazebo 模擬卡住、機器人無法運動、URDF 錯誤等問題,建議 依序嘗試 找出適合的清除方式! 🚀

=================================================================================


在執行 docker exec -it image_name bash 時,

如果希望 直接切換到指定目錄

可以使用以下幾種方法:


方法 1:直接使用 cd 切換目錄

bash
docker exec -it image_name bash -c "cd /your/path && bash"

執行後,容器內的 shell 會直接位於 /your/path


方法 2:使用 sh 並切換目錄

如果你的容器環境 沒有 bash,只有 sh,可以改為:

bash
docker exec -it image_name sh -c "cd /your/path && sh"

適用於 Alpine Linux 或精簡版容器 (sh 取代 bash)


方法 3:在 bash 啟動時執行 cd

bash
docker exec -it image_name bash --rcfile <(echo "cd /your/path")

利用 --rcfilebash 啟動時自動執行 cd /your/path


方法 4:開啟新 shell 並設定環境變數

如果 cd 之後希望 環境變數保持有效,可以使用:

bash
docker exec -it image_name bash -c "cd /your/path; exec bash"

這樣 cd 會生效,並且 bash 會以新的 shell 環境啟動


方法 5:Docker 內部直接執行命令

如果只是要在容器內執行該目錄的指令,不一定要進入 shell,可以直接:

bash
docker exec -it image_name bash -c "cd /your/path && ls -la"

這樣 cd 進目錄後,執行 ls -la,然後退出 shell


總結

指令說明
docker exec -it image_name bash -c "cd /your/path && bash"進入容器並切換到 /your/path
docker exec -it image_name sh -c "cd /your/path && sh"使用 sh 進入並切換目錄 (適用於 Alpine)
docker exec -it image_name bash --rcfile <(echo "cd /your/path")透過 --rcfilebash 啟動時執行 cd
docker exec -it image_name bash -c "cd /your/path; exec bash"確保 cd 之後 bash 環境維持不變
docker exec -it image_name bash -c "cd /your/path && ls -la"進入目錄後執行命令,然後退出

這些方法都可以幫助你 docker exec 內部直接切換到指定目錄!🚀

(Robot_arm)手動發送 Joint Trajectory

 

手動發送 Joint Trajectory

如果要 手動發送 Joint Trajectory 訊息 而不使用 rospy.Publisher,可以直接使用 rostopic pub 指令發送 trajectory_msgs/JointTrajectory 訊息。


手動發送 Joint Trajectory

bash
rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6"] points: - positions: [0.2, -0.5, 0.8, -1.2, 0.3, 0.1] time_from_start: {secs: 5, nsecs: 0}'

參數說明

參數說明
/robot_arm_controller/commandROS Topic,負責接收 Joint Trajectory 指令
trajectory_msgs/JointTrajectory訊息類型,包含關節名稱、目標位置與時間
joint_names指定控制的關節名稱 (需符合 URDF)
points關節的目標位置
positions設定目標關節角度
time_from_start運動完成的時間 (秒)

測試不同的關節角度

可以更改 positions 值來測試不同的關節運動:

bash
rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3"] points: - positions: [0.0, 0.5, -1.0] time_from_start: {secs: 3, nsecs: 0}'

此指令會讓 joint_1, joint_2, joint_3 在 3 秒內移動到新的位置

這樣可以 不寫 Python 程式碼,直接在終端機手動發送訊息測試機械手臂動作!


#moveit_ws prj 控制關節定義及範例

"joint_1" 鞋軸 前後擺 範圍 (-45 .. +45)

"joint_2" 鞋面 左右擺 範圍 (-45 .. +45)

"joint_3" Y軸行程 前後動 範圍 (-0.170m .. 0m)

"joint_4" X軸行程 左右動 範圍 (-0.120m .. 0m)

"joint_5" Z軸行程 上下動 範圍 (-0.030m .. 0m)


#歸零

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, 0.0 , 0.0 ,0.0] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

#joint_1 (move demo)

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [-45 , 0, 0.0 , 0.0 ,0.0] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [45 , 0, 0.0 , 0.0 ,0.0] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

#joint_2 (move demo)

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 ,-45, 0.0 , 0.0 ,0.0] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 45, 0.0 , 0.0 ,0.0]

time_from_start: {secs: 3, nsecs: 0}'

=============================================================

#joint_3 (move demo)

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, -0.080 , 0.0 ,0.0] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, -0.170 , 0.0 ,0.0]

time_from_start: {secs: 3, nsecs: 0}'

=============================================================

#joint_4 (move demo)

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, 0.0 , -0.060 ,0.0] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, 0.0 , -0.120 ,0.0]

time_from_start: {secs: 3, nsecs: 0}'

=============================================================

#joint_5 (move demo)

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, 0.0 , 0.0 , -0.015] time_from_start: {secs: 3, nsecs: 0}'

=============================================================

$rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_ 1", "joint_2", "joint_3", "joint_4", "joint_5"]

points: - positions: [0 , 0, 0.0 , 0.0 ,-0.030]

time_from_start: {secs: 3, nsecs: 0}'

=============================================================









2025年3月10日 星期一

ROS 主要指令介紹與功能參數說明

指令主要用途
rosservice管理 ROS 服務 (Services),用於呼叫、查詢、管理 ROS 服務
rosparam管理 ROS 參數 (Parameters),用於設定、查詢、刪除參數
roslaunch啟動多個 ROS 節點,可同時啟動多個節點與設定參數
rosrun單獨啟動 ROS 節點,適合測試特定節點
rostopic管理 ROS Topics,可查詢、發送、訂閱 ROS Topics
rosnode管理 ROS 節點,查詢、關閉、監視 ROS Nodes

這些指令是 ROS 開發中 最常用的工具


ROS 主要指令介紹與功能參數說明

以下是 ROS (Robot Operating System) 常用的指令,包含其 功能、參數說明


1. rosservice - 服務管理

功能

  • 用於 查詢、呼叫和管理 ROS 服務 (Services)。
  • ROS 服務 是一種 請求-回應 (Request-Response) 模式的通訊機制。

常用指令

指令功能
rosservice list列出所有可用的 ROS 服務
rosservice call /service_name [args]呼叫指定的 ROS 服務
rosservice type /service_name查詢某個服務的型別
rosservice find [service_type]找出所有該型別的服務
rosservice info /service_name顯示該服務的詳細資訊
rosservice args /service_name顯示該服務所需的參數

範例

bash
rosservice call /gazebo/unpause_physics

讓 Gazebo 物理引擎繼續運行


2. rosparam - 參數管理

功能

  • 用於 存取和管理 ROS 參數伺服器 (Parameter Server)
  • 參數伺服器用來 存放全域變數,如機器人設定、控制參數等

常用指令

指令功能
rosparam list列出所有 ROS 參數
rosparam get /param_name取得特定參數的值
rosparam set /param_name value設定參數值
rosparam delete /param_name刪除參數
rosparam dump file.yaml將參數存入 YAML 檔案
rosparam load file.yaml從 YAML 檔案載入參數
rosparam has /param_name檢查參數是否存在

範例

bash
rosparam list | grep robot_arm_controller

檢查 robot_arm_controller 是否存在於參數伺服器


3. roslaunch - 啟動多個 ROS 節點

功能

  • 用於 啟動 ROS 節點 (nodes) 及載入參數、設定環境變數
  • 一次可啟動多個節點。

常用指令

指令功能
roslaunch package_name launch_file.launch執行 Launch 檔案
roslaunch --screen package_name launch_file.launch顯示節點執行過程
roslaunch package_name launch_file.launch param:=value指定參數值
roslaunch package_name launch_file.launch gui:=true啟動 GUI 介面

範例

bash
roslaunch robot_arm_urdf robot_arm_control.launch

啟動 robot_arm_control.launch 來控制機械手臂


4. rosrun - 執行 ROS 節點

功能

  • 直接執行 ROS 節點 (Node),通常用於 單獨測試某個節點
  • 只需提供 Package 名稱執行檔名稱

常用指令

指令功能
rosrun package_name node_name執行某個 ROS 節點
rosrun package_name node_name _param:=value執行時指定參數
rosrun package_name node_name --help顯示該節點的幫助資訊

範例

bash
rosrun controller_manager spawner robot_arm_controller

手動啟動 robot_arm_controller 控制器


5. rostopic - 主題管理

功能

  • 用於 查詢、發送、監聽 ROS Topics
  • Topics 為 ROS 主要的通訊方式 (發佈/訂閱模型)。

常用指令

指令功能
rostopic list列出所有目前的 Topics
rostopic echo /topic_name訂閱 Topic 並顯示其訊息
rostopic info /topic_name顯示該 Topic 的詳細資訊
rostopic type /topic_name查詢該 Topic 的訊息類型
rostopic pub /topic_name msg_type "data"發送 Topic 訊息
rostopic hz /topic_name顯示 Topic 的發送頻率
rostopic bw /topic_name顯示該 Topic 的頻寬使用情況

範例

bash
rostopic pub -1 /rosbot_arm_control/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_1", "joint_2", "joint_3"] points: - positions: [0.2, -0.5, 0.8] time_from_start: {secs: 5, nsecs: 0}'

手動發送 Joint Trajectory 指令


6. rosnode - 節點管理

功能

  • 用於 查詢與管理 ROS 節點 (Nodes)

常用指令

指令功能
rosnode list列出所有正在運行的 ROS 節點
rosnode info /node_name顯示該節點的詳細資訊
rosnode ping /node_name測試該節點是否運作
rosnode kill /node_name關閉特定節點
rosnode machine顯示節點所在的機器

範例

bash
rosnode list

列出目前正在運行的所有 ROS 節點



ROS 套件安裝及指令範例

ROS 相關指令整理與說明


1. ROS 安裝相關指令

完整安裝

bash
sudo apt install ros-noetic-desktop-full

安裝包含 rqt、rviz、機器人資料庫、2D/3D 感知模擬

普通安裝

bash
sudo apt install ros-noetic-desktop

安裝 ROS、rqt、rviz,但不包含 2D/3D 感知模擬。

基礎安裝

bash
sudo apt install ros-noetic-ros-base

僅安裝 ROS 架構,不含 GUI 工具。

指定安裝特定 ROS 套件

bash
sudo apt install ros-noetic-PACKAGE

安裝特定 ROS 套件

安裝 Gazebo

bash
sudo apt install ros-noetic-gazebo-ros

安裝 ROS Noetic & Gazebo 11


2. 安裝 ROS 控制器

bash
sudo apt update sudo apt install ros-noetic-ros-control ros-noetic-ros-controllers

安裝 ROS 控制器管理與控制器模組


3. 安裝 MoveIt! 套件

bash
sudo apt update sudo apt install ros-noetic-moveit sudo apt install ros-noetic-moveit-tutorials sudo apt install ros-noetic-franka-description

安裝 MoveIt! 運動規劃套件

確認 MoveIt! 安裝成功

bash
rospack find moveit_tutorials

應顯示 MoveIt! 相關目錄


4. ROS 套件檢查

檢查是否已安裝特定 ROS 套件

bash
apt list --installed | grep ros-noetic-ros-controllers

檢查控制器類型是否已載入

bash
rosservice call /controller_manager/list_controller_types

5. 設定 YAML 參數

打開 joint_trajectory_controller.yaml

bash
nano ~/data/robotxtest5_ws/src/robot_arm_urdf/config/joint_trajectory_controller.yaml

手動加載 YAML

bash
rosparam load ~/data/robotxtest5_ws/src/robot_arm_urdf/config/joint_trajectory_controller.yaml

確認 YAML 是否加載

bash
rosparam list | grep robot_arm_controller

6. 確保 Launch File 載入 YAML

打開 robot_arm_control.launch

bash
nano ~/data/robotxtest5_ws/src/robot_arm_urdf/launch/robot_arm_control.launch

確保以下行存在

xml
<rosparam file="$(find robot_arm_urdf)/config/joint_trajectory_controller.yaml" command="load"/>

重新啟動 Launch

bash
roslaunch robot_arm_urdf robot_arm_control.launch rosservice call /controller_manager/list_controllers

7. 手動啟動 ROS 控制器

嘗試手動加載 robot_arm_controller

bash
rosrun controller_manager spawner robot_arm_controller

檢查 Launch 檔案是否正確設定

xml
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller robot_arm_controller hand_ee_controller"/>

重新啟動 Launch

bash
roslaunch robot_arm_urdf robot_arm_control.launch

8. 確保 Gazebo 已加載 gazebo_ros_control

檢查 Gazebo 是否載入控制插件

bash
rostopic list | grep gazebo

應顯示

bash
/gazebo/link_states /gazebo/model_states /gazebo/set_model_configuration /gazebo/set_link_state /gazebo/set_model_state

如果沒有,檢查 URDF 檔案

bash
nano ~/data/robotxtest5_ws/src/robot_arm_urdf/urdf/robot_arm_urdf.urdf

確保 URDF 內有 gazebo_ros_control

xml
<gazebo> <plugin name="control" filename="libgazebo_ros_control.so"> <robotNamespace>/</robotNamespace> </plugin> </gazebo>

重新啟動 Gazebo

bash
roslaunch robot_arm_urdf robot_arm_control.launch

確認 Gazebo 插件是否載入

bash
rosparam list | grep gazebo_ros_control

重新載入 URDF

bash
rosparam load ~/data/robotxtest5_ws/src/robot_arm_urdf/urdf/robot_arm_urdf.urdf robot_description

確認 URDF 內 Joint 是否正確

bash
rosparam get /robot_description | grep joint

9. 確保控制器 (rosbot_arm_control) 正確啟動

檢查控制器狀態

bash
rosservice call /controller_manager/list_controllers

如果顯示

bash
name: "rosbot_arm_control" state: "running"

代表 控制器已成功啟動

如果 state: stopped,請手動啟動

bash
rosrun controller_manager spawner rosbot_arm_control

檢查 /rosbot_arm_control/command 是否發送消息

bash
rostopic echo /rosbot_arm_control/command

10. 調整 Gazebo 物理引擎

修改 Gazebo 物理引擎設定

xml
<world name="default"> <physics type="ode"> <real_time_update_rate>1000</real_time_update_rate> <max_step_size>0.001</max_step_size> <ode> <solver> <type>quick</type> <iters>50</iters> </solver> </ode> </physics> </world>

確保 Gazebo 沒有暫停

bash
rosservice call /gazebo/unpause_physics

如果關節無法運動,手動設定初始值

bash
rosservice call /gazebo/set_model_configuration '{model_name: robot_arm, urdf_param_name: robot_description, joint_names: ["joint_1", "joint_2", "joint_3"], joint_positions: [0.1, -0.2, 0.3]}'

確認 Gazebo 是否正確接收關節運動指令


11. 測試手動發送 Joint Trajectory

發送測試指令

bash
rostopic pub -1 /rosbot_arm_control/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6"] points: - positions: [0.2, -0.5, 0.8, -1.2, 0.3, 0.1] time_from_start: {secs: 5, nsecs: 0}'

確認機械手臂是否能正確執行運動軌跡

#這份整理提供了一系列 ROS Noetic 安裝、檢查、設定、啟動控制器、Gazebo 模擬、手動發送測試指令的完整流程。