Gazebo ROS API for C-Turtle

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

Gazebo ROS API for C-Turtle_第1张图片

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,

Gazebo ROS API for C-Turtle_第2张图片

可见spawn_model是可以生成一个box的。

将模型xml存储在ros的参数服务器中,那么其他的ros应用可以在之后使用它生成相同的模型。实现用rosparam load存储到参数服务器,然后再调用 spawn_model在另外的地方生成新的box, -x,-z是位置。

 

Gazebo ROS API for C-Turtle_第3张图片

帮助可以这么看

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,这次可以删除,但是问题是有时候创建或者删除的时候会出现一个异常。

但是创建和删除还是成功了的。

Gazebo ROS API for C-Turtle_第4张图片

以为是之前使用rosparam创建的对象有问题导致的,重新使用该方式

Gazebo ROS API for C-Turtle_第5张图片

删除还是可以的。因此确定并不是这个问题。

 


下面尝试设置模型的状态,通过下面的指令,确实看到box倾斜了,我勾掉了上面的重力选项,

 

Gazebo ROS API for C-Turtle_第6张图片

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

Gazebo ROS API for C-Turtle_第7张图片

施加一个力,可以看到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 来查询

 

 

你可能感兴趣的:(Robot)