吴忠躺衫网络科技有限公司

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

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

3天內不再提示

LIO-SAM框架位姿融合輸出

麥辣雞腿堡 ? 來源:古月居 ? 作者:月照銀海似蛟龍 ? 2023-11-24 17:28 ? 次閱讀

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

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

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

圖片

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

  • 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< nav_msgs::Odometry >("lio_sam/mapping/odometry", 5, &TransformFusion::lidarOdometryHandler, this, ros::TransportHints().tcpNoDelay());        subImuOdometry   = nh.subscribe< nav_msgs::Odometry >(odomTopic+"_incremental",   2000, &TransformFusion::imuOdometryHandler,   this, ros::TransportHints().tcpNoDelay());

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

pubImuOdometry   = nh.advertise&lt;nav_msgs::Odometry&gt;(odomTopic, 2000);        pubImuPath       = nh.advertise&lt;nav_msgs::Path&gt;    ("lio_sam/imu/path", 1);

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

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

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

void imuOdometryHandler(const nav_msgs::Odometry::ConstPtr& odomMsg)    {
static tf::TransformBroadcaster tfMap2Odom;        static tf::Transform map_to_odom = tf::Transform(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預積分節點輸出的預測值。

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

    關注

    0

    文章

    403

    瀏覽量

    17543
  • 檢測
    +關注

    關注

    5

    文章

    4512

    瀏覽量

    91748
  • SAM
    SAM
    +關注

    關注

    0

    文章

    113

    瀏覽量

    33576
  • 激光雷達
    +關注

    關注

    968

    文章

    4026

    瀏覽量

    190409
收藏 人收藏

    評論

    相關推薦

    激光SLAM:Faster-Lio算法編譯與測試

    Faster-LIO是基于FastLIO2開發的。FastLIO2是開源LIO中比較優秀的一個,前端用了增量的kdtree(ikd-tree),后端用了迭代ESKF(IEKF),流程短,計算快
    的頭像 發表于 01-12 10:22 ?3156次閱讀
    激光SLAM:Faster-<b class='flag-5'>Lio</b>算法編譯與測試

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

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

    基于多傳感器信息融合的物體位姿檢測方法

    提出了利用攝像機和超聲傳感器信息融合對機器人操作對象進行姿檢測的方法。該方法通過單幅圖像獲取目標點在圖像中的理想坐標,求得投影矢量的方向,然后通過機器人末端的
    發表于 06-23 10:43 ?13次下載

    一種移動機器人的姿檢測模塊設計_方慶山

    一種移動機器人的姿檢測模塊設計_方慶山
    發表于 03-19 11:45 ?1次下載

    工業機器人姿準確度_重復性測量儀設計

    激光 姿測量
    發表于 08-07 17:36 ?4次下載

    裝配機器人姿誤差建模與補償研究

    姿精度是研究機器人的關鍵性能指標。國內外學者一直關注并不斷研究發現多種多樣的誤差補償方法如硬件補償法、攝動補償算法和直接修正算法對機器人的姿誤差進行補償。陳明哲與張啟先采用雅可比矩
    發表于 04-20 16:56 ?1次下載
    裝配機器人<b class='flag-5'>位</b><b class='flag-5'>姿</b>誤差建模與補償研究

    Microchip為PIC?和SAM單片機提供統一的軟件開發框架_MPLAB Harmony v3

    Microchip Technology 今日宣布推出最新版本的統一軟件框架MPLAB? Harmony 3.0(v3),首次為SAM MCU提供支持。
    發表于 03-25 16:50 ?1312次閱讀

    基于自適應模糊控制方法的噴桿姿主動控制器

    基于自適應模糊控制方法的噴桿姿主動控制器
    發表于 07-01 16:11 ?8次下載

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

    LIO-SAM 提出了一個利用GT-SAM的緊耦合激光雷達慣導里程計的框架。實現了高精度、實時的移動機器人的軌跡估計和建圖。
    的頭像 發表于 10-31 09:25 ?2492次閱讀

    如何去使用深度學習的model SLAM姿估計的自訓練方法

    如何進行魯棒的姿圖優化來得到比較可靠的SLAM估計?提出了一種自動協方差調整的姿圖優化,這里如果展開講可能需要很長時間,在這邊只做一個比較宏觀的介紹。
    發表于 03-29 09:53 ?890次閱讀

    常見姿估計算法的比較:三角測量、PNP、ICP

    相機標定工程用到的是DLT(直接線性變換算法) ,它是一類PnP問題 (3D-2D) 。請參考【姿估計 | 視覺SLAM| 筆記】常見姿估計算法的比較 PnP
    發表于 06-07 11:56 ?0次下載
    常見<b class='flag-5'>位</b><b class='flag-5'>姿</b>估計算法的比較:三角測量、PNP、ICP

    從8AVR到32SAM D21 MCU的應用程序移植

    電子發燒友網站提供《從8AVR到32SAM D21 MCU的應用程序移植.pdf》資料免費下載
    發表于 09-20 11:41 ?1次下載
    從8<b class='flag-5'>位</b>AVR到32<b class='flag-5'>位</b><b class='flag-5'>SAM</b> D21 MCU的應用程序移植

    從8PIC18F到32SAM D21 MCU的應用程序移植

    電子發燒友網站提供《從8PIC18F到32SAM D21 MCU的應用程序移植.pdf》資料免費下載
    發表于 09-20 11:22 ?0次下載
    從8<b class='flag-5'>位</b>PIC18F到32<b class='flag-5'>位</b><b class='flag-5'>SAM</b> D21 MCU的應用程序移植

    3d激光SLAMLIO-SAM框架介紹

    里程計的框架。 實現了高精度、實時的移動機器人的軌跡估計和建圖。 本篇博客重點解讀LIO-SAM框架下IMU預積分功能數據初始化代碼部分 LIO-SAM 的代碼主要在其主目錄內的src
    的頭像 發表于 11-22 15:04 ?1212次閱讀
    3d激光SLAMLIO-<b class='flag-5'>SAM</b><b class='flag-5'>框架</b>介紹

    LIO-SAM框架是什么

    里程計的框架。實現了高精度、實時的移動機器人的軌跡估計和建圖。在之前的博客講解了imu如何進行預積分,最終以imu的頻率發布了imu的預測位姿里程計。 本篇博客主要講解,最終是如何進行姿
    的頭像 發表于 11-24 17:08 ?1295次閱讀
    <b class='flag-5'>LIO-SAM</b><b class='flag-5'>框架</b>是什么
    顶级赌场官方网站| 赌场百家乐官网的玩法技巧和规则 | 南岸区| 百家乐官网斗视频游戏| 百家乐官网桌手机套| 百家乐官网软件代打| 百家乐官网赌博大赢家| 百家乐试玩账户| 怎么玩百家乐的玩法技巧和规则 | 百家乐官网门户网站| 百家乐官网最好投| 百家乐赌场代理荐| 博彩网百家乐全讯网| 顶级赌场手机版官方下载| 百家乐官网路的看法| 百家乐官网程序开户发| 澳门百家乐博彩网| 威尼斯人娱乐城游戏平台| 太阳城网上娱乐| 申博百家乐官网有假吗| 百家乐开户就送现金| 太阳城娱乐总站| 葡京百家乐官网注码| 伯爵百家乐官网的玩法技巧和规则 | bet365备用 必发| 百家乐官网是否有路子| 百家乐官网赢钱公式论| 大上海百家乐的玩法技巧和规则| 香港六合彩白小姐图库| 哪个百家乐官网投注比较好| 百家乐官网15人桌| 博天堂百家乐的玩法技巧和规则| 龙博娱乐| 圆梦城百家乐官网娱乐城| 百家乐连开6把小| 大发888吧| 百家乐官网庄闲和概率| 百家乐视频象棋| 风水24山那个排第一| 大发888注册送58元| 查看百家乐官网赌博|