上传文件至 /
parent
8181dd35bd
commit
620c948b56
|
@ -0,0 +1,91 @@
|
||||||
|
一.算法概述
|
||||||
|
1.1 算法解决问题
|
||||||
|
根据语义激光雷达信息,在地图上相应位置绘出对应物体
|
||||||
|
1.2 输入,输出,数据格式
|
||||||
|
输入信息:ROS格式的激光雷达(其中intensities并非指激光雷达点的返回强度,而是语义信息)
|
||||||
|
|
||||||
|
输出信息:含有语义信息和占据栅格信息的数组
|
||||||
|
1.3 目前效果
|
||||||
|
能在地图上对应位置显示出物体,且位置和尺寸符合要求
|
||||||
|
详细描述
|
||||||
|
2.1 框架图
|
||||||
|
2.1.1 语义cartographer整体流程:定义接受的激光雷达格式,增加语义信息维度,在ROS层做处理,将一帧雷达数据分割成多段,并将激光雷达坐标系的点云转换到统一的小车坐标系;将处理好的数据扔给前端,进行多激光雷达的时间同步,并转换数据格式,确定激光雷达数据帧的位姿;利用光光线跟踪法,计算子图的语义和是否占据的概率信息;压缩子图信息,传输后,进行多张子图融合,绘成语义地图。
|
||||||
|
|
||||||
|
false
|
||||||
|
|
||||||
|
图1 语义cartographer整体流程图
|
||||||
|
2.1.2 语义地图绘制流程:由N帧语义激光雷达得到语义子图,对每张语义子图进行位姿变换,映射到大地图上,将它与cartographer原生的占据地图对齐,通过栅格是否占据滤除多余的语义信息,合成语义大地图。
|
||||||
|
|
||||||
|
false
|
||||||
|
图2 语义地图详细流程图
|
||||||
|
|
||||||
|
|
||||||
|
2.2 详细步骤
|
||||||
|
2.2.1 sensor_bridge.cc
|
||||||
|
SensorBridge::HandleLaserScanMessage():将激光雷达点分段,模拟提高激光雷达点的频率,原本输出的是TimedPointCloud,丢失了强度值,在此处改为输出PointCloudWithIntensities
|
||||||
|
|
||||||
|
|
||||||
|
SensorBridge::HandleRangefinder():将数据转到tracking坐标系下,再调用trajectory_builder_的AddSensorData进行数据的处理,重载TimedPointCloudData(),使其返回 PointCloudWithIntensities,使函数最后可以使用的TimedPointCloudData含有强度值
|
||||||
|
|
||||||
|
|
||||||
|
2.2.2local_trajectory_builder_2d.cc
|
||||||
|
LocalTrajectoryBuilder2D::AddRangeData():处理点云数据,TimedPointCloudData格式转换为TimedPointCloudOriginData,继而转换为RangeData,将进行扫描匹配, 将点云写成地图
|
||||||
|
|
||||||
|
|
||||||
|
2.2.3 grid_2d.h
|
||||||
|
定义栅格地图大小,概率值等
|
||||||
|
增加std::vector<std::vector<uint16>> semantics_counter_ 存储语义信息
|
||||||
|
Semantics_observer代表摄像头观测区域
|
||||||
|
|
||||||
|
|
||||||
|
2.2.4 probability_grid_range_data_inserter_2d.cc
|
||||||
|
CastRays():根据雷达点对栅格地图进行更新,修改ApplyLookupTable(),根据hit点的位置即语义信息更新语义值,存储到semantics_counter_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2.2.5 probability_grid.cc
|
||||||
|
在ApplyLookupTableMiss()中调用ApplyLookupTableSemMiss() 增加栅格的语义概率
|
||||||
|
|
||||||
|
在ApplyLookupTableHit()中调用ApplyLookupTableSemHit() 降低栅格的语义概率
|
||||||
|
|
||||||
|
|
||||||
|
ProbabilityGrid::DrawToSubmapTexture():获取压缩后的地图栅格数据,增加GetColor(),并且多传输一个摄像头观测区域
|
||||||
|
|
||||||
|
|
||||||
|
2.2.6 occupancy_grid_node_main.cc
|
||||||
|
获取地图信息绘图并展示
|
||||||
|
::cartographer_ros::FetchSubmapTextures():相应得更改解压缩函数,获取正确的SubmapTexture数据
|
||||||
|
|
||||||
|
2.2.6 occupancy_grid_node_main.cc
|
||||||
|
2.2.7 submap_painter.cc
|
||||||
|
DrawTexture():给函数增加color值传参,给子图赋予语义信息
|
||||||
|
|
||||||
|
PaintSubmapSlicesResult PaintSubmapSlices() :跳过cairo库绘图
|
||||||
|
|
||||||
|
算法记录
|
||||||
|
3.1 语义颜色输出混乱
|
||||||
|
【问题点概述】:
|
||||||
|
多子图融合时,语义颜色输出混乱。
|
||||||
|
【事件回放】:
|
||||||
|
根据六要素进行填写,即:时间、地点、人物、事件的起因、经过、结果(可附图片)。
|
||||||
|
2022年03月,下午在实验室测试动态语义地图效果时,发现语义输出混乱。
|
||||||
|
【原因分析】:(3why分析需找到最根源的诱因)
|
||||||
|
经过调试程序,发现原cartographer利用cairo库绘图,子图融合成大地图时,语义颜色会根据不同透明度而发生叠加。
|
||||||
|
【解决方案】:
|
||||||
|
在融合多张子图时,跳过cairo机制,将子图的语义值剥离开来,不进行叠加,保持子图最新的语义值
|
||||||
|
【实验过程】:
|
||||||
|
写测试代码,查看语义输出结果。
|
||||||
|
【验收效果说明】:
|
||||||
|
语义值输出正常则说明问题解决。
|
||||||
|
四.实验环境及代码
|
||||||
|
1.实验环境
|
||||||
|
Ubuntu 18.0.4 + ROS Meldic
|
||||||
|
2.代码管理
|
||||||
|
|
||||||
|
|
||||||
|
附录:激光雷达格式转换
|
||||||
|
|
||||||
|
|
||||||
|
(PointCloud)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue