有个如下的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, 扩展科尔曼过滤定位发布.