(1)gazebo发布的参数

/use_sim_time:Bool-通知ROS使用已发布的/ clock主题作为ROS时间。

如果应通过/use_sim_time参数使用仿真时间,则Gazebo使用ROS参数服务器通知其他应用程序,尤其是Rviz。 启动gazebo_ros时,gazebo应将其自动设置为true

如果gazebo发布到ROS的/clock话题作为ROS系统提供模拟同步时间,则/use_sim_timetrue

关于仿真时间,参考ROS C++ Time

(2)检查参数设置

rosparam get /use_sim_time

(3)gazebo订阅的话题

~/set_link_state : gazebo_msgs/LinkState - Sets the state (pose/twist) of a link.

~/set_model_state : gazebo_msgs/ModelState - Sets the state (pose/twist) of a model.

通过话题在仿真中设置模型的位姿
# 通过在线数据库添加一个可乐
rosrun gazebo_ros spawn_model -database coke_can -gazebo -model coke_can -y 1

# 发布话题/gazebo/set_model_state设置可乐罐位置
rostopic pub -r 20 /gazebo/set_model_state gazebo_msgs/ModelState '{model_name: coke_can, pose: { position: { x: 1, y: 0, z: 2 }, orientation: {x: 0, y: 0.491983115673, z: 0, w: 0.870604813099 } }, twist: { linear: { x: 0, y: 0, z: 0 }, angular: { x: 0, y: 0, z: 0}  }, reference_frame: world }'

在这里插入图片描述

(4)gazebo发布的话题

  • /clock: rosgraph_msgs/Clock - 发布仿真时间, to be used with /use_sim_time parameter.

  • ~/link_states : gazebo_msgs/LinkStates - 发布仿真中所有Link的状态

  • ~/model_states : gazebo_msgs/ModelStates - 发布仿真中所有model的状态

使用话题查看model和link的状态
rostopic echo -n 1 /gazebo/model_states
rostopic echo -n 1 /gazebo/link_states

(5)服务:在仿真中创建和销毁model

  • ~/spawn_urdf_model: gazebo_msgs/SpawnModel - 使用此服务生成通用机器人描述格式(URDF)

  • ~/spawn_sdf_model: gazebo_msgs/SpawnModel- 使用此服务可产生以gazebo仿真描述格式SDF编写的模型

  • ~/delete_model:gazebo_msgs/DeleteModel - 此服务允许用户从仿真中删除模型


略……


(6)服务:力控制

这些服务允许用户在仿真中将扳手和力施加到身体和关节上:

  • ~/apply_body_wrench : gazebo_msgs/ApplyBodyWrench - 在仿真中将 wrench施加到物体上. 注意:施加在同意物体上的所有active wrenches都是累积的。

  • ~/apply_joint_effort: gazebo_msgs/ApplyJointEffort - 在仿真中将 effort 施加到物体上

  • ~/clear_joint_forces : gazebo_msgs/JointRequest - 清除添加到joint上的effort

  • ~/clear_body_wrenches : gazebo_msgs/ClearBodyWrenches - 清除添加到物体上的wrench

将力矩添加到Joint上

为例演示效果,关闭重力:

rosrun gazebo_ros spawn_model -database coke_can -gazebo -model coke_can -y 1

rosservice call /gazebo/set_physics_properties "
time_step: 0.001
max_update_rate: 1000.0
gravity:
  x: 0.0
  y: 0.0
  z: 0.0
ode_config:
  auto_disable_bodies: False
  sor_pgs_precon_iters: 0
  sor_pgs_iters: 50
  sor_pgs_w: 1.3
  sor_pgs_rms_error_tol: 0.0
  contact_surface_layer: 0.001
  contact_max_correcting_vel: 100.0
  cfm: 0.0
  erp: 0.2
  max_contacts: 20"

服务:/gazebo/apply_body_wrench

给可乐罐起点施加0.01Nm的扭矩,持续1秒,会看到可乐沿x轴正向旋转:

rosservice call /gazebo/apply_body_wrench '{body_name: "coke_can::link" , wrench: { torque: { x: 0.01, y: 0 , z: 0 } }, start_time: 10000000000, duration: 1000000000 }'

在这里插入图片描述
施加反向力矩:-0.01Nm,时间持续1秒,并停止旋转:

# 注意:start_time和duration的单位为微秒,即10^-9秒
rosservice call /gazebo/apply_body_wrench '{body_name: "coke_can::link" , wrench: { torque: { x: -0.01, y: 0 , z: 0 } }, start_time: 10000000000, duration: 1000000000 }'

通常,如果持续时间为负数,那么转矩将无限期持续

清除作用力矩

服务:/gazebo/clear_body_wrenches

rosservice call /gazebo/clear_body_wrenches '{body_name: "coke_can::link"}'

仿真中对关节添加力

服务:/gazebo/apply_joint_effort

rosservice call /gazebo/apply_joint_effort "joint_name: 'joint2'
effort: 10.0
start_time:
  secs: 0
  nsecs: 0
duration:
  secs: 10
  nsecs: 0"

清除作用力

服务:/gazebo/clear_joint_forces

rosservice call /gazebo/clear_joint_forces '{joint_name: joint2}'

(7)服务:仿真过程控制

  • ~/pause_physics : std_srvs/Empty - 暂停物理更新

  • ~/unpause_physics: std_srvs/Empty - 恢复物理更新

  • ~/reset_simulation : std_srvs/Empty - 重置仿真过程,包括时间

  • ~/reset_world : std_srvs/Empty - 重置模型姿态

暂停和取消暂停
# 暂停仿真,仿真时间停止,对象变静态,但gazebo内部更新循环仍在继续,但仿真时间没有改变,因此任何受仿真时间限制的内容都不会更新
rosservice call gazebo/pause_physics

# 取消暂停
rosservice call gazebo/unpause_physics


参考文献: