welcom ! Handel home

2025年3月11日 星期二

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 內部直接切換到指定目錄!🚀

沒有留言: