diff --git a/说明文档.docx b/说明文档.docx new file mode 100644 index 0000000..f0f0f05 --- /dev/null +++ b/说明文档.docx @@ -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> 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) + +