之前一直不知道odom,map到底是什么關(guān)系,看了這個(gè)博客:https://blog.csdn.net/u012686154/article/details/88174195 才了解了一些。這邊記錄我自己的看法,看下是否正確:
1 ROS中map,odom坐標(biāo)系的理解
我想解決的問(wèn)題是:計(jì)算出小車(chē)在真實(shí)世界(這個(gè)坐標(biāo)系稱為map)的位置
我可以得到的數(shù)據(jù):
gazebo的傳感器(比如 libgazebo_ros_diff_drive.so)會(huì)在/odom topic下面發(fā)布小車(chē)在map坐標(biāo)系的坐標(biāo)。但是這個(gè)坐標(biāo)只是根據(jù)傳感器得到的,gazebo無(wú)法保證它是正確的。
于是新增了一個(gè)概念:odom坐標(biāo)系。意思是gazebo本來(lái)計(jì)算的是小車(chē)在map上的坐標(biāo),但是這個(gè)這個(gè)坐標(biāo)和真實(shí)值有偏差,因此把該坐標(biāo)看成小車(chē)在odom坐標(biāo)系上的坐標(biāo),然后odom坐標(biāo)系相對(duì)于map有相對(duì)偏差。
坐標(biāo)變換從base_footprint->map 變化為了:base_footprint->odom->map
2 odom坐標(biāo)系的總結(jié)
- 只是一個(gè)概念上的坐標(biāo)系,實(shí)際不存在
- 如果說(shuō)完全相信傳感器的數(shù)據(jù),那么可以認(rèn)為odom坐標(biāo)系就是map坐標(biāo)系
- 如何計(jì)算odom坐標(biāo)系相對(duì)于map坐標(biāo)系的位置:首先獲得差速計(jì)推算出的小車(chē)坐標(biāo)p,然后使用雷達(dá)再次估算小車(chē)的位置g(此時(shí)認(rèn)為g比較準(zhǔn)確,因此認(rèn)為g就是小車(chē)在map上的坐標(biāo)),那么差速計(jì)得到的坐標(biāo)可以看成是小車(chē)在odom的坐標(biāo)+odom相對(duì)于map的偏差,因此odom在map上的坐標(biāo)就是p-g
3 acml和robot_pose_ekf的區(qū)別
先說(shuō)下他們的共同點(diǎn):
- 都是可以估算出robot在map上的位置。
- 雖然它們都會(huì)在某個(gè)topic發(fā)布小車(chē)的坐標(biāo),并且發(fā)布一個(gè)tf變換。tf變換可以看成一個(gè)特殊的topic,里面說(shuō)明了兩個(gè)坐標(biāo)系的相對(duì)位置。在實(shí)際開(kāi)發(fā)中,一般直接使用這個(gè)tf變換,而不是使用發(fā)布出來(lái)的坐標(biāo)。
區(qū)別是:
-
acml估算的方法是輸入雷達(dá)信號(hào),然后直接算出位置。
-
robot_pose_ekf是通過(guò)將imu信號(hào)和原來(lái)里程計(jì)估算出來(lái)的坐標(biāo)整合以后算出一個(gè)新的坐標(biāo)。
-
真正計(jì)算坐標(biāo)的位置,更多是通過(guò)坐標(biāo)變換進(jìn)行的
- acml發(fā)布了一個(gè)map到odom的變換,
- robot_pose_ekf發(fā)布了一個(gè)odom到base_footprint的變換
比較讓人困惑的是:acml應(yīng)該只是知道base_footprint到odom的坐標(biāo),它怎么知道m(xù)ap到odom的坐標(biāo)的?
我的理解是,acml覺(jué)得自己準(zhǔn)確率非常高,因此把自己計(jì)算出的坐標(biāo)當(dāng)成了map上的坐標(biāo),而通過(guò)獲得base_footprint到另一個(gè)坐標(biāo)系的坐標(biāo),就可以獲得該坐標(biāo)系到map的坐標(biāo)了?,F(xiàn)在這個(gè)坐標(biāo)系被稱為了odom而已。
amcl能否和robot_pose_ekf一起使用?
我的理解是可以。理論上來(lái)說(shuō),因?yàn)閞obot_pose_ekf算出了odom到base_link的變化,而amcl計(jì)算出的odom到map的變化其實(shí)是通過(guò)map到base_link變化得到的,(base_link->map)表示base_link相對(duì)于map的坐標(biāo),那么有:
(base_link->map) = (base_link->odom) + (odom->map)
而acml計(jì)算的odom->map:
(odom->map) = (base_link->map) - (base_link->odom)
把它代入上面,發(fā)現(xiàn)算出來(lái)的還是acml計(jì)算出的base_link對(duì)于map的坐標(biāo),而base_link到odom的坐標(biāo)不管是什么都不會(huì)產(chǎn)生影響。
但是實(shí)際上來(lái)說(shuō),很多包可能會(huì)用到odom坐標(biāo)系,如果說(shuō)不太相信里程計(jì)的話還是使用一下amcl比較好。
下面是詳細(xì)解釋:
從acml的描述可以看出來(lái):
amcl transforms incoming laser scans to the odometry frame (~odom_frame_id). So there must exist a path through the tf tree from the frame in which the laser scans are published to the odometry frame.
The drawing below shows the difference between localization using odometry and amcl. During operation amcl estimates the transformation of the base frame (~base_frame_id) in respect to the global frame (~global_frame_id) but it only publishes the transform between the global frame and the odometry frame (~odom_frame_id). Essentially, this transform accounts for the drift that occurs using Dead Reckoning. The published transforms are future dated
我的理解是:acml和GPS差不多,根據(jù)雷達(dá)信息可以直接估算出機(jī)器人在map上面的坐標(biāo)。但是acml提供了一個(gè)功能,就是可以指定一個(gè)別的坐標(biāo)系,它幫你把map上的坐標(biāo)轉(zhuǎn)為該坐標(biāo)系相對(duì)于map的坐標(biāo)。這個(gè)坐標(biāo)系一般是指定為odom。
4 小車(chē)漂移的解決方法
我的現(xiàn)象:小車(chē)在運(yùn)動(dòng)過(guò)程中一會(huì)兒飄過(guò)來(lái),然后突然飄回去。
一開(kāi)始我覺(jué)得可能是odom不準(zhǔn),后來(lái)把里程計(jì)坐標(biāo)直接看成map上的坐標(biāo),發(fā)現(xiàn)小車(chē)不再飄了。于是發(fā)現(xiàn)是gmapping發(fā)布的map到odom的坐標(biāo)不準(zhǔn)。如果說(shuō)遇到這種情況,可以按照下面的步驟排除:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-800459.html
- 如果說(shuō)用的是差速計(jì)控制的小車(chē),可以去網(wǎng)上找一份鍵盤(pán)控制小車(chē)的代碼
- 讓小車(chē)原地轉(zhuǎn)圈
- 如果說(shuō)小車(chē)原地轉(zhuǎn)圈也會(huì)飄一定不是里程計(jì)的問(wèn)題。事實(shí)上,如果開(kāi)的不太遠(yuǎn),里程計(jì)應(yīng)該是非常準(zhǔn)的
解決方法:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-800459.html
- 里程計(jì)不準(zhǔn)可以使用robot_pose_ekf
- gmapping不準(zhǔn)可以直接放棄使用gmapping發(fā)布坐標(biāo),完全相信里程計(jì)。就是里程計(jì)直接發(fā)布map到base_footprint的tf變換
- 如果是場(chǎng)景非??諘?,可以在場(chǎng)景中加入一些障礙物,不然雷達(dá)不會(huì)起效
- 可以把gmapping的miniScore改的小一點(diǎn),甚至是負(fù)數(shù)。因?yàn)槔走_(dá)在空曠的地區(qū)置信度為0,而出現(xiàn)一些小的障礙物就會(huì)導(dǎo)致置信度>0,轉(zhuǎn)而使用雷達(dá)。而我們希望多使用差速計(jì)。
到了這里,關(guān)于ROS中map,odom坐標(biāo)系的理解以及acml和robot_pose_ekf的對(duì)比和小車(chē)漂移方法解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!