当前位置: 首页 > news >正文

从零开始学习cartographer源码 | 02.cartographer_ros—node_main.cc

从零开始学习cartographer源码 | 02.cartographer_ros—node_main.cc

  • cartographer_ros
    • 程序的入口 main()函数
    • 程序的主函数Run()函数

特别(防杠)声明:《从零开始学习cartographer源码》系列文章仅仅是本人学习cartographer的学习笔记,不是教学文章,如有错误请大家指出,并友好交流,共同提升,如有喜爱抬杠的朋友,那我一定承认你是对的

cartographer_ros

在ros中使用cartographer,离不开2个功能包,一个是cartographer,另一个是cartographer_ros,cartographer_ros是cartographer适配ros的rosnode,cartographer是cartographer_ros的库文件。

程序的入口 main()函数

int main(int argc, char** argv) {google::InitGoogleLogging(argv[0]);  //初始化glog;google::ParseCommandLineFlags(&argc, &argv, true);  //初始化gflagsCHECK(!FLAGS_configuration_directory.empty()) //使用glog检查参数是否传入<< "-configuration_directory is missing.";CHECK(!FLAGS_configuration_basename.empty())<< "-configuration_basename is missing.";::ros::init(argc, argv, "cartographer_node");  //初始化ros节点//在创建ros_handle之前操作ros网络,需要显式调用::ros::start() 启动ros,如果在创建ros_handle之后则不用::ros::start();  cartographer_ros::ScopedRosLogSink ros_log_sink; //将glog转换成roslogcartographer_ros::Run(); //程序运行的主要逻辑::ros::shutdown(); //程序运行结束后退出ros
}

程序的主函数Run()函数

void Run() {constexpr double kTfBufferCacheTimeInSeconds = 10.;tf2_ros::Buffer tf_buffer{::ros::Duration(kTfBufferCacheTimeInSeconds)};//tf缓冲区保持10秒tf2_ros::TransformListener tf(tf_buffer);//启动tf订阅NodeOptions node_options;TrajectoryOptions trajectory_options;//  std::tie将node_options, trajectory_options两个变量分别赋值为LoadOptions()函数返回值//  当函数有多个返回值的时候,可以将其打包为一个元组,再通过std::tie进行解包//  LoadOptions()输入参数为lua的目录和文件名,将lua中的参数读取到程序中std::tie(node_options, trajectory_options) =LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);// MapBuilder类是完整的SLAM算法类,函数传入从lua读取建图相关的参数,返回一个unique_ptr智能指针管理map_builder对象// 包含前端(TrajectoryBuilders,scan to submap) 与 后端(用于查找回环的PoseGraph)auto map_builder =cartographer::mapping::CreateMapBuilder(node_options.map_builder_options);//  初始化node对象//  node_options:传入lua中读取的参数//  使用std::move将unique_ptr对象作为参数传入实例化构造一个node对象,在node对象被销毁时map_builder指针也自动释放,防止拷贝过程优化性能//  传入tf_buffer的引用,在类内对其进行赋值和操作//  FLAGS_collect_metrics:是否将cartographer的配置参数ros化的标志位Node node(node_options, std::move(map_builder), &tf_buffer, FLAGS_collect_metrics);//  判断在launch中是否加载了.pbstream文件,如果加载了就读取其中的状态if (!FLAGS_load_state_filename.empty()) {node.LoadState(FLAGS_load_state_filename, FLAGS_load_frozen_state);}//  开始生成轨迹并使用默认topic输出if (FLAGS_start_trajectory_with_default_topics) {node.StartTrajectoryWithDefaultTopics(trajectory_options);}//  定频回调,程序阻塞直到ctrl+c退出后执行后面内容::ros::spin();//  结束所有轨迹node.FinishAllTrajectories();//执行最后的全局优化node.RunFinalOptimization();// 如果save_state_filename非空, 就保存pbstream文件if (!FLAGS_save_state_filename.empty()) {node.SerializeState(FLAGS_save_state_filename,true /* include_unfinished_submaps */);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 智能听诊器:宠物健康监测的革新者
  • 视频压缩文件太大了怎么缩小?怎么压缩视频大小?视频压缩方法:10个!(宝藏)
  • Android TabLayout+ViewPager2如何优雅的实现联动详解
  • 网页HTTP协议 get请求和post请求区别?(HTTP中Get、Post、Put与Delete的区别)(HTTP请求方法、HTTP请求方式、HTTP方法)
  • 解决npm install(‘proxy‘ config is set properly. See: ‘npm help config‘)失败问题
  • 【虚幻引擎】C++网络通信TCP和HTTP实战开发全流程,以接入科大讯飞星火大模型和文心一言千帆大模型为案例讲解
  • 防范UDP Flood攻击的策略与实践
  • gitlab新建仓库
  • 安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?
  • iPhone手机上备忘录怎么设置字数显示
  • Elasticsearch(ES)集群监控
  • 部署k8s 1.28.9版本
  • axios(ajax请求库)
  • 介绍 Elasticsearch 中的 Learning to Tank - 学习排名
  • GO:Socket编程
  • ES6指北【2】—— 箭头函数
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • C++入门教程(10):for 语句
  • CSS3 变换
  • FastReport在线报表设计器工作原理
  • Gradle 5.0 正式版发布
  • Hibernate最全面试题
  • java第三方包学习之lombok
  • Laravel 中的一个后期静态绑定
  • Redis的resp协议
  • Service Worker
  • spring学习第二天
  • web标准化(下)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 小李飞刀:SQL题目刷起来!
  • 转载:[译] 内容加速黑科技趣谈
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #1014 : Trie树
  • #Linux(Source Insight安装及工程建立)
  • #stm32驱动外设模块总结w5500模块
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $.ajax中的eval及dataType
  • (1)Hilt的基本概念和使用
  • (55)MOS管专题--->(10)MOS管的封装
  • (day6) 319. 灯泡开关
  • (二)斐波那契Fabonacci函数
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)jQuery 基础
  • (转)Unity3DUnity3D在android下调试
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...