从零开始学习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 */);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中&#xff0c;我们学习了一些PHP extension for C的基本内容&#xff0c;下面结合一…

Open3D Ransac算法拟合点云球面

目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2拟合后点云 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅 Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 RANSAC&a…

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用&#xff0c;ChatGPT 作为一种强大的自然语言处理技术&#xff0c;无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成&#xff0c;还是语音识别、计算机视觉等方面&#xff0c;ChatGPT 都有着广泛的应用前景。特别在临床医学领…

python 语法学习 day6

一.编程题错题反思 1.计算分段函数&#xff1a; x float(input()) if x 0: res 0 else: res 1 / (2 * x) print("g({:.3f}) {:.3f}".format(x, res)) #其中对于f&#xff0c;e和%格式&…

pycharm如何debug for循环里面的错误值

一般debug时&#xff0c;在for循环里面的话&#xff0c;需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…

HTML+echarts.js实现的炫酷金色风格可视化组件

模板下载地址&#xff1a; 炫酷金色风格可视化组件 (bootstrapmb.com)https://www.bootstrapmb.com/item/14888 一款炫酷金色风格可视化组件&#xff0c;统计图表使用Echarts.js&#xff0c;整体风格采用金黄色看起来很大气&#xff0c;设计是通用型的&#xff0c;可以用作任…

自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍

文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例5.1 典型场景1&#xff1a;前方车辆压线5.2 典型场景2&#xff1a;相邻车道有大型车辆5.3 典型场景3&#xff1a;它车近距离cut in 6. 总结与展望 1. 背景介绍 随着汽车技术的发展&#xff0c;智能巡航…

springboot开发实用篇

一、Mongodb &#xff08;1&#xff09;简介 MongoDB是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品中的一种&#xff0c;是最像关系型数据库的非关系型数据库。 数据库&#xff1a;永久性存储&#xff0c;修改频率极低 Mongodb&#xff1a;永久性存储与临时存…

Cxx Primer-Chap4

表达式可以没有操作符&#xff0c;但一定有操作数&#xff1a;理解表达式中含有多个操作符时涉及操作符的优先级、关联性以及操作数的计算顺序&#xff1a;如果操作符需要的操作数类型不同&#xff0c;则会发生一些默认的类型转换&#xff1a;什么叫Overloaded Operators&#…

跨平台应用进程cpu与内存监控的搭建说明

1. 前言: 随着科技的进步,互联网发展,能网上办理的就网上办理,按装一个app客户端,连接后台服务,只要是有网络就OK.便捷,快速,省事.但随之而来的是pc端上安装的应用越来越多,系统资源越来越不够用.这也一定程度上对应用程序有一定的要求,除了实现其功能外,性能也是需要关注的. …

python如何输入矩阵

使用numpy创建矩阵有2种方法&#xff0c;一种是使用numpy库的matrix直接创建&#xff0c;另一种则是使用array来创建。 首先导入numpy&#xff1a; &#xff08;1&#xff09;import numpy &#xff08;2&#xff09;from numpy import * &#xff08;3&#xff09;import …

【JVM】JVM调优练习-随笔

JVM实战笔记-随笔 前言字节码如何查看字节码文件jclasslibJavapArthasArthurs监控面板Arthus查看字节码信息 内存调优内存溢出的常见场景解决内存溢出发现问题Top命令VisualVMArthas使用案例 Prometheus Grafana案例 堆内存情况对比内存泄漏的原因:代码中的内存泄漏并发请求问…

MenuToolButton自绘控件,带下拉框的QToolButton,附源码

MenuToolButton自绘控件&#xff0c;带下拉框的QToolButton 效果 下拉样式可自定义 跟随QToolButton的Qt::ToolButtonStyle属性改变图标文字样式 使用示例 正常UI文件创建QToolButton然后提升&#xff0c;或者直接代码创建都可以。 // 创建一个 QList 对象来存储 QPixm…

关于MySQL的一些相关规定

1.为什么阿里巴巴规定不能超过三张表join 之所以不建议使用join查询&#xff0c;最主要的原因就是join的效率比较低。 MySQL是使用了嵌套循环&#xff08;Nested-Loop Join&#xff09;的方式来实现关联查询的&#xff0c;简单点说就是要通过两层循环&#xff0c;用第一张表做…

TDC 5.0:多集群统一纳管,构建一体化大数据云平台

近期&#xff0c;星环科技数据云平台Transwarp Data Cloud&#xff08;简称TDC&#xff09;5.0版本正式发布&#xff0c;TDC5.0架构屏蔽底层多个TDH集群的差异&#xff0c;采用统一操作模式&#xff0c;新增一个多集群抽象与管理层&#xff0c;能够实现多集群网络互通、跨集群资…

使用 RocketMQ 实现消息的顺序消费

在分布式系统中&#xff0c;保持消息的顺序性是一个常见且重要的问题。RocketMQ 提供了一种有效的方式来确保消息的顺序消费。本文将通过代码示例&#xff0c;介绍如何使用 RocketMQ 实现消息的顺序生产和消费。 环境准备 在开始之前&#xff0c;请确保您已经配置好 RocketMQ…

QT纯代码实现滑动开关控件

开关按钮大家应该很熟悉&#xff0c;在设置里面经常遇到&#xff0c;切换时候的滑动效果比较帅气。通常说的开关按钮&#xff0c;有两个状态&#xff1a;on、off。大部分的开关按钮控件&#xff0c;基本上有两大类&#xff0c;第一类是纯代码绘制&#xff0c;这种对代码的掌控度…

dhtmlx-gantt甘特图数据展示

官网文档&#xff1a;甘特图文档 实现效果&#xff1a; 首先需要下载 dhtmlx-gantt组件 npm i dhtmlx-gantt //我项目中使用的是"dhtmlx-gantt": "^8.0.6" 这个版本&#xff0c;不同的版本api或是文档中存在的方法稍有差异 界面引用 <template>&l…

目标检测算法与应用算法 DS集成 接口相关_v0.1

目录 文章目录 目录0. 目标GPS信息、速度、加速度、航向角信息的输出1. 目标检测算法接口1.1 模型相关1.2 检测结果相关 2. 应用算法接口2.1 bool cross_line; //跨线&#xff08;变道压线检测&#xff09;2.2 bool break_in; //闯入&#xff08;目标闯入&#xff09;2.3 bool …

Linux HOOK机制与Netfilter HOOK

一. 什么是HOOK&#xff08;钩子&#xff09; 在计算机中&#xff0c;基本所有的软件程序都可以通过hook方式进行行为拦截&#xff0c;hook方式就是改变原始的执行流。 二. Linux常见的HOOK方式 1、修改函数指针。 2、用户态动态库拦截。 ①利用环境变量LD_PRELOAD和预装载机…