ROS之tf II

有个如下的launch:

<launch>

  <arg name="laser_enabled" default="true"/>
  <arg name="ur5_enabled" default="false"/>
  <arg name="kinect_enabled" default="false"/>

  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
  <include file="$(find husky_gazebo)/launch/husky_empty_world.launch">
    <arg name="world_name" value="/usr/share/gazebo-2.2/worlds/robocup14_spl_field.world"/>
    <arg name="laser_enabled" value="$(arg laser_enabled)"/>
    <arg name="ur5_enabled" value="$(arg ur5_enabled)"/>
    <arg name="kinect_enabled" value="$(arg kinect_enabled)"/>
  </include>
    <node name="control_vel" pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py"  output="screen"/>

</launch>

首先引入husky_gazebo的husky_empty_world.launch, 载入一个robcup14_xxx_.world, 接着再起一个node, 用于控制.

 

<launch>

  <arg name="world_name" default="worlds/empty.world"/>

  <arg name="laser_enabled" default="true"/>
  <arg name="ur5_enabled" default="false"/>
  <arg name="kinect_enabled" default="false"/>

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(arg world_name)"/> <!-- world_name is wrt GAZEBO_RESOURCE_PATH environment variable -->
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include>

  <include file="$(find husky_gazebo)/launch/spawn_husky.launch">
    <arg name="laser_enabled" value="$(arg laser_enabled)"/>
    <arg name="ur5_enabled" value="$(arg ur5_enabled)"/>
    <arg name="kinect_enabled" value="$(arg kinect_enabled)"/>
  </include>

</launch>

 

topic的图如下:

 

显示出的gazebo:

 

在launch的窗口, 用uiojklm,. 就可以控制小车了.

1. 发出的控制命令, 如topic截图, 是control_vel节点(launch文件里面定义的node名字), topic是/cmd_vel, 监听结果是:

每按一次:

linear:
  x: 0.5
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---
即, linear(线速度), x: 0.5, 英文不好真要命, vel就是velocity, 速度....

这个gazebo牛逼的地方就是可以模拟物理世界的运动规矩, 如果你猛按一个0.5, 小车会往前一冲, 意思是你加速太快了...如果持续的按"i"键, 会发现, 速度(twist)会真的去到0.5

然后gazebo会模拟一个odom信息, 如果echo这个odom的topic, 就会看到两个值, 一个post, 一个是twist, 分别是位置跟姿势, 放一块叫位姿.

rostopiccho /husky_velocity_controller/odom

---
header:
  seq: 58109
  stamp:
    secs: 1163
    nsecs:  49000000
  frame_id: odom
child_frame_id: base_link
pose:
  pose:
    position:
      x: 0.454022761909
      y: -0.21866274101
      z: 0.0
    orientation:
      x: 0.0
      y: 0.0
      z: 0.0678085464174
      w: 0.997698351724
  covariance: [0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03]
twist:
  twist:
    linear:
      x: 1.70889380575e-06
      y: 0.0
      z: 0.0
    angular:
      x: 0.0
      y: 0.0
      z: -7.06600815379e-11
  covariance: [0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03]
---
速度也同时有线速度跟角速度. 当前的速度都是为一个很小的数, 线速度真的达到0.5的时候如下图:

 

聪明的我不仅想问, 这个odom, 跟tf里面的odom数据, 有啥关系或者说是否完全一致呢?

通过跟踪从odom到base_link(或者反过来, 我搞不清谁相对谁)的

rosrun tf tf_echo  odom base_link
:

At time 940.170
- Translation: [1.088, -1.183, 0.000]
- Rotation: in Quaternion [0.000, 0.000, -0.566, 0.825]
            in RPY (radian) [0.000, 0.000, -1.203]
            in RPY (degree) [0.000, 0.000, -68.921]

同样有两个数值, 一个是相对唯一跟相对角度, 它的x值, 其实跟odom里面的pose的x值存在一定的差异, 不过相差不远.也就是说, 由ekf, 扩展科尔曼过滤定位发布.

 

posted @ 2017-06-13 18:07  Montauk  阅读(681)  评论(0编辑  收藏  举报