由浅到深理解ROS(6)-坐标转换
轉(zhuǎn)自
?
?
ROS 中對于多坐標系的處理是使用樹型表示,在機器人自主導(dǎo)航中,ROS會構(gòu)建這幾個很重要的坐標系:
base_link: 一般位于tf tree的最根部,物理語義原點一般為表示機器人中心,為相對機器人的本體的坐標系。(base_footprint:行走機器人?)
odom:一般直接與base_link 相鏈接,語義為一個對于機器人全局位姿的粗略估計。取名來源于odometry(里程計),一般這個坐標系的數(shù)據(jù)也是來源于里程計。對于全局位姿的估計方法很多,比如在hector SLAM與導(dǎo)航體系中,就采用了imu數(shù)據(jù)估計全局位姿,還有很多視覺里程計的算法(visual odometry)也能提供位姿估計。原點為開始計算位姿那個時刻的機器人的位置。之
odom_combined 這個tf一般為好幾種位姿估計方法的信息融合后的數(shù)據(jù)。在navigation metapackage中有 robot_pose_ekf 這個包是用擴展卡爾曼濾波算法(EKF)融合不同傳感器的數(shù)據(jù)。
map: 一般與odom(或者odom_combined)相連,語義為一個經(jīng)過先驗(或者SLAM)地圖數(shù)據(jù)矯正過的,在地圖中的位姿信息。與odom同為全局坐標系。原點為地圖原點(地圖原點在地圖相應(yīng)的yaml文件中有規(guī)定)。
?
?
轉(zhuǎn)自
odom:里程計坐標系,這里要區(qū)分開odom topic,這是兩個概念,一個是坐標系,一個是根據(jù)編碼器(或者視覺等)計算的里程計。但是兩者也有關(guān)系,odom topic 轉(zhuǎn)化得位姿矩陣是odom-->base_link的tf關(guān)系。這時可有會有疑問,odom和map坐標系是不是重合的?(這也是我寫這個博客解決的主要問題)可以很肯定的告訴你,機器人運動開始是重合的。但是,隨著時間的推移是不重合的,而出現(xiàn)的偏差就是里程計的累積誤差。那map-->odom的tf怎么得到?就是在一些校正傳感器合作校正的package比如gmapping會給出一個位置估計(localization),這可以得到map-->base_link的tf,所以估計位置和里程計位置的偏差也就是odom與map的坐標系偏差。所以,如果你的odom計算沒有錯誤,那么map-->odom的tf就是0.
?
?
? ? ? ? 導(dǎo)航與定位是機器人研究中的重要部分。
? ? ? ? 一般機器人在陌生的環(huán)境下需要使用激光傳感器(或者深度傳感器轉(zhuǎn)換成激光數(shù)據(jù)),先進行地圖建模,然后在根據(jù)建立的地圖進行導(dǎo)航、定位。在ROS中也有很多完善的包可以直接使用。
? ? ? ? 在ROS中,進行導(dǎo)航需要使用到的三個包是:
? ? ? (1)move_base:根據(jù)參照的消息進行路徑規(guī)劃,使移動機器人到達指定的位置;
? ? ? (2)gmapping:根據(jù)激光數(shù)據(jù)(或者深度數(shù)據(jù)模擬的激光數(shù)據(jù))建立地圖;(SLAM是其中一種?)
? ? ? (3)amcl:根據(jù)已經(jīng)有的地圖進行定位。
? ? ? ?參考鏈接:http://www.ros.org/wiki/navigation/Tutorials/RobotSetup
? ? ? ? ? ? ? ? ? ? ? ? ?http://www.ros.org/wiki/navigation/Tutorials
? ? ? ?整體導(dǎo)航包的格局如下圖所示:
? ? ? ? 其中白色框內(nèi)的是ROS已經(jīng)為我們準備好的必須使用的組件,灰色框內(nèi)的是ROS中可選的組件,藍色的是用戶需要提供的機器人平臺上的組件。
?
1、sensor transforms
? ? ? ? 其中涉及到使用tf進行傳感器坐標的轉(zhuǎn)換,因為我們使用的機器人的控制中心不一定是在傳感器上,所以要把傳感器的數(shù)據(jù)轉(zhuǎn)換成在控制中心上的坐標信息。如下圖所示,傳感器獲取的數(shù)據(jù)是在base_laser的坐標系統(tǒng)中的,但是我們控制的時候是以base_link為中心,所以要根據(jù)兩者的位置關(guān)心進行坐標的變換。
?
? ? ? ? 變換的過程不需要我們自己處理,只需要將base_laser和base_link兩者之間的位置關(guān)系告訴tf,就可以自動轉(zhuǎn)換了。具體的實現(xiàn)可以參見:http://blog.csdn.net/hcx25909/article/details/9255001。
?
2、sensor sources
? ? ? ? 這里是機器人導(dǎo)航傳感器數(shù)據(jù)輸入,一般只有兩種:
? ? ? (1)激光傳感器數(shù)據(jù)
? ? ? (2)點云數(shù)據(jù)
? ? ? 具體實現(xiàn)見:http://www.ros.org/wiki/navigation/Tutorials/RobotSetup/Sensors
3、odometry source
? ? ? ? 機器人的導(dǎo)航需要輸入里程計的數(shù)據(jù)(tf,nav_msgs/Odometry_message),具體實現(xiàn)見:
? ? ? ??http://www.ros.org/wiki/navigation/Tutorials/RobotSetup/Odom
4、base controller
? ? ? ? 在導(dǎo)航過程中,該部分負責將之前得出來的數(shù)據(jù)轉(zhuǎn)封裝成具體的線速度和轉(zhuǎn)向角度信息(Twist),并且發(fā)布給硬件平臺。
5、map_server
? ? ? ?在導(dǎo)航過程中,地圖并不是必須的,此時相當于是在一個無限大的空地上進行導(dǎo)航,并沒有任何障礙物。但是考慮到實際情況,在我們使用導(dǎo)航的過程中還是要一個地圖的。
? ? ? ?具體實現(xiàn)見:http://www.ros.org/wiki/slam_gmapping/Tutorials/MappingFromLoggedData
? ? ? ?在ROS的導(dǎo)航中,costmap_2d這個包主要負責根據(jù)傳感器的信息建立和更新二維或三維的地圖。ROS的地圖(costmap)采用網(wǎng)格(grid)的形式,每個網(wǎng)格的值從0~255,分為三種狀態(tài):占用(有障礙物)、無用(空閑的)、未知。具體狀態(tài)和值的對應(yīng)關(guān)系如下:
?
? ? ? ??
? ? ? ? 上圖共分為五個部分:(下面的紅色框圖是機器人的輪廓,旁邊的黑框是上圖的映射位置)
? ? ? (1)Lethal(致命的):機器人的中心與該網(wǎng)格的中心重合,此時機器人必然與障礙物沖突。
? ? ? (2)Inscribed(內(nèi)切):網(wǎng)格的外切圓與機器人的輪廓內(nèi)切,此時機器人也必然與障礙物沖突。
? ? ? (3)Possibly circumscribed(外切):網(wǎng)格的外切圓與機器人的輪廓外切,此時機器人相當于靠在障礙物附近,所以不一定沖突。
? ? ? (4)Freespace(自由空間):沒有障礙物的空間。
? ? ? (5)Unknown(未知):未知的空間。
? ? ? ?具體可見:http://www.ros.org/wiki/costmap_2d
總結(jié)
以上是生活随笔為你收集整理的由浅到深理解ROS(6)-坐标转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个月薪5000元的人,如何才能一年存1
- 下一篇: 又一款高收益稳健理财要消失!想要收益率超