色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

一個利用GT-SAM的緊耦合激光雷達慣導里程計的框架

3D視覺工坊 ? 來源:古月居 ? 作者:月照銀海似蛟龍 ? 2022-10-31 09:25 ? 次閱讀

前言

LIO-SAM的全稱是:Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping,從全稱上可以看出,該算法是一個緊耦合的雷達慣導里程計(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM庫中的方法。

LIO-SAM 提出了一個利用GT-SAM的緊耦合激光雷達慣導里程計的框架。實現了高精度、實時的移動機器人的軌跡估計和建圖。在之前的博客講解了imu如何進行預積分,最終以imu的頻率發布了imu的預測位姿里程計。

fbb2dc46-58aa-11ed-a3b6-dac502259ad0.png

本篇博客主要講解,最終是如何進行位姿融合輸出的

fbcbbef0-58aa-11ed-a3b6-dac502259ad0.png

Eigen::Affine3f

其中功能的核心在于 位姿間的變換,所以要了解 Eigen::Affine3f 部分的內容,Affine3f 是eighen庫的仿射變換矩陣

實際上就是:平移向量+旋轉變換組合而成,可以同時實現旋轉,縮放,平移等空間變換。

Eigen庫中,仿射變換矩陣的大致用法為:

創建Eigen::Affine3f 對象a。

創建類型為Eigen::Translation3f 對象b,用來存儲平移向量;

創建類型為Eigen::Quaternionf 四元數對象c,用來存儲旋轉變換;

最后通過以下方式生成最終Affine3f變換矩陣:a=b*c.toRotationMatrix();

一個向量通過仿射變換時的方法是result_vector=test_affine*test_vector;

仿射變換包括:平移、旋轉、放縮、剪切、反射

平移(translation)和旋轉(rotation)顧名思義,兩者的組合稱之為歐式變換(Euclidean transformation)或剛體變換(rigid transformation);

放縮(scaling)可進一步分為uniform scaling和non-uniform scaling,前者每個坐標軸放縮系數相同(各向同性),后者不同;

如果放縮系數為負,則會疊加上反射(reflection)——reflection可以看成是特殊的scaling;

剛體變換+uniform scaling 稱之為,相似變換(similarity transformation),即平移+旋轉+各向同性的放縮;

位姿融合輸出

在imu預積分的節點中,在main函數里面 還有一個類的實例對象,那就是

TransformFusion TF

其主要功能是做位姿融合輸出,最終輸出imu的預測結果,與上節中的imu預測結果的區別就是:

該對象的融合輸出是基于全局位姿的基礎上再進行imu的預測輸出。全局位姿就是 經過回環檢測后的lidar位姿。

fbe75688-58aa-11ed-a3b6-dac502259ad0.png

建圖優化會輸出兩種激光雷達的位姿:

lidar 增量位姿

lidar 全局位姿

其中lidar 增量位姿就是 通過 lidar的匹配功能,優化出的幀間的相對位姿,通過相對位姿的累積,形成世界坐標系下的位姿

lidar全局位姿 則是在 幀間位姿的基礎上,通過 回環檢測,再次進行優化的 世界坐標系下的位姿,所以對于增量位姿,全局位姿更加精準

在前面提到的發布的imu的預測位姿是在lidar的增量位姿上基礎上預測的,那么為了更加準確,本部分功能就預測結果,計算到基于全局位姿的基礎上面。首先看構造函數

  TransformFusion()  {    if(lidarFrame != baselinkFrame)    {      try      {          tfListener.waitForTransform(lidarFrame, baselinkFrame, ros::Time(0), ros::Duration(3.0));        tfListener.lookupTransform(lidarFrame, baselinkFrame, ros::Time(0), lidar2Baselink);      }      catch (tf::TransformException ex)      {        ROS_ERROR("%s",ex.what());      }    }

判斷lidar幀和baselink幀是不是同一個坐標系,通常baselink指車體系,如果不是,查詢 一下 lidar 和baselink 之間的 tf變換 ros::Time(0) 表示最新的,等待兩個坐標系有了變換,更新兩個的變換 lidar2Baselink

    subLaserOdometry = nh.subscribe("lio_sam/mapping/odometry", 5, &TransformFusion::lidarOdometryHandler, this, ros::TransportHints().tcpNoDelay());    subImuOdometry  = nh.subscribe(odomTopic+"_incremental",  2000, &TransformFusion::imuOdometryHandler,  this, ros::TransportHints().tcpNoDelay());

訂閱地圖優化的節點的全局位姿 和預積分節點的 增量位姿

    pubImuOdometry  = nh.advertise(odomTopic, 2000);    pubImuPath    = nh.advertise  ("lio_sam/imu/path", 1);

發布兩個信息 odomTopic ImuPath,然后看第一個回調函數lidarOdometryHandler

  void lidarOdometryHandler(const nav_msgs::ConstPtr& odomMsg)  {    std::lock_guard lock(mtx);    lidarOdomAffine = odom2affine(*odomMsg);    lidarOdomTime = odomMsg->header.stamp.toSec();  }

將全局位姿保存下來,將ros的odom格式轉換成 Eigen::Affine3f 的形式,將最新幀的時間保存下來,第二個回調函數是imuOdometryHandler,imu預積分之后所發布的imu頻率的預測位姿

  void imuOdometryHandler(const nav_msgs::ConstPtr& odomMsg)  {

    static tf::TransformBroadcaster tfMap2Odom;    static tf::Transform map_to_odom = tf::createQuaternionFromRPY(0, 0, 0), tf::Vector3(0, 0, 0));

建圖的話 可以認為 map坐標系和odom坐標系 是重合的(初始化時刻)

tfMap2Odom.sendTransform(tf::StampedTransform(map_to_odom, odomMsg->header.stamp, mapFrame, odometryFrame));

發布靜態tf,odom系和map系 他們是重合的

imuOdomQueue.push_back(*odomMsg);

imu得到的里程計結果送入到這個隊列中

    if (lidarOdomTime == -1)      return;

如果沒有收到lidar位姿 就returen

    while (!imuOdomQueue.empty())    {      if (imuOdomQueue.front().header.stamp.toSec() <= lidarOdomTime)        imuOdomQueue.pop_front();      else        break;    }

彈出時間戳 小于 最新 lidar位姿時刻之前的imu里程計數據

    Eigen::Affine3f imuOdomAffineFront = odom2affine(imuOdomQueue.front());    Eigen::Affine3f imuOdomAffineBack = odom2affine(imuOdomQueue.back());    Eigen::Affine3f imuOdomAffineIncre = imuOdomAffineFront.inverse() * imuOdomAffineBack;

計算最新隊列里imu里程計的增量

Eigen::Affine3f imuOdomAffineLast = lidarOdomAffine * imuOdomAffineIncre;

增量補償到lidar的位姿上去,就得到了最新的預測的位姿

    float x, y, z, roll, pitch, yaw;    pcl::getTranslationAndEulerAngles(imuOdomAffineLast, x, y, z, roll, pitch, yaw);

分解成平移 + 歐拉角的形式

    nav_msgs::Odometry laserOdometry = imuOdomQueue.back();    laserOdometry.pose.pose.position.x = x;    laserOdometry.pose.pose.position.y = y;    laserOdometry.pose.pose.position.z = z;    laserOdometry.pose.pose.orientation = tf::createQuaternionMsgFromRollPitchYaw(roll, pitch, yaw);    pubImuOdometry.publish(laserOdometry);

發送全局一致位姿的 最新位姿

    static tf::TransformBroadcaster tfOdom2BaseLink;    tf::Transform tCur;    tf::poseMsgToTF(laserOdometry.pose.pose, tCur);    if(lidarFrame != baselinkFrame)      tCur = tCur * lidar2Baselink;

更新tf

    tf::StampedTransform odom_2_baselink = tf::StampedTransform(tCur, odomMsg->header.stamp, odometryFrame, baselinkFrame);    tfOdom2BaseLink.sendTransform(odom_2_baselink);

更新odom到baselink的tf

    static nav_msgs::Path imuPath;    static double last_path_time = -1;    double imuTime = imuOdomQueue.back().header.stamp.toSec();    // 控制一下更新頻率,不超過10hz    if (imuTime - last_path_time > 0.1)    {      last_path_time = imuTime;      geometry_msgs::PoseStamped pose_stamped;      pose_stamped.header.stamp = imuOdomQueue.back().header.stamp;      pose_stamped.header.frame_id = odometryFrame;      pose_stamped.pose = laserOdometry.pose.pose;      // 將最新的位姿送入軌跡中      imuPath.poses.push_back(pose_stamped);      // 把lidar時間戳之前的軌跡全部擦除      while(!imuPath.poses.empty() && imuPath.poses.front().header.stamp.toSec() < lidarOdomTime - 1.0)        imuPath.poses.erase(imuPath.poses.begin());      // 發布軌跡,這個軌跡實踐上是可視化imu預積分節點輸出的預測值      if (pubImuPath.getNumSubscribers() != 0)      {        imuPath.header.stamp = imuOdomQueue.back().header.stamp;        imuPath.header.frame_id = odometryFrame;        pubImuPath.publish(imuPath);      }    }  }

發布imu里程計的軌跡,控制一下更新頻率,不超過10hz,將最新的位姿送入軌跡中,把lidar時間戳之前的軌跡全部擦除,發布軌跡,這個軌跡實踐上是可視化imu預積分節點輸出的預測值

result

fbfb02c8-58aa-11ed-a3b6-dac502259ad0.png

其中粉色的部分就是imu的位姿融合輸出path。







審核編輯:劉清

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

    關注

    2

    文章

    762

    瀏覽量

    33564
  • SLAM
    +關注

    關注

    23

    文章

    423

    瀏覽量

    31820
  • 激光雷達
    +關注

    關注

    968

    文章

    3967

    瀏覽量

    189824
  • 回調函數
    +關注

    關注

    0

    文章

    87

    瀏覽量

    11554

原文標題:3d激光SLAM:LIO-SAM框架-位姿融合輸出

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    #硬聲創作季 LIO-SAM耦合激光雷達-慣性里程計

    激光SAM計算機視覺
    Mr_haohao
    發布于 :2022年10月12日 15:21:47

    激光雷達分類以及應用

    激光雷達實際上是種工作在光學波段(特殊波段)的雷達,它的優點非常明顯:1、具有極高的分辨率:激光雷達工作于光學波段,頻率比微波高2~3
    發表于 09-19 15:51

    常見激光雷達種類

    單線激光雷達特點:結構簡單、掃描速度快、分辨率高、可靠性高、成本低。單線激光雷達實際上就是高同頻激光脈沖掃描儀,加上
    發表于 09-25 11:30

    激光雷達

    想了解行業國內做固態激光雷達的廠家,激光雷達里面是怎么樣的啊
    發表于 01-17 15:29

    如何理解SLAM用到的傳感器輪式里程計IMU、雷達、相機的工作原理與使用場景?精選資料分享

    視覺慣性里程計 綜述 VIO Visual Inertial Odometry msckf ROVIO ssf msf okvis ORB-VINS VINS-Mono gtsam目錄里程計
    發表于 07-27 07:21

    請問如何理解SLAM用到的傳感器輪式里程計IMU、雷達、相機的工作原理?

    請問如何理解SLAM用到的傳感器輪式里程計IMU、雷達、相機的工作原理?
    發表于 10-09 08:52

    計算機視覺方向簡介之視覺慣性里程計

    實現SLAM的算法,根據融合框架的不同又分為松耦合耦合。 其中VO(visual odometry)指僅視覺的里程計,T表示位置和姿態。
    的頭像 發表于 04-07 16:57 ?2589次閱讀
    計算機視覺方向簡介之視覺慣性<b class='flag-5'>里程計</b>

    利用GT-SAM耦合激光雷達里程計框架

    從全稱上可以看出,該算法是耦合雷達
    的頭像 發表于 09-14 10:11 ?1822次閱讀

    種快速的激光視覺融合的slam系統

    建立在兩基于直接法的耦合的完整的激光視覺
    的頭像 發表于 11-09 09:55 ?1527次閱讀

    輪式移動機器人里程計分析

    方案(ORB SLAM)、基于激光雷達里程計方案(Hector SLAM)、基于IMU的里程計方案,以及多傳感器融合的方案。
    的頭像 發表于 04-19 10:17 ?1910次閱讀

    介紹種新的全景視覺里程計框架PVO

    論文提出了PVO,這是種新的全景視覺里程計框架,用于實現場景運動、幾何和全景分割信息的更全面建模。
    的頭像 發表于 05-09 16:51 ?1840次閱讀
    介紹<b class='flag-5'>一</b>種新的全景視覺<b class='flag-5'>里程計</b><b class='flag-5'>框架</b>PVO

    基于相機和激光雷達的視覺里程計和建圖系統

    提出種新型的視覺-LiDAR里程計和建圖系統SDV-LOAM,能夠綜合利用相機和激光雷達的信息,實現高效、高精度的姿態估計和實時建圖,且性能優于現有的相機和
    發表于 05-15 16:17 ?750次閱讀
    基于相機和<b class='flag-5'>激光雷達</b>的視覺<b class='flag-5'>里程計</b>和建圖系統

    3d激光SLAMLIO-SAM框架介紹

    里程計(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM庫中的方法。 L
    的頭像 發表于 11-22 15:04 ?1096次閱讀
    3d<b class='flag-5'>激光</b>SLAMLIO-<b class='flag-5'>SAM</b><b class='flag-5'>框架</b>介紹

    LIO-SAM框架是什么

    里程計(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM庫中的方法。 L
    的頭像 發表于 11-24 17:08 ?1211次閱讀
    LIO-<b class='flag-5'>SAM</b><b class='flag-5'>框架</b>是什么

    激光雷達在SLAM算法中的應用綜述

    SLAM算法運行的重要傳感器。基于激光雷達的SLAM算法,對激光雷達SLAM總體框架進行介紹,詳細闡述前端里程計、后端優化、回環檢測、地圖構建模塊的作用并總結所使用的算法;按由2D到
    的頭像 發表于 11-12 10:30 ?490次閱讀
    <b class='flag-5'>激光雷達</b>在SLAM算法中的應用綜述
    主站蜘蛛池模板: 国产成年人在线观看| 白嫩美女直冒白浆| 最新色导航| 9277在线观看免费高清完整版| 最近中文字幕2019免费版日本 | 日本电影护士| 午夜在线观看免费完整直播网页| 无遮挡午夜男女XX00动态| 亚洲免费片| 51久久夜色精品国产| 边吃胸边膜下床震免费版视频| 放射源分类办法| 韩国羞羞秘密教学子开车漫书 | 色综合色综合久久综合频道| 午夜一级毛片看看| 一个人免费视频在线观看| 99久久久免费精品国产| 国产电影无码午夜在线播放| 精品少妇爆AV无码专区| 免费中文字幕视频| 王小军怎么了最新消息| 在线二区 中文 无码| 成人a毛片久久免费播放| 韩国精品韩国专区久久| 免费观看的毛片| 午夜免费体验30分| 4484在线观看视频| 国产精品自拍| 蜜饯1V1高H-| 午夜亚洲精品不卡在线| 9966在线观看免费高清电影| 国产精品无码视频一区二区| 秘密教学93话恩爱久等了免费| 同桌别揉我奶了嗯啊| 综合精品欧美日韩国产在线 | 国产午夜一区二区三区免费视频| 美女教师朝桐光在线播放| 舔1V1高H糙汉| 97国内精品久久久久久久影视| 国产精品自在拍在线播放| 欧美jizz19性欧美|