前面已經介紹了如何使用URDF建造機器人小車並顯示在Rviz的仿真環境里面,但是小車是靜止的。下面介紹如何讓它在Rviz里面動起來,並理清URDF,TF 和 odom 的關系。
1. ROS中base_link, odom, fixed_frame, target_frame和虛擬大地圖map的關系
一般在urdf文件中都要定義base_link,它代表了機器人的主干,其它所有的frame都是相對於base_link定義並粘在一起的。它們一起相對於大地圖map移動,讓機器人移動就是向tf發布 geometry_msgs::TransformStamped 消息通知ros base_linke相對於map的tf轉換關系。先看一下這幾個概念在ros中的定義:
map
map是虛擬世界中的固定frame, 它的Z軸指向正上方,也就是天空。一個時間點上移動機器人的姿態相對於map不應該出現明顯的漂移。如果一個map是不連續穩定的那就意味着機器人的位置在任何一個時間點上都會是變化的。
一般激光地位儀等設備會連續的計算map的位置因而造成它的不穩定性,這也使它不能成為一個好的參照體frame.
odom
odom是一個很好的固定世界參照frame.機器人的姿態相對odom而言是隨時間是經常可變,所以在長遠中它不是一個好的全局參照系。但在某一時間點而言它相對機器人的位置是不變的。
典型的 odom frame 是通過運動源來計算出來的, 例如輪子運動,視覺偏移等.
odom frame 的准確性使它在局部參照系中是很有用的。但是不適合作全局參照frame.
base_link
base_link參照系緊緊粘在移動機器人基座上的任何一個位置和角度。
- <span style="font-size:18px;">Global Options:
- Background Color: 48; 48; 48
- Fixed Frame: <strong><span style="color:#FF0000;">/odom</span></strong>
- Target Frame: <Fixed Frame>
- Frame Rate: 30</span>
如果現在啟動 RViz來觀察機器人:
- <span style="font-size:18px;">roslaunch sp1s display.launch model:=urdf/sp1s.urdf </span>
肯定會得到錯誤警告,而且RViz中無法顯示完整的機器人:
"No transform from [odom] to [base_link]"
這個錯誤很容易理解,沒有任何地方定義odom和base_link之間的tf關系,他們之間是連續變化的,我們當然不能在任何地方寫固定偏移量定義tf transform.
但是我們可以寫一個node來不斷的發送geometry_msgs/TransformStamped消息。被發送對象就是tf。 ROS官方有個實例完整代碼如何發布odom到base_link的變換,代碼實例直接拷貝並在本地編譯。這個例子不斷向odom主題發送消息更改odom與base_link之間的位移,位移的軌跡就是一個圓周。這個node名字叫 odom_publisher. 它其實做了兩件事情:
1. 向 tf 發送geometry_msgs/TransformStamped 消息, 就是讓機器人運動起來。
2. 向odom主題發送nav_msgs/Odometry導航消息,報告角速度,線速度和巡航角度。這部分代碼相對本文來講不是必須的。
同"joint_state_publisher" node一樣,“ odom_publisher”需要在RViz啟動之前啟動,添加它的啟動項。修改后的dispaly.launch文件:
- <launch>
- <arg name="model" />
- <arg name="gui" default="False" />
- <param name="robot_description" textfile="$(arg model)" />
- <param name="use_gui" value="$(arg gui)"/>
- <strong><span style="color:#FF0000;"><node name="odom_publisher" pkg="sp1s" type="odom_publisher" /></span></strong>
- <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
- <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
- <node name="rviz" pkg="rviz" type="rviz" args="-d $(find sp1s)/urdf.rviz" required="true"/>
- lt;/launch></span>
再次打開RViz:
- roslaunch sp1s display.launch model:=urdf/sp1s.urdf
這次就看到機器人在地圖空間中做規則的圓周運動了! 因為RViz收到了odom_publisher向tf發送的坐標轉換內容。
4. RViz中觀察移動軌跡
“ odom_publisher”中還向 odom主題發布了nav_msgs/Odometry導航消息,這樣就可以在RViz中顯示運動軌跡了。在RViz中點擊 'add',選中Odometry,配置該dispaly的topic為 "odom" 就可以看到不斷變化的運動軌跡了。這是因為nav_msgs/Odometry中包含了線速度,角速度和巡航角度,所以RViz可以顯示出來。
5.odom frame和 odom topic
這兩個完全是不同的東西,很容易混淆。一個是地圖上的一個參照系,一個是topic用來接收導航輸入的。名字一樣,純屬巧合!