gazebo提供了很多ros的API,允许用户操作或者获取各种仿真世界的信息,pose和twist是刚体的状态,一个对象有内部的特性,比如指令和摩擦系数,gazebo中,body是一个刚体,和urdf中的link一样,一个gazebo model有body和joint组成
为了确保这个包被编译,但是不确定有什么用,还是先执行了,
rosmake gazebo_ros
启动gazebo一个empty world
roslaunch gazebo_ros empty_world.launc
模型可以动态创建和删除,提供这两个服务
gazebo/spawn_model and gazebo/delete_model
测试这两个指令,需要用到一些例子,desk1.model 但是没有在之前下载的地方找到,发现gazebo_worlds中有这些例子,但是没法下载,就直接将这个地址的复制下来,在自己的下面目录中建立desk1.model
https://bitbucket.org/osrf/simulator_gazebo/src/default/gazebo_worlds/objects/desk1.model
rosrun gazebo_ros spawn_model -file `rospack find gazebo_ros`/objects/desk1.model -gazebo -model desk1 -x 0
输入以后报错,看错误信息像是不支持model格式
root@ben-virtual-machine:~# rosrun gazebo_ros spawn_model -file `rospack find gazebo_ros`/objects/desk1.model -gazebo -model desk1 -x 0
SpawnModel script started
No handlers could be found for logger "rosout"
[INFO] [1581857717.308818, 0.000000]: Loading model XML from file
[INFO] [1581857717.311012, 0.000000]: Waiting for service /gazebo/spawn_sdf_model
[INFO] [1581857717.313560, 0.000000]: Calling service /gazebo/spawn_sdf_model
[INFO] [1581857717.333725, 0.000000]: Spawn status: GazeboRosApiPlugin SpawnModel Failure: input model_xml not SDF or URDF, or cannot be converted to Gazebo compatible format.
可能是.model的格式不支持吧,那么修改一下
rosrun gazebo_ros spawn_model -file `rospack find gazebo_ros`/objects/desk1.urdf -urdf -model desk1 -x 0
将后缀改为urdf,并修改类型为 -urdf,还是不行。但是现在对这种格式不熟悉,还无法知道是什么问题,先继续往下走,因此使用之前成功的object.urdf,
可见spawn_model是可以生成一个box的。
将模型xml存储在ros的参数服务器中,那么其他的ros应用可以在之后使用它生成相同的模型。实现用rosparam load存储到参数服务器,然后再调用 spawn_model在另外的地方生成新的box, -x,-z是位置。
帮助可以这么看
rosrun gazebo_ros spawn_model -h可以看到帮助
尝试删除指令,想删除之前的box,但是没有成功。
root@ben-virtual-machine:~# rosservice call gazebo/delete_model '{model_name: box}'
success: False
status_message: "DeleteModel: Model pushed to delete queue, but delete service timed out waiting for\
\ model to disappear from simulation"
不知道原因是什么,重新启动的gazebo,这次可以删除,但是问题是有时候创建或者删除的时候会出现一个异常。
但是创建和删除还是成功了的。
以为是之前使用rosparam创建的对象有问题导致的,重新使用该方式
删除还是可以的。因此确定并不是这个问题。
下面尝试设置模型的状态,通过下面的指令,确实看到box倾斜了,我勾掉了上面的重力选项,
rosservice call /gazebo/set_model_state '{model_state: { model_name: benbox, pose: { position: { x: 0, y: 0 ,z: 1 }, orientation: {x: 0.491983115673, y: 0, z: 0, w: 0.870604813099 } }, twist: { linear: {x: 0.0 , y: 0 ,z: 0 } , angular: { x: 0.0 , y: 0 , z: 0.1 } } , reference_frame: world } }'
设置了angular中的z为0.1,那么box旋转起来。设置为0.5旋转的速度快一些,目前还不太理解这些具体意义。
可以获取一些属性
root@ben-virtual-machine:~# rosservice call gazebo/get_world_properties
sim_time: 2607.051
model_names: [ground_plane, benbox]
rendering_enabled: True
success: True
status_message: "GetWorldProperties: got properties"
其中benbox是我创建的一个简单的box
获取具体的属性,下面获取我创建的benbox
root@ben-virtual-machine:~# rosservice call gazebo/get_model_properties '{model_name: benbox}'
parent_model_name: ''
canonical_body_name: ''
body_names: ['benbox::my_box']
geom_names: [my_box_collision]
joint_names: []
child_model_names: []
is_static: False
success: True
status_message: "GetModelProperties: got properties"
查看模型的状态
root@ben-virtual-machine:~# rostopic echo -n 1 /gazebo/model_states
name: [ground_plane, benbox]
pose:
-
position:
x: 0.0
y: 0.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
-
position:
x: -0.0205881729698
y: -0.0021943401648
z: 6.06734229386
orientation:
x: 0.00171028619132
y: 0.487599315149
z: -0.000297324967364
w: 0.873065801864
twist:
-
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
-
linear:
x: -3.63016938996e-05
y: -1.11296938293e-05
z: 0.00998824091614
angular:
x: 8.50023592176e-06
y: -1.81000572486e-05
z: -2.93680866128e-06
---
root@ben-virtual-machine:~# rostopic echo -n 1 /gazebo/link_states
name: ['ground_plane::link', 'benbox::benbox::my_box']
pose:
-
position:
x: 0.0
y: 0.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
-
position:
x: -0.0219874478309
y: -0.00264132325316
z: 6.4523984295
orientation:
x: 0.00187981173076
y: 0.487294621304
z: -0.000260389389797
w: 0.873235564183
twist:
-
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
-
linear:
x: -3.62917075219e-05
y: -1.20500402133e-05
z: 0.00998821281868
angular:
x: 8.6789081697e-06
y: -1.81021633226e-05
z: -2.3407636174e-06
---
施加一个力,注意其中body_name的名字。可以看到没有重力的box被沿着x方向被推动
root@ben-virtual-machine:~# rosservice call gazebo/apply_body_wrench '{body_name: "benbox::my_box" , wrench: { torque: { x: 0.01, y: 0 , z: 0 } }, start_time: 10000000000, duration: 1000000000 }'
success: True
status_message: ''
link上加力,首先根据例子创建一个urdf
rosrun gazebo_ros spawn_model -file `rospack find gazebo_ros`/objects/single_joint.urdf -urdf -model single_joint
建立如下这个link
施加一个力,可以看到link转动了,力越大,转动的角度越大,最终会停下来。 rosservice call gazebo/apply_joint_effort '{joint_name: link_joint, effort: 0.01, start_time: 10000000000, duration: 1000000000}'
清除力的操作感觉没有用。
rosservice call gazebo/clear_joint_forces '{joint_name: link_joint}'
暂停和恢复仿真
rosservice call gazebo/pause_physics
rosservice call gazebo/unpause_physics
通过发送topic的方式设置状态
rostopic pub -r 1 gazebo/set_model_state gazebo_msgs/ModelState '{model_name: single_joint, pose: { position: { x: 0, 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 }'
注意其中的gazebo_msgs/ModelState,这个是消息类型,
如果不知道消息类型,可以用rostopic type gazebo/set_model_state 来查询