99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個(gè)利用GT-SAM的緊耦合激光雷達(dá)慣導(dǎo)里程計(jì)的框架

工程師鄧生 ? 來(lái)源:古月居 ? 作者:月照銀海似蛟龍 ? 2022-09-14 10:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

LIO-SAM的全稱是:Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping

從全稱上可以看出,該算法是一個(gè)緊耦合的雷達(dá)慣導(dǎo)里程計(jì)(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM庫(kù)中的方法。

LIO-SAM 提出了一個(gè)利用GT-SAM的緊耦合激光雷達(dá)慣導(dǎo)里程計(jì)的框架。

實(shí)現(xiàn)了高精度、實(shí)時(shí)的移動(dòng)機(jī)器人的軌跡估計(jì)和建圖。

其中點(diǎn)云運(yùn)動(dòng)畸變矯正的代碼在圖像投影的節(jié)點(diǎn)中

23c33d90-33ba-11ed-ba43-dac502259ad0.png

可以看到該節(jié)點(diǎn) 訂閱 3種消息:

原始點(diǎn)云數(shù)據(jù)

原始imu數(shù)據(jù)

imu預(yù)積分后預(yù)測(cè)的imu里程計(jì)數(shù)據(jù)其中完成的一個(gè)主要功能就是進(jìn)行畸變矯正。

本篇博客將解讀其畸變矯正處理流程部分。

23d60f9c-33ba-11ed-ba43-dac502259ad0.png

畸變矯正

將點(diǎn)云投影到一個(gè)矩陣上,并保存每個(gè)點(diǎn)的信息,并在內(nèi)部進(jìn)行畸變矯正

  void projectPointCloud()  {

    int cloudSize = laserCloudIn->points.size();    for (int i = 0; i < cloudSize; ++i)    {

遍歷整個(gè)點(diǎn)云

      PointType thisPoint;       thisPoint.x = laserCloudIn->points[i].x;      thisPoint.y = laserCloudIn->points[i].y;      thisPoint.z = laserCloudIn->points[i].z;      thisPoint.intensity = laserCloudIn->points[i].intensity;

取出對(duì)應(yīng)的某個(gè)點(diǎn)

float range = pointDistance(thisPoint);

計(jì)算這個(gè)點(diǎn)距離lidar中心的距離

      if (range < lidarMinRange || range > lidarMaxRange)        continue;

距離太小或者太遠(yuǎn)都認(rèn)為是異常點(diǎn)

      int rowIdn = laserCloudIn->points[i].ring;      if (rowIdn < 0 || rowIdn >= N_SCAN)        continue;      if (rowIdn % downsampleRate != 0)        continue;

取出對(duì)應(yīng)的在第幾根scan上


scan id 合理判斷


如果需要降采樣,就根據(jù)scan id 適當(dāng)跳過(guò)

      float horizonAngle = atan2(thisPoint.x, thisPoint.y) * 180 / M_PI;       static float ang_res_x = 360.0/float(Horizon_SCAN);      int columnIdn = -round((horizonAngle-90.0)/ang_res_x) + Horizon_SCAN/2;      if (columnIdn >= Horizon_SCAN)        columnIdn -= Horizon_SCAN;      if (columnIdn < 0 || columnIdn >= Horizon_SCAN)        continue;

計(jì)算水平角

計(jì)算水平分辨率


計(jì)算水平線束id ,轉(zhuǎn)換到x負(fù)方向?yàn)槠鹗?,順時(shí)針為正方向,范圍[0-H]


對(duì)水平角做補(bǔ)償,因?yàn)槔走_(dá)是順時(shí)針旋轉(zhuǎn),


對(duì)水平id進(jìn)行檢查

      if (rangeMat.at(rowIdn, columnIdn) != FLT_MAX)        continue;

如果這個(gè)位置有填充了就跳過(guò)


點(diǎn)云不是完全的360度,可能會(huì)多一些

      thisPoint = deskewPoint(&thisPoint, laserCloudIn->points[i].time);

對(duì)點(diǎn)做運(yùn)動(dòng)補(bǔ)償

rangeMat.at(rowIdn, columnIdn) = range;

將這個(gè)點(diǎn)的距離數(shù)據(jù)保存進(jìn)這個(gè)range矩陣種

int index = columnIdn + rowIdn * Horizon_SCAN;

算出點(diǎn)的索引

fullCloud->points[index] = thisPoint;

保存這個(gè)點(diǎn)的坐標(biāo)

之后來(lái)看下運(yùn)動(dòng)補(bǔ)償?shù)煤瘮?shù)deskewPoint

  PointType deskewPoint(PointType *point, double relTime)  {

    if (deskewFlag == -1 || cloudInfo.imuAvailable == false)      return *point;

判斷是否可以進(jìn)行運(yùn)動(dòng)補(bǔ)償,不能得話則之間返回原點(diǎn)


判斷依據(jù):

deskewFlag 是原始點(diǎn)云 沒(méi)有 time得標(biāo)簽 則為-1

cloudInfo.imuAvailable 的原始imu里面的數(shù)據(jù)判斷

    double pointTime = timeScanCur + relTime;

relTime 是相對(duì)時(shí)間,加上起始時(shí)間就是絕對(duì)時(shí)間

    float rotXCur, rotYCur, rotZCur;    findRotation(pointTime, &rotXCur, &rotYCur, &rotZCur);

通過(guò)findRotation函數(shù) 計(jì)算當(dāng)前點(diǎn) 相對(duì)起始點(diǎn)的相對(duì)旋轉(zhuǎn)

其內(nèi)部為:

  void findRotation(double pointTime, float *rotXCur, float *rotYCur, float *rotZCur)  {    *rotXCur = 0; *rotYCur = 0; *rotZCur = 0;

先將相對(duì)旋轉(zhuǎn)至0

    int imuPointerFront = 0;    while (imuPointerFront < imuPointerCur)    {      if (pointTime < imuTime[imuPointerFront])        break;      ++imuPointerFront;    }

找到距離該點(diǎn)云時(shí)間最近的 大于該點(diǎn)云時(shí)間的點(diǎn)

    if (pointTime > imuTime[imuPointerFront] || imuPointerFront == 0)    {      *rotXCur = imuRotX[imuPointerFront];      *rotYCur = imuRotY[imuPointerFront];      *rotZCur = imuRotZ[imuPointerFront];    }

如果時(shí)間戳不在兩個(gè)imu的旋轉(zhuǎn)之間,就直接賦值了

    } else {       int imuPointerBack = imuPointerFront - 1;      double ratioFront = (pointTime - imuTime[imuPointerBack]) / (imuTime[imuPointerFront] - imuTime[imuPointerBack]);      double ratioBack = (imuTime[imuPointerFront] - pointTime) / (imuTime[imuPointerFront] - imuTime[imuPointerBack]);      *rotXCur = imuRotX[imuPointerFront] * ratioFront + imuRotX[imuPointerBack] * ratioBack;      *rotYCur = imuRotY[imuPointerFront] * ratioFront + imuRotY[imuPointerBack] * ratioBack;      *rotZCur = imuRotZ[imuPointerFront] * ratioFront + imuRotZ[imuPointerBack] * ratioBack;    }

否則 作一個(gè)線性插值,得到相對(duì)旋轉(zhuǎn)


算兩個(gè)權(quán)重 進(jìn)行 插值

    float posXCur, posYCur, posZCur;    findPosition(relTime, &posXCur, &posYCur, &posZCur);

這里沒(méi)有計(jì)算平移補(bǔ)償 如果運(yùn)動(dòng)不快的話

    if (firstPointFlag == true)    {      transStartInverse = (pcl::getTransformation(posXCur, posYCur, posZCur, rotXCur, rotYCur, rotZCur)).inverse();      firstPointFlag = false;    }

計(jì)算第一個(gè)點(diǎn)的相對(duì)位姿

    Eigen::Affine3f transFinal = pcl::getTransformation(posXCur, posYCur, posZCur, rotXCur, rotYCur, rotZCur);    Eigen::Affine3f transBt = transStartInverse * transFinal;

計(jì)算當(dāng)前點(diǎn)和第一點(diǎn)的相對(duì)位姿

    newPoint.x = transBt(0,0) * point->x + transBt(0,1) * point->y + transBt(0,2) * point->z + transBt(0,3);    newPoint.y = transBt(1,0) * point->x + transBt(1,1) * point->y + transBt(1,2) * point->z + transBt(1,3);    newPoint.z = transBt(2,0) * point->x + transBt(2,1) * point->y + transBt(2,2) * point->z + transBt(2,3);    newPoint.intensity = point->intensity;    return newPoint;

就是R*p+t ,把點(diǎn)補(bǔ)償?shù)降谝粋€(gè)點(diǎn)對(duì)應(yīng)的時(shí)刻的位姿

然后看提取出有效的點(diǎn)的信息 函數(shù)cloudExtraction

  void cloudExtraction()  {

    for (int i = 0; i < N_SCAN; ++i)    {

遍歷每一根scan

cloudInfo.startRingIndex[i] = count - 1 + 5;

這個(gè)scan可以計(jì)算曲率的起始點(diǎn)(計(jì)算曲率需要左右各五個(gè)點(diǎn))

      for (int j = 0; j < Horizon_SCAN; ++j)      {

遍歷該 scan上的每 個(gè)點(diǎn)

        if (rangeMat.at(i,j) != FLT_MAX)//FLT_MAX就是最大的浮點(diǎn)數(shù)        {

判斷該點(diǎn) 是否 是一個(gè) 有效的點(diǎn)


rangeMat的每個(gè)點(diǎn)初始化為FLT_MAX ,如果點(diǎn)有效,則會(huì)賦值為 range

cloudInfo.pointColInd[count] = j;

點(diǎn)云信息里面 這個(gè)點(diǎn)對(duì)應(yīng)著哪一個(gè)垂直線

cloudInfo.pointRange[count] = rangeMat.at(i,j);

點(diǎn)云信息里面 保存它的距離信息

 extractedCloud->push_back(fullCloud->points[j + i*Horizon_SCAN]);

他的3d坐標(biāo)信息

cloudInfo.endRingIndex[i] = count -1 - 5;

這個(gè)scan可以計(jì)算曲率的終端

在上面處理完后


即可發(fā)布點(diǎn)云

  void publishClouds()  {    cloudInfo.header = cloudHeader;    cloudInfo.cloud_deskewed = publishCloud(&pubExtractedCloud, extractedCloud, cloudHeader.stamp, lidarFrame);    pubLaserCloudInfo.publish(cloudInfo);  }

最后將處理后的點(diǎn)云發(fā)布出去

result

23ec0fe0-33ba-11ed-ba43-dac502259ad0.png

23fb2ef8-33ba-11ed-ba43-dac502259ad0.png

240d608c-33ba-11ed-ba43-dac502259ad0.png





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 3D
    3D
    +關(guān)注

    關(guān)注

    9

    文章

    2959

    瀏覽量

    110745
  • SAM
    SAM
    +關(guān)注

    關(guān)注

    0

    文章

    115

    瀏覽量

    33932
  • 激光雷達(dá)
    +關(guān)注

    關(guān)注

    971

    文章

    4235

    瀏覽量

    192844

原文標(biāo)題:LIO-SAM點(diǎn)云預(yù)處理前端:畸變矯正

文章出處:【微信號(hào):3D視覺(jué)工坊,微信公眾號(hào):3D視覺(jué)工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【SOA是什么?】#激光雷達(dá)

    激光雷達(dá)
    天津見(jiàn)合八方光電科技有限公司
    發(fā)布于 :2025年07月15日 14:39:59

    超酷的樹莓派激光雷達(dá)掃描儀!

    摘要這款DIY的PiLiDAR掃描儀項(xiàng)目利用樹莓派進(jìn)行激光雷達(dá)測(cè)繪。激光雷達(dá)通過(guò)發(fā)射激光來(lái)掃描周圍環(huán)境,從而創(chuàng)建三維模型。該項(xiàng)目需要樹莓派4、攝像頭、電機(jī)以及
    的頭像 發(fā)表于 06-01 08:33 ?322次閱讀
    超酷的樹莓派<b class='flag-5'>激光雷達(dá)</b>掃描儀!

    種新型激光雷達(dá)慣性視覺(jué)里程計(jì)系統(tǒng)介紹

    針對(duì)具有挑戰(zhàn)性的光照條件和惡劣環(huán)境,本文提出了LIR-LIVO,這是種輕量級(jí)且穩(wěn)健的激光雷達(dá)-慣性-視覺(jué)里程計(jì)系統(tǒng)。通過(guò)采用諸如利用深度與激光雷達(dá)
    的頭像 發(fā)表于 04-28 11:18 ?357次閱讀
    <b class='flag-5'>一</b>種新型<b class='flag-5'>激光雷達(dá)</b>慣性視覺(jué)<b class='flag-5'>里程計(jì)</b>系統(tǒng)介紹

    極氪007GT搭載禾賽ATX激光雷達(dá)上市

    近日,極氪科技集團(tuán)旗下首款搭載禾賽激光雷達(dá)的車型極氪 007GT 正式上市,共發(fā)布后驅(qū)智駕版、長(zhǎng)續(xù)航后驅(qū)智駕版、四驅(qū)智駕版三個(gè)版型,官方零售價(jià)為 20.29-23.29 萬(wàn)元。極氪 007GT
    的頭像 發(fā)表于 04-18 11:31 ?638次閱讀

    則消息引爆激光雷達(dá)行業(yè)!特斯拉竟然在自研激光雷達(dá)

    電子發(fā)燒友網(wǎng)報(bào)道(文/梁浩斌)則消息引爆激光雷達(dá)行業(yè)?上周業(yè)界流傳的份會(huì)議紀(jì)要稱,有自動(dòng)駕駛專家透露,特斯拉已經(jīng)設(shè)計(jì)了自己的激光雷達(dá),并正在與大陸集團(tuán)合作,將自己開發(fā)的
    的頭像 發(fā)表于 12-30 00:09 ?2215次閱讀

    科普:文了解固態(tài)和半固態(tài)激光雷達(dá)

    激光雷達(dá)(LiDAR,Laser Detecting and Ranging)作為種先進(jìn)的傳感技術(shù),通過(guò)發(fā)射激光脈沖并測(cè)量其返回時(shí)間來(lái)計(jì)算目標(biāo)距離,被廣泛應(yīng)用于自動(dòng)駕駛、機(jī)器人、工業(yè)自動(dòng)化等領(lǐng)域
    的頭像 發(fā)表于 12-23 18:06 ?2571次閱讀

    字線光斑激光雷達(dá),開拓創(chuàng)新應(yīng)用賽道?

    ? 電子發(fā)燒友網(wǎng)報(bào)道(文/梁浩斌)激光雷達(dá)根據(jù)用途的不同,般投射出的光斑是單點(diǎn)或面陣,是由個(gè)點(diǎn)光源或多個(gè)光源組成的面光源發(fā)出,比如,在掃地機(jī)器人上單點(diǎn)
    的頭像 發(fā)表于 11-18 08:03 ?4930次閱讀
    <b class='flag-5'>一</b>字線光斑<b class='flag-5'>激光雷達(dá)</b>,開拓創(chuàng)新應(yīng)用賽道?

    激光雷達(dá)在SLAM算法中的應(yīng)用綜述

    SLAM算法運(yùn)行的重要傳感器?;?b class='flag-5'>激光雷達(dá)的SLAM算法,對(duì)激光雷達(dá)SLAM總體框架進(jìn)行介紹,詳細(xì)闡述前端里程計(jì)、后端優(yōu)化、回環(huán)檢測(cè)、地圖構(gòu)建模塊的作用并總結(jié)所使用的算法;按由2D到
    的頭像 發(fā)表于 11-12 10:30 ?2531次閱讀
    <b class='flag-5'>激光雷達(dá)</b>在SLAM算法中的應(yīng)用綜述

    激光雷達(dá)會(huì)傷害眼睛嗎?

    隨著激光雷達(dá)日益普及,人們開始擔(dān)憂:這種發(fā)射激光的設(shè)備,對(duì)人眼的安全性如何?了解這個(gè)問(wèn)題前,我們首先需要知道激光雷達(dá)和它發(fā)射的激光,到底是什么。
    的頭像 發(fā)表于 11-07 10:47 ?846次閱讀
    <b class='flag-5'>激光雷達(dá)</b>會(huì)傷害眼睛嗎?

    激光雷達(dá)的維護(hù)與故障排查技巧

    激光雷達(dá)(LiDAR,Light Detection and Ranging)是利用激光進(jìn)行距離測(cè)量和目標(biāo)識(shí)別的技術(shù)。它廣泛應(yīng)用于無(wú)人駕駛汽車、地理信息系統(tǒng)(GIS)、環(huán)境監(jiān)測(cè)、航
    的頭像 發(fā)表于 10-27 11:04 ?3755次閱讀

    激光雷達(dá)技術(shù)的基于深度學(xué)習(xí)的進(jìn)步

    信息。這使得激光雷達(dá)在自動(dòng)駕駛、無(wú)人機(jī)、機(jī)器人等領(lǐng)域具有廣泛的應(yīng)用前景。 二、深度學(xué)習(xí)技術(shù)的發(fā)展 深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的個(gè)分支,它通過(guò)模擬人腦的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)來(lái)處理和分析數(shù)據(jù)。近年來(lái),深度學(xué)習(xí)技術(shù)在圖像識(shí)別、語(yǔ)音
    的頭像 發(fā)表于 10-27 10:57 ?1065次閱讀

    激光雷達(dá)技術(shù)的發(fā)展趨勢(shì)

    激光雷達(dá)(LiDAR,Light Detection and Ranging)技術(shù)是種通過(guò)發(fā)射激光脈沖并接收其反射來(lái)測(cè)量距離和速度的遙感技術(shù)。它在多個(gè)領(lǐng)域,如測(cè)繪、環(huán)境監(jiān)測(cè)、自動(dòng)駕駛汽車和無(wú)人機(jī)等
    的頭像 發(fā)表于 10-27 10:44 ?2198次閱讀

    LIDAR激光雷達(dá)逆向建模能用到revit當(dāng)中嗎

    LIDAR激光雷達(dá)逆向建模是利用激光雷達(dá)技術(shù)獲取物體表面數(shù)據(jù),然后通過(guò)計(jì)算機(jī)軟件進(jìn)行建模的方法。在建筑行業(yè)中,這種方法可以用于建筑物的三維建模、結(jié)構(gòu)分析、施工模擬等。Revit是
    的頭像 發(fā)表于 08-29 17:23 ?954次閱讀

    光學(xué)雷達(dá)激光雷達(dá)的區(qū)別是什么

    光學(xué)雷達(dá)激光雷達(dá)是兩種不同的遙感技術(shù),它們?cè)谠?、?yīng)用、優(yōu)缺點(diǎn)等方面都存在定的差異。以下是對(duì)光學(xué)雷達(dá)激光雷達(dá)的比較: 定義和原理 光學(xué)
    的頭像 發(fā)表于 08-29 17:20 ?3255次閱讀

    激光雷達(dá)點(diǎn)云數(shù)據(jù)包含哪些信息

    激光雷達(dá)(LiDAR)是利用激光技術(shù)進(jìn)行距離測(cè)量的遙感技術(shù)。它通過(guò)發(fā)射激光脈沖并接收反射回來(lái)的光束,來(lái)測(cè)量物體與
    的頭像 發(fā)表于 08-29 17:18 ?1827次閱讀