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

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

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

3天內不再提示

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

工程師鄧生 ? 來源:古月居 ? 作者:月照銀海似蛟龍 ? 2022-09-14 10:11 ? 次閱讀

前言

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

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

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

實現了高精度、實時的移動機器人的軌跡估計和建圖。

其中點云運動畸變矯正的代碼在圖像投影的節點中

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

可以看到該節點 訂閱 3種消息:

原始點云數據

原始imu數據

imu預積分后預測的imu里程計數據其中完成的一個主要功能就是進行畸變矯正

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

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

畸變矯正

將點云投影到一個矩陣上,并保存每個點的信息,并在內部進行畸變矯正

  void projectPointCloud()  {

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

遍歷整個點云

      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;

取出對應的某個點

float range = pointDistance(thisPoint);

計算這個點距離lidar中心的距離

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

距離太小或者太遠都認為是異常點

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

取出對應的在第幾根scan上


scan id 合理判斷


如果需要降采樣,就根據scan id 適當跳過

      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;

計算水平角

計算水平分辨率


計算水平線束id ,轉換到x負方向為起始,順時針為正方向,范圍[0-H]


對水平角做補償,因為雷達是順時針旋轉,


對水平id進行檢查

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

如果這個位置有填充了就跳過


點云不是完全的360度,可能會多一些

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

對點做運動補償

rangeMat.at(rowIdn, columnIdn) = range;

將這個點的距離數據保存進這個range矩陣種

int index = columnIdn + rowIdn * Horizon_SCAN;

算出點的索引

fullCloud->points[index] = thisPoint;

保存這個點的坐標

之后來看下運動補償得函數deskewPoint

  PointType deskewPoint(PointType *point, double relTime)  {

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

判斷是否可以進行運動補償,不能得話則之間返回原點


判斷依據:

deskewFlag 是原始點云 沒有 time得標簽 則為-1

cloudInfo.imuAvailable 的原始imu里面的數據判斷

    double pointTime = timeScanCur + relTime;

relTime 是相對時間,加上起始時間就是絕對時間

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

通過findRotation函數 計算當前點 相對起始點的相對旋轉

其內部為:

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

先將相對旋轉至0

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

找到距離該點云時間最近的 大于該點云時間的點

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

如果時間戳不在兩個imu的旋轉之間,就直接賦值了

    } 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;    }

否則 作一個線性插值,得到相對旋轉


算兩個權重 進行 插值

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

這里沒有計算平移補償 如果運動不快的話

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

計算第一個點的相對位姿

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

計算當前點和第一點的相對位姿

    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 ,把點補償到第一個點對應的時刻的位姿

然后看提取出有效的點的信息 函數cloudExtraction

  void cloudExtraction()  {

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

遍歷每一根scan

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

這個scan可以計算曲率的起始點(計算曲率需要左右各五個點)

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

遍歷該 scan上的每 個點

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

判斷該點 是否 是一個 有效的點


rangeMat的每個點初始化為FLT_MAX ,如果點有效,則會賦值為 range

cloudInfo.pointColInd[count] = j;

點云信息里面 這個點對應著哪一個垂直線

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

點云信息里面 保存它的距離信息

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

他的3d坐標信息

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

這個scan可以計算曲率的終端

在上面處理完后


即可發布點云

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

最后將處理后的點云發布出去

result

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

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

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





審核編輯:劉清

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

    關注

    9

    文章

    2875

    瀏覽量

    107485
  • SAM
    SAM
    +關注

    關注

    0

    文章

    112

    瀏覽量

    33519
  • 激光雷達
    +關注

    關注

    968

    文章

    3967

    瀏覽量

    189825

原文標題:LIO-SAM點云預處理前端:畸變矯正

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

收藏 人收藏

    評論

    相關推薦

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

    SLAM算法運行的重要傳感器。基于激光雷達的SLAM算法,對激光雷達SLAM總體框架進行介紹,詳細闡述前端里程計、后端優化、回環檢測、地圖構建模塊的作用并總結所使用的算法;按由2D到
    的頭像 發表于 11-12 10:30 ?497次閱讀
    <b class='flag-5'>激光雷達</b>在SLAM算法中的應用綜述

    激光雷達會傷害眼睛嗎?

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

    激光雷達的維護與故障排查技巧

    激光雷達(LiDAR,Light Detection and Ranging)是利用激光進行距離測量和目標識別的技術。它廣泛應用于無人駕駛汽車、地理信息系統(GIS)、環境監測、航
    的頭像 發表于 10-27 11:04 ?943次閱讀

    激光雷達技術的基于深度學習的進步

    信息。這使得激光雷達在自動駕駛、無人機、機器人等領域具有廣泛的應用前景。 二、深度學習技術的發展 深度學習是機器學習的分支,它通過模擬人腦的神經網絡結構來處理和分析數據。近年來,深度學習技術在圖像識別、語音
    的頭像 發表于 10-27 10:57 ?367次閱讀

    激光雷達技術的發展趨勢

    激光雷達(LiDAR,Light Detection and Ranging)技術是種通過發射激光脈沖并接收其反射來測量距離和速度的遙感技術。它在多個領域,如測繪、環境監測、自動駕駛汽車和無人機等
    的頭像 發表于 10-27 10:44 ?792次閱讀

    LIDAR激光雷達逆向建模能用到revit當中嗎

    LIDAR激光雷達逆向建模是利用激光雷達技術獲取物體表面數據,然后通過計算機軟件進行建模的方法。在建筑行業中,這種方法可以用于建筑物的三維建模、結構分析、施工模擬等。Revit是
    的頭像 發表于 08-29 17:23 ?528次閱讀

    光學雷達激光雷達的區別是什么

    光學雷達激光雷達是兩種不同的遙感技術,它們在原理、應用、優缺點等方面都存在定的差異。以下是對光學雷達激光雷達的比較: 定義和原理 光學
    的頭像 發表于 08-29 17:20 ?1276次閱讀

    激光雷達點云數據包含哪些信息

    激光雷達(LiDAR)是利用激光技術進行距離測量的遙感技術。它通過發射激光脈沖并接收反射回來的光束,來測量物體與
    的頭像 發表于 08-29 17:18 ?908次閱讀

    文看懂激光雷達

    ? ? 文章大綱 城市 NOA 成競爭高地,政策助力高階智能駕駛加速落地 成本下探+智駕升級,2030年激光雷達市場規模有望超萬億 ? ????·城市 NOA面臨工況復雜問題,激光雷達為“優選
    的頭像 發表于 06-27 08:42 ?614次閱讀
    <b class='flag-5'>一</b>文看懂<b class='flag-5'>激光雷達</b>

    亮道智能:發布全新激光雷達,未來主攻固態激光雷達低價市場

    亮道智能官方透露該公司已為眾多行業客戶提供全面的激光雷達感知解決方案,包括車規級激光雷達硬件及其感知功能開發、測試驗證及數據服務。
    的頭像 發表于 03-06 15:22 ?713次閱讀

    激光雷達LIDAR基本工作原理

    激光雷達LiDAR工作原理激光雷達LiDAR的全稱為LightDetectionandRanging激光探測和測距,又稱光學雷達
    的頭像 發表于 03-05 08:11 ?5096次閱讀
    <b class='flag-5'>激光雷達</b>LIDAR基本工作原理

    一個激光雷達,需要哪些基本部件?

    激光雷達(LiDAR)是激光探測及測距系統的簡稱,目前廣泛應用在無人駕駛和掃地機器人等領域。這種廣泛的應用方面得益于激光雷達的性能提升,
    發表于 01-19 14:22 ?1086次閱讀
    做<b class='flag-5'>一個</b><b class='flag-5'>激光雷達</b>,需要哪些基本部件?

    華為激光雷達參數怎么設置

    華為激光雷達種常用的傳感器技術,可用于距離測量和感應。它的參數設置對于確保其性能和功能至關重要。在本文中,我們將詳細介紹華為激光雷達的參數設置以及其影響和應用。 首先,我們需要了解激光雷達
    的頭像 發表于 01-19 14:17 ?1768次閱讀

    禾賽科技推出AT512激光雷達

    今日,禾賽科技在智能駕駛領域再創輝煌,正式推出了業界翹首以盼的“性能王牌”——AT512激光雷達。作為禾賽AT系列的巔峰之作,AT512不僅代表了禾賽在激光雷達技術上的突破性進展,更是智能駕駛領域的一大里程碑。
    的頭像 發表于 01-09 14:32 ?829次閱讀

    禾賽科技激光雷達累計交付突破30萬臺 全球首個創下此里程碑的車載激光雷達公司

    今日,全球激光雷達領導者禾賽科技宣布,公司自成立以來激光雷達累計交付量突破30 萬臺,成為全球首個創下此里程碑的車載激光雷達公司。 ? 自 2022 年 7 月正式開啟前裝量產以來,禾
    的頭像 發表于 12-27 09:44 ?550次閱讀
    禾賽科技<b class='flag-5'>激光雷達</b>累計交付突破30萬臺 全球首個創下此<b class='flag-5'>里程</b>碑的車載<b class='flag-5'>激光雷達</b>公司
    主站蜘蛛池模板: 99国产精品白浆在线观看免费| 亚洲伊人色| 熟妇无码乱子成人精品| 色色噜一噜| 小妇人电影免费完整观看2021| 午夜熟女插插XX免费视频| 亚洲AV无码乱码国产麻豆P| 亚洲精品无码AV中文字幕蜜桃| 野花影院手机在线观看| 最新无码国产在线视频9299| 99久久全国免费久久爱| 丰满人妻妇伦又伦精品APP国产| 国产成人在线观看网站| 国语对白老女人8av| 乱h好大噗嗤噗嗤烂了| 青青青草免费| 午夜一级毛片看看| 在线播放免费人成视频| A级韩国乱理伦片在线观看| 高h 纯肉文| 寂寞夜晚看免费视频| 麻花豆传媒剧国产免费mv观看| 人妻洗澡被强公日日澡| 午夜亚洲国产理论片二级港台二级| 亚洲午夜福利未满十八勿进| 99精品视频在线观看| 免费看毛片网| 色综合精品无码一区二区三区| 亚洲精品人成电影网| 99久久精品免费精品国产 | 一个人HD在线观看免费高清视频| 中国人泡妞www免费| 草莓视频在线免费观看| 狠狠色狠狠色综合日日小说| 男生J桶进女人P又色又爽又黄| 婷婷精品国产亚洲AV在线观看| 在线播放午夜理论片| 粗大分开挺进内射| 久久99国产精品一区二区| 人妻中文字幕无码系列| 亚洲视频成人|