![8628f985dbbe93a75746cfe00b4ed1c1.png](https://i-blog.csdnimg.cn/blog_migrate/ae6586292486a943b065ff5c8fa00334.jpeg)
感谢各位对我的支持,之前抽风写的这边文章阅读人数超出了我的想想,现在开始实现承诺,发布几个开源slam代码的解析。
本人工作比较忙,回家要陪闺女玩,所以每天更新知乎的时间不多,我尽量保证一天一更。
目的:
1: 之前总结过,后来长时间不看就忘记了,留下文字记录。
2: 在写解析的过程中,又学习了一遍,每次都有新的收获,最大的应该是代码结构。
3:结交更多的朋友,深知只有交流、讨论才能共同进步。
4: 我是真的想提高知乎的写作等级,希望大家能帮点关注、收藏、分享、赞。
书灌木:五年无人驾驶工作总结及展望zhuanlan.zhihu.comcartographer是google开源的slam,可以说是国际上第一个工程化的slam。我的代码运行环境是tx2和xavier。在此解析非ros版本。
点云数据进入流程:
1. http://map_builder_server_main.cc创建map_builder_server_;
2. map_builder_server_的构造函数中新建async_grpc::Server,grpc_server_中会添加AddRangefinderDataHandler(),并行执行。并设置grpc_server_的上下文为当前map_builder_server_。
3. map_builder_server.start(),开始执行grpc_server_,开始接收点云数据。并调用StartSlamThread()开始处理接收到的点云数据。
4. AddRangefinderDataHandler::OnSensorData()接收点云,并将其转换成Dispatchable,Dispatchable继承自Data,包含AddToTrajectoryBuilder()函数。并调用map_builder_context_impl.h中的EnqueueSensorData()将Dispatchable添加到map_builder_server_的incomming_data_queue_。
5. 回到map_builder_server.start(),调用StartSlamThread(),在调用ProcessSensorDataQueue(),每隔100ms从incomming_data_queue_中取一个数据,调用map_builder_context_impl.h中AddSensorDataToTrajectory(),将点云数据添加到map_builder_server_中的map_builder_中,再调用GetTrajectoryBuilder,得到当前建立的GlobalTrajectoryBuilder,进而调用AddSensorData()。
至此,点云数据就进入了GlobalTrajectoryBuilder()。
http://map_builder_server.cc中会向grpc_server_中添加一个AddTrajectoryHandler,会调用http://map_builder.cc中的AddTrajectoryBuilder,会向map_builder_中的trajectory_builder_中添加GlobalTrajectoryBuilder。
MapBuilder,GlobalTrajectoryBuilder,LocalTrajectoryBuilder都已建立,可以进行后续计算。
下篇将解析LocalTrajectoryBuilder。