welcom ! Handel home

2025年1月16日 星期四

rosrun 進行動 範例機器人的範例

 在 Gazebo ROS 中,你可以使用 ros_gazebo 提供的 topics 來控制機器人的位置、方向,或改變連結狀態。以下提供具體範例,展示如何透過 ROS 指令或 Python 程式來控制機器人。


方法 1:使用 /gazebo/set_model_state 來移動機器人

這個方法可以讓你直接改變機器人的位置,而不需要透過控制器 (如 cmd_vel)。

1.1 使用 rostopic pub 指令來移動機器人

你可以用 rostopic pub 來將機器人傳送到指定位置,例如:

bash:
rostopic pub -1 /gazebo/set_model_state gazebo_msgs/ModelState '{ model_name: "robot_name", pose: { position: { x: 2.0, y: 3.0, z: 0.0 }, orientation: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } }, twist: { linear: { x: 0.0, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.0 } }, reference_frame: "world" }'

🔹 說明

  • model_name: "robot_name" → 這裡要填你的機器人名稱,可以在 /gazebo/model_states 找到。
  • pose.position.x/y/z → 設定機器人新位置。
  • pose.orientation.x/y/z/w → 設定機器人旋轉角度 (四元數)。
  • twist.linear / angular → 設定機器人的速度 (這裡設為 0.0 表示靜態移動)。
  • reference_frame: "world" → 參考座標系 (通常設為 "world")。

1.2 使用 Python 控制機器人移動

你也可以使用 Python 腳本來發送 set_model_state 指令:

python:
#!/usr/bin/env python3 import rospy from gazebo_msgs.msg import ModelState from gazebo_msgs.srv import SetModelState def move_robot(): rospy.init_node('move_robot', anonymous=True) rospy.wait_for_service('/gazebo/set_model_state') try: set_state = rospy.ServiceProxy('/gazebo/set_model_state', SetModelState) state_msg = ModelState() state_msg.model_name = "robot_name" # 替換為你的機器人名稱 state_msg.pose.position.x = 2.0 state_msg.pose.position.y = 3.0 state_msg.pose.position.z = 0.0 state_msg.pose.orientation.w = 1.0 state_msg.reference_frame = "world" resp = set_state(state_msg) if resp.success: print("Robot moved successfully") else: print("Failed to move robot") except rospy.ServiceException as e: print("Service call failed:", e) if __name__ == "__main__": move_robot()

🔹 執行方式

  1. 儲存為 move_robot.py
  2. 給予執行權限:
    bash:
    chmod +x move_robot.py
  3. 執行:
    bash:
    rosrun <your_package> move_robot.py

方法 2:使用 /cmd_vel 控制機器人移動

如果你的機器人使用 差速驅動 (如 TurtleBot),你可以透過 /cmd_vel 來讓機器人移動,而不只是改變位置。

2.1 發送速度指令

bash:
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{ linear: { x: 0.5, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.3 } }'

🔹 說明

  • linear.x = 0.5 讓機器人向前移動。
  • angular.z = 0.3 讓機器人向左旋轉。
  • -r 10 代表每秒發送 10 次指令。

2.2 使用 Python 發送速度指令

python:
#!/usr/bin/env python3 import rospy from geometry_msgs.msg import Twist def move(): rospy.init_node('robot_mover', anonymous=True) pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) # 10 Hz twist = Twist() twist.linear.x = 0.5 # 設定前進速度 twist.angular.z = 0.3 # 設定旋轉速度 for _ in range(50): # 發送 5 秒的速度指令 pub.publish(twist) rate.sleep() twist.linear.x = 0.0 # 停止移動 twist.angular.z = 0.0 pub.publish(twist) if __name__ == "__main__": move()

🔹 執行方式

  1. 儲存為 move_cmd_vel.py
  2. 給予執行權限:
    bash:
    chmod +x move_cmd_vel.py
  3. 執行:
    bash:
    rosrun <your_package> move_cmd_vel.py

方法 3:使用 /gazebo/set_link_state 移動機器人的部件

如果你只想移動機器人的某個 連結 (link),例如讓機械臂某個關節變動,可以使用 /gazebo/set_link_state

3.1 使用 rostopic pub 設定某個 Link 的狀態

bash:
rostopic pub -1 /gazebo/set_link_state gazebo_msgs/LinkState '{ link_name: "robot::arm_link", pose: { position: { x: 1.0, y: 0.5, z: 1.2 }, orientation: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } }, twist: { linear: { x: 0.0, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.0 } }, reference_frame: "world" }'

🔹 說明

  • link_name: "robot::arm_link" → 設定某個 link (替換成你的 link 名稱)。
  • pose.position.x/y/z → 設定新位置。
  • pose.orientation → 設定旋轉角度。

結論

方法適用情境指令
/gazebo/set_model_state直接改變機器人位置rostopic pub or Python
/cmd_vel讓機器人移動 (類似遙控車)rostopic pub or Python
/gazebo/set_link_state只改變某個連結的位置rostopic pub or Python

如果你想讓機器人立即跳躍到某個位置,用 /gazebo/set_model_state 會比較簡單;如果你想模擬機器人的移動行為,使用 /cmd_vel 會更貼近真實機器人的運動方式。

你可以根據你的需求選擇最適合的方法來控制 Gazebo 中的機器人!🚀

沒有留言: