<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ROS機器人如何使用Navigation導航包實現實時定位

新機器視覺 ? 來源:新機器視覺 ? 2023-12-03 11:00 ? 次閱讀

本篇文章主要分析,常規的ROS機器人是如何使用Navigation導航包實現實時定位的,定位精度的決定性因素等內容,結構上分為詳細介紹、概括總結、深入思考三大部分。

一、詳細介紹

常規的ROS機器人一般都會搭載,輪式里程計(編碼器),姿態傳感器(IMU)、激光雷達等感知傳感器。

rqt_graph是ROS中進行分析的常用工具,下圖是航天三院開發的輕舟機器人運行時的節點關系圖(點擊或拖拽可查看大圖),從下圖可以看出Navigation導航包的“指揮中心“”move_base節點訂閱了/odom_ekf節點發布的/odom_ekf話題,/odom_ekf中的內容是機器人搭載的輪式里程計(編碼器)經過推位得到定位信息/odom與姿態傳感器(IMU)的定位信息經過/robot_pose_ekf節點,即使用擴展卡爾曼濾波器(EKF)進行融合后的定位信息。

f4e8ac32-9117-11ee-939d-92fbcf53809c.png

那么我們的ROS機器人是否就是使用這個定位信息作為機器人的實時位置進行路徑規劃及其他應用呢?答案是否定的,下面給出解釋

move_base節點中是通過調用getRobotPose函數來獲取機器人當前的位姿的

getRobotPose(global_pose, planner_costmap_ros_);

getRobotPose函數的核心代碼如下,可以看出getRobotPose函數實際上是通過監聽tf樹中的map坐標系與base_link坐標系的關系,從而得到map坐標系下的base_link的坐標,也就是map坐標系下機器人的位姿信息,也就是說機器人的實時定位信息是通過監聽tf樹中map坐標系與base_link坐標系的變換關系來計算獲得的,并非使用了訂閱的/odom_ekf話題中的消息。

tf2::getIdentity(), global_pose.pose);
geometry_msgs::PoseStampedrobot_pose;
tf2::getIdentity(), robot_pose.pose);
robot_pose.header.frame_id = robot_base_frame_;
robot_pose.header.stamp=ros::Time();//latestavailable
ros::Time current_time = ros::now(); // save time for checking tf delay later


//getrobotposeonthegivencostmapframe
try
{
//通過tf獲取map到base_link的關系,那么也就是map下base_link的坐標,也就是map下機器人的坐標
tf_.transform(robot_pose,global_pose,costmap->getGlobalFrameID());
  }

tf中的transform函數的具體代碼如下:(lookupTransform是tf樹的監聽函數)


 //tf中的transform函數的具體代碼如下:
template
  T& transform(const T& in, T& out, 
     const std::string& target_frame, ros::Duration timeout=ros::Duration(0.0)) const
{
  // do the transform
  tf2::doTransform(in, out, lookupTransform(target_frame, tf2::getFrameId(in), tf2::getTimestamp(in), timeout));
  return out;
 }

輕舟機器人運行時的tf樹如下圖所示,可以看出map坐標系與base_link坐標系之間還存在一個odom坐標系,map坐標系與odom的坐標變換關系是由/amcl節點廣播出來的,odom坐標系與base_link坐標系的坐標變換關系是/robot_pose_ekf節點廣播出來的,所以,我們可以先大膽的推測,機器人的實時定位信息跟/amcl節點與/robot_pose_ekf節點均有關,且/amcl節點給出的定位信息是借助激光雷達的數據,采用粒子濾波算法(PF)估計出來的,而/robot_pose_ekf節點給出的定位信息是里程計信息和IMU信息經過擴展卡爾曼濾波(EKF)融合后得到的。

f51f9e04-9117-11ee-939d-92fbcf53809c.png

那么它們之間的關系又是怎樣的呢?下面通過解讀amcl包中廣播odom與map坐標系的tf關系的過程來進行解釋。

本部分的源碼如下:

geometry_msgs::PoseStamped odom_to_map;
try
{
tf2::Quaternionq;
q.setRPY(0,0,hyps[max_weight_hyp].pf_pose_mean.v[2]);
tf2::Transformtmp_tf(q,tf2::Vector3(hyps[max_weight_hyp].pf_pose_mean.v[0],
hyps[max_weight_hyp].pf_pose_mean.v[1],0.0));


geometry_msgs::PoseStampedtmp_tf_stamped;
tmp_tf_stamped.header.frame_id=base_frame_id_;
tmp_tf_stamped.header.stamp=laser_scan->header.stamp;
tf2::toMsg(tmp_tf.inverse(),tmp_tf_stamped.pose);


this->tf_->transform(tmp_tf_stamped,odom_to_map,odom_frame_id_);
   }
   catch(const tf2::TransformException&)
   {
ROS_DEBUG("Failedtosubtractbasetoodomtransform");
return;
   }


   tf2::convert(odom_to_map.pose, latest_tf_);
   latest_tf_valid_ = true;


   if (tf_broadcast_ == true)
   {
    // We want to send a transform that is good up until a
    // tolerance time so that odom can be used
ros::Timetransform_expiration=(laser_scan->header.stamp+ transform_tolerance_);
    geometry_msgs::TransformStamped tmp_tf_stamped;
    tmp_tf_stamped.header.frame_id = global_frame_id_;
    tmp_tf_stamped.header.stamp = transform_expiration;
    tmp_tf_stamped.child_frame_id = odom_frame_id_;
    tf2::convert(latest_tf_.inverse(), tmp_tf_stamped.transform);


    this->tfb_->sendTransform(tmp_tf_stamped);
    sent_first_transform_ = true;
   }

以上源碼可提取關鍵內容,總結如下:

(1)獲取base_link在世界坐標系map的坐標變換,即base_link在map下的坐標,存放在tmp_tf 中

tf2::Transform tmp_tf(q, 
tf2::Vector3(hyps[max_weight_hyp].pf_pose_mean.v[0], 
hyps[max_weight_hyp].pf_pose_mean.v[1]0.0));

(2)將tmp_tf通過求逆變換inverse()表示為世界坐標系map到base_link的坐標變換,即map在base_link下的坐標,存放在tmp_tf_stamped.pose中

tf2::toMsg(tmp_tf.inverse(), tmp_tf_stamped.pose);

(3)使用transform變換獲取map到odom的變換,即map原點在odom坐標系下的坐標,存放在odom_to_map中,并進行了格式轉換存放在latest_tf_中。

this->tf_->transform(tmp_tf_stamped, odom_to_map, odom_frame_id_);

這里的具體實現過程如下:tmp_tf_stamped中存放的是世界坐標系map到base_link的坐標變換,根據此處傳入的參數可知transform函數中監聽了base_link到odom坐標系的坐標變換,因此,可以看成將世界坐標系map到base_link的坐標變換再進行了一次從base_link到odom的變換,進而得到了map到odom的坐標變換,即map原點在odom坐標系下的坐標,存放在odom_to_map中

f52da468-9117-11ee-939d-92fbcf53809c.png

(4)最后,對latest_tf_求逆,得到odom—>map的變換,即odom在map坐標系下的坐標。

tf2::convert(latest_tf_.inverse(), tmp_tf_stamped.transform);

(5)廣播odom—>map的坐標變換關系,即可實現對EKF的修正。

二、概括總結

☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆

總的來說,/robot_pose_ekf節點會高頻的廣播給出使用里程計信息和IMU信息經過擴展卡爾曼濾波(EKF)融合后得到的定位信息,這個定位信息就是odom坐標系下的機器人位姿,如果這個定位信息是準確的,odom坐標系將與map坐標系近似于重合,此時,定位信息可以看成全局坐標系map下的機器人位姿信息。

然而里程計和IMU會有累計誤差,且該誤差會隨著時間的推移不斷增大,尤其是車輪打滑的情況下,這個偏移會很大,即odom坐標系會逐漸偏離map坐標系。此時,將ekf輸出的定位信息作為機器人在全局坐標系下的位姿信息是不合適的,這也是為什么還需要AMCL通過粒子濾波輸出定位信息的原因。

AMCL功能包借助激光雷達的感知信息,通過粒子濾波低頻的廣播出odom坐標系與map坐標系的偏差,在這個過程中,會將粒子濾波估計出的全局坐標系map下的機器人的位姿信息當做“真值”去使用,即認為粒子濾波估計出的定位信息是接近于真值的。用這個map→base_link(機器人)的坐標關系減去ekf輸出的base_link→odom的坐標關系,就是AMCL廣播的odom與map坐標系的偏差,用這個偏差疊加上ekf的輸出來對efk估計的定位信息進行糾正,并作為機器人實時的定位信息。

☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆ ☆☆☆

三、深入思考

1、odom坐標系與map坐標系的偏差所代表的意義是什么?

odom坐標系與map坐標系的偏差實際上是使用激光雷達感知信息的粒子濾波估計出定位信息與使用里程計和IMU信息通過擴展卡爾曼濾波估計出的定位信息的差值。

在將AMCL使用粒子濾波估計出的機器人在全局坐標系下的位姿信息,作為機器人真實的位姿信息的情況下,odom坐標系與map坐標系的偏差可以看成,ekf估計出的機器人的位姿信息與真實值之間的偏差,即odom與map坐標系差的越大,ekf當前的估計值與真實值的差距也就越大,越不準確。

f5391d16-9117-11ee-939d-92fbcf53809c.png

2、粒子濾波與擴展卡爾曼濾波輸出的定位信息那個更準確?

使用激光雷達感知信息的粒子濾波估計出定位信息比使用里程計和IMU信息通過擴展卡爾曼濾波估計出的定位信息要準確,尤其是在機器人的運動存在打滑現象時,下圖中的給出了機器人運行一段時間回到起點后,ekf和amcl輸出的定位信息的偏差,可見在ekf在x軸上的偏差高達1.49m,而amcl的偏差僅在0.08m,運行多圈以后ekf的偏差甚至達到了5.3m,而此時amcl的偏差僅為0.2m,可以看出經過實驗測試,在機器人存在打滑現象時,amcl輸出的定位信息的精度要遠高于ekf輸出的定位信息。這也是為什么可以將amcl輸出的定位信息近似當真值使用來對ekf進行修正的原因。

f543c73e-9117-11ee-939d-92fbcf53809c.png

f54eb130-9117-11ee-939d-92fbcf53809c.png

3、既然AMCL輸出的定位信息比ekf輸出的定位信息要準確,為什么不直接使用AMCL輸出的定位信息作為機器人的定位信息使用,而是使用AMCL對ekf的輸出進行修正?為什么AMCL不直接廣播map到base_link的坐標變換關系?

因為,AMCL的定位信息準確,但計算量較大,只能輸出一個低頻的定位信息,如10hz,而ekf的定位信息誤差較大,但可以高頻的輸出定位信息,如100hz。采用AMCL的對ekf進行修正的模式,即可以較好的保證定位信息的實時性,又能較好的保證定位信息的準確性。

4、ROS機器人是如何使用Navigation導航包實現定位的精度的決定性因素是什么?

ROS機器人是如何使用Navigation導航包實現定位的精度的決定性因素是 AMCL中粒子濾波的估計精度。假設AMCL輸出的定位信息的頻率是10HZ,ekf輸出的定位信息的頻率是100hz。則在0.1 _ n時刻機器人使用的定位信息就是AMCL輸出的定位信息,在0.1 _ n ~ 0.1 *(n+1) 的時間段內,比如0.16時刻輸出的定位信息 是0.1時刻AMCL輸出的定位信息與0.1時刻ekf輸出的定位信息的差值,加上0.16時刻ekf輸出的定位信息。即0.16時刻的定位使用的是0.1時刻的AMCL對ekf的修正(0.1時刻的map→base_link)加上0.16時刻的ekf輸出(0.16時刻的base_link → odom)。其中n取任意整數

所以,在0.1 _ n時刻的機器人定位信息的估計精度就是AMCl中粒子濾波的估計精度,在0.1 _ n ~ 0.1 *(n+1)的時間段內,ekf的估計精度越高只能保證,在該時間段內的估計偏差越小,但是最終取決定性作用的還是AMCL的估計精度,舉個簡單的例子,在0.1時刻,AMCl估計的定位信息是 機器人處于x軸的5m處(認為機器人0.1時刻真實位置也在5m處),0.1時刻ekf估計的定位信息是機器人處于x軸的5.2m處,此時0.1時刻amcl的修正信息是0.2m ,在0.16時刻ekf的估計位置是5.8m處,然而機器人的真實位置在5.4m處,0.16時刻AMCl的修正量依然使用的是0.1時刻的修正量,最終輸出的定位信息是在5.6m處,與真實信息差了0.2m,然而在0.2時刻,此時機器人位于6.01m處,AMCl估計的機器人也6m處,ekf估計的機器人位于6.6m處,此時ekf的估計偏差是0.61,AMCl對ekf的糾正是0.6,此時輸出的定位信息即6m,與真實位置偏差是0.01,也就是AMCL的估計精度。

所以,總的來說,ROS機器人是如何使用Navigation導航包實現定位的精度的決定性因素是 AMCL中粒子濾波的估計精度,即使是在0.1 _ n ~ 0.1 _(n+1)的時間段內ekf的偏移特別大,那在 0.1 *(n+1)也會被修正為AMCL估計的位姿,與真實位置的定位偏差也會變為AMCL的估計偏差。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2529

    文章

    48465

    瀏覽量

    741760
  • 機器人
    +關注

    關注

    206

    文章

    27225

    瀏覽量

    201834
  • 定位
    +關注

    關注

    5

    文章

    1123

    瀏覽量

    35115
  • 激光雷達
    +關注

    關注

    962

    文章

    3725

    瀏覽量

    187226
  • ROS
    ROS
    +關注

    關注

    1

    文章

    273

    瀏覽量

    16743

原文標題:ROS機器人如何使用Navigation導航包實現實時定位

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    激光導航AGV底盤定制 巡檢機器人,服務機器人,智慧物流搬運AGV

    技術先進的無反射板激光導航移動平臺。同時為這些相關行業提供智慧物流以及倉儲系統解決方案。 蘇州智偉達機器人科技有限公司根據LNM自主導航解決方案自主研發激光導航AGV底盤定制 利用激光
    發表于 06-10 14:24

    機器人想要實現智能移動,必須具備超強的自主定位導航能力

    ```` 移動機器人想要在完全陌生的環境中(沒有預先錄入地圖的情況下)實現智能導航,顯然不是那么簡單。所以,移動機器人實現智能化的第一步,當
    發表于 01-03 11:41

    SLAM不等于機器人自主定位導航

    得干凈,要盡量覆蓋從A到B點的所有區域,實現掃地機器人“掃地”的這個功能。 所以,機器人自主定位導航技術的發展還需要越來越多的技術加以支撐,
    發表于 08-24 16:56

    服務機器人是如何實現自主定位導航的?

    服務機器人想要自由行走,實現自主定位導航是關鍵,自主定位導航包括
    發表于 10-10 16:29

    中國服務機器人定位導航技術現狀分析

    的圖像信息和機器人的實際位置聯系起來,完成機器人的自主導航定位功能。但該技術圖像處理量巨大,一般計算機無法完成運算,實時性比較差,且容易受光
    發表于 10-11 17:49

    如何保存機器人建圖,用于后續定位導航

    ,機器人的坐標系將會匹配到地圖坐標系。之后就可以在加載的地圖上進行導航運動了?! ∪绾卫肦oboStudio進行自動重定位  手動重定位:  自動重
    發表于 01-28 17:27

    【Toybrick RK3399Pro AI開發板試用體驗】機器人自主導航

    到達指定位置、機器人定時巡邏、跟隨等等,于是有了機器人實時定位導航。
    發表于 08-21 22:12

    暗物智能廣州公司招聘機器人崗位貼(導航&&應用開發)

    一.機器人導航算法工程師崗位職責:1. 負責機器人視覺或激光雷達的SLAM算法的研發和優化;2. 負責機器人自主導航
    發表于 06-08 05:06

    請問怎么設計一種室外移動機器人組合導航定位系統?

    怎么設計一種室外移動機器人組合導航定位系統?如何實現室外移動機器人組合導航
    發表于 04-19 10:50

    ROS navigation功能添加自定義的全局路徑規劃器(Global Path Planner)

    ROSnavigation官方功能提供了三種全局路徑規劃器:carrot_planner、global_planner、navfn。我們通常使用的是navfn,如果機器人執行一些
    發表于 05-16 19:17

    基于ROS系統實現導航機器人的精確方向和距離控制

    本實驗箱以大載重的全向麥輪車為載體,基于ROS系統作為開發平臺,使用雙驅和四驅兩種不同的結構作為機器人本體,最終通過地面二維碼實現導航機器人
    發表于 09-03 07:29

    ROS機器人定位導航仿真

    大作業——ROS機器人定位導航仿真一、安裝插件與相關配置1.下載源碼2.安裝相應插件(1)ros-kinetic-driver-base(
    發表于 12-17 06:15

    如何對ROS機器人定位導航進行仿真

    怎樣去實現ROS機器人定位導航呢?如何對ROS機器人
    發表于 12-23 09:22

    ROS機器人開發更便捷,基于RK3568J+Debian系統發布!

    ROS系統是什么 ROS(Robot Operating System)是一個適用于機器人的開源的元操作系統。它提供了操作系統應有的服務,包括硬件抽象,底層設備控制,常用函數的實現,進
    發表于 11-30 16:01

    ROS Navigation Stack的整體設計思路和功能包

    ROS Navigation Stack是ROS提供的一個二維的導航功能包集合,通過輸入里程計、傳感器信息和目標位姿,輸出控制機器人到達目標
    的頭像 發表于 02-01 11:20 ?1013次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>