计算激光雷达各点的仰角并分析其线数——根据lidar文档垂直角公式计算自己的激光雷达参数/以aloam为例子
今日嘗試大佬的激光slam代碼,用自己的數據時,遇到了一點問題
如代碼所示
將點云從ros的msg格式轉換為pcl格式,并計算各點的仰角分析其線數,保存在laserCloudScans(N_SCANS)里,這部分使用的是16線的lidar
以我并沒有看過多少slam代碼的平平無奇的大腦,我立馬想到,這不就是aloam里面相似的計算仰角的代碼么?
大佬的代碼:
//判定各點的線數,按線數保存std::vector<pcl::PointCloud<PointType>> laserCloudScans(N_SCANS);for (int i = 0; i < cloudSize; i++){point.x = laserCloudIn.points[i].x;point.y = laserCloudIn.points[i].y;point.z = laserCloudIn.points[i].z;//仰角float angle = atan(point.z / sqrt(point.x * point.x + point.y * point.y)) * 180 / M_PI;int scanID = 0;if (N_SCANS == 16){scanID = int((angle + 15) / 2 + 0.5);if (scanID > (N_SCANS - 1) || scanID < 0){count--;continue;}}laserCloudScans[scanID].push_back(point);}aloam里面的計算仰角的代碼:
bool halfPassed = false;int count = cloudSize;PointType point;std::vector<pcl::PointCloud<PointType>> laserCloudScans(N_SCANS);for (int i = 0; i < cloudSize; i++){point.x = laserCloudIn.points[i].x;point.y = laserCloudIn.points[i].y;point.z = laserCloudIn.points[i].z;float angle = atan(point.z / sqrt(point.x * point.x + point.y * point.y)) * 180 / M_PI;//-90�?�90��int scanID = 0;if (N_SCANS == 16){scanID = int((angle + 15) / 2 + 0.5);if (scanID > (N_SCANS - 1) || scanID < 0){count--;continue;}}else if (N_SCANS == 32){scanID = int((angle + 92.0/3.0) * 3.0 / 4.0);if (scanID > (N_SCANS - 1) || scanID < 0){count--;continue;}}else if (N_SCANS == 64){ if (angle >= -8.83)scanID = int((2 - angle) * 3.0 + 0.5);elsescanID = N_SCANS / 2 + int((-8.83 - angle) * 2.0 + 0.5);// use [0 50] > 50 remove outlies if (angle > 2 || angle < -24.33 || scanID > 50 || scanID < 0){count--;continue;}}else{printf("wrong scan number\n");ROS_BREAK();}//printf("angle %f scanID %d \n", angle, scanID);在一些大佬對aloam的注釋中,并沒有詳細解釋這些參數是怎么的來的,但是比較詳細的解釋就是這句話
//計算點的仰角(根據lidar文檔垂直角計算公式),根據仰角排列激光線號,velodyne每兩個scan之間間隔2度
于是我茅塞頓開
16線的使用的是velodyne的激光雷達,VLP-16激光雷達是Velodyne公司出品的最小型的3維激光雷達,保留了電機轉速可調節的功能。實時上傳周圍距離和反射率的測量值。VLP-16具有100米的遠量程測量距離。精巧的外觀設計使得安裝非常方便。重量輕,只有830g,非常適合安裝在小型無人機和小型移動機器人上。 每秒高達30萬個點數據輸出。±15°的垂直視場,360°水平視場掃描。
重點來了,它是-15度開始掃描的,因此要用我們算出來的tangle-(-15)才是相對于第一條掃描線的角度,又因為他的每根掃描線間隔為[15-(-15)]/(16-1)=2,所以這就是我們算出來的點在第幾根掃描線上
scanID = int((angle + 15) / 2 + 0.5);
仰角四舍五入(加減0.5截斷效果等于四舍五入)
OK,現在我們把這個方法應用到我們自己的lidar上,先來查查lidar使用手冊,使用手冊上肯定會有每一根掃描線的角度的,像這樣:
如果沒有,那么要它何用?嗬嗬,這就是我們的手冊上的:
我們的是32線的,可以清楚看見每根線的角度,使用剛才的方法來計算
初始角度是2.3125,直接可以得到,而間隔(89.5-2.3125)/(32-1)=2.8125
因此公式為:
scanID = int(((angle - 2.3125)/ 2.8125) + 0.5);
現在我們就學會了如何根據自己的lidar來修改仰角轉換到線數的公式了吧,現在你可以去看看velodyne32/64的相關參數,然后檢驗一下自己是否可以算出來~
總結
以上是生活随笔為你收集整理的计算激光雷达各点的仰角并分析其线数——根据lidar文档垂直角公式计算自己的激光雷达参数/以aloam为例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-Opencv激光测距
- 下一篇: 【记要】计算机基础通识知识