热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Cartographer]初始化

1.Cartographer文件树cartographer算法包括cartographer和cartographer_ros两部分,其中cartographer为算

1.Cartographer文件树

cartographer算法包括cartographercartographer_ros两部分,其中cartographer为算法的核心实现,cartographer_ros为算法和ROS的对接的桥梁,方便用户使用。

.
├── cartographer
│ ├── bazel
│ │ └── third_party
│ ├── cartographer
│ │ ├── cloud
│ │ ├── common
│ │ ├── ground_truth
│ │ ├── io
│ │ ├── mapping
│ │ ├── metrics
│ │ ├── sensor
│ │ └── transform
│ ├── cmake
│ │ └── modules
│ ├── configuration_files
│ ├── docs
│ │ ├── assets
│ │ └── source
│ └── scripts
└── cartographer_ros├── cartographer_ros│ ├── cartographer_ros│ ├── configuration_files│ ├── launch│ ├── scripts│ └── urdf├── cartographer_ros_msgs│ ├── msg│ └── srv├── cartographer_rviz│ ├── cartographer_rviz│ └── ogre_media├── docs│ └── source└── scripts

2.Cartographer初始化


  1. src/cartographer_ros/cartographer_ros/launch/backpack_2d.launch进入,可以看到cartographer_node节点的启动

<launch><param name&#61;"robot_description"textfile&#61;"$(find cartographer_ros)/urdf/backpack_2d.urdf" /><node name&#61;"robot_state_publisher" pkg&#61;"robot_state_publisher"type&#61;"robot_state_publisher" /><node name&#61;"cartographer_node" pkg&#61;"cartographer_ros"type&#61;"cartographer_node" args&#61;"-configuration_directory $(find cartographer_ros)/configuration_files-configuration_basename backpack_2d.lua"output&#61;"screen"><remap from&#61;"echoes" to&#61;"horizontal_laser_2d" />node><node name&#61;"cartographer_occupancy_grid_node" pkg&#61;"cartographer_ros"type&#61;"cartographer_occupancy_grid_node" args&#61;"-resolution 0.05" />
launch>

  1. 可以发现cartographer_node是在src/cartographer_ros/cartographer_ros/cartographer_ros/node_main.cc中创建的&#xff0c;这里主要关注函数cartographer_ros::Run()

int main(int argc, char** argv) {// note: 初始化glog库google::InitGoogleLogging(argv[0]);// 使用gflags进行参数的初始化. 其中第三个参数为remove_flag// 如果为true, gflags会移除parse过的参数, 否则gflags就会保留这些参数, 但可能会对参数顺序进行调整.google::ParseCommandLineFlags(&argc, &argv, true);/*** &#64;brief glog里提供的CHECK系列的宏, 检测某个表达式是否为真* 检测expression如果不为真, 则打印后面的description和栈上的信息* 然后退出程序, 出错后的处理过程和FATAL比较像.*/CHECK(!FLAGS_configuration_directory.empty())<< "-configuration_directory is missing.";CHECK(!FLAGS_configuration_basename.empty())<< "-configuration_basename is missing.";// ros节点的初始化::ros::init(argc, argv, "cartographer_node");// 一般不需要在自己的代码中显式调用// 但是若想在创建任何NodeHandle实例之前启动ROS相关的线程, 网络等, 可以显式调用该函数.::ros::start();// 使用ROS_INFO进行glog消息的输出cartographer_ros::ScopedRosLogSink ros_log_sink;// 开始运行cartographer_roscartographer_ros::Run();// 结束ROS相关的线程, 网络等::ros::shutdown();
}

  1. cartographer_ros::Run()函数中创建了map_buildernode&#xff0c;node控制着整个系统&#xff0c;而map_builder如名字一样&#xff0c;用于地图的构建&#xff0c;另外map_builder这个变量移动到MapBuilderBridge中的std::unique_ptr map_builder_

void Run() {constexpr double kTfBufferCacheTimeInSeconds &#61; 10.;tf2_ros::Buffer tf_buffer{::ros::Duration(kTfBufferCacheTimeInSeconds)};// 开启监听tf的独立线程tf2_ros::TransformListener tf(tf_buffer);NodeOptions node_options;TrajectoryOptions trajectory_options;// c&#43;&#43;11: std::tie()函数可以将变量连接到一个给定的tuple上,生成一个元素类型全是引用的tuple// 根据Lua配置文件中的内容, 为node_options, trajectory_options 赋值std::tie(node_options, trajectory_options) &#61;LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);// MapBuilder类是完整的SLAM算法类// 包含前端(TrajectoryBuilders,scan to submap) 与 后端(用于查找回环的PoseGraph) auto map_builder &#61;cartographer::mapping::CreateMapBuilder(node_options.map_builder_options);// Node类的初始化, 将ROS的topic传入SLAM, 也就是MapBuilderNode node(node_options, std::move(map_builder), &tf_buffer,FLAGS_collect_metrics);......
}

  1. node的构造开始&#xff0c;初始的流程如图所示
    在这里插入图片描述

推荐阅读
  • 利用 Python 中的 Altair 库实现数据抖动的水平剥离分析 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文将详细介绍如何在Webpack项目中安装和使用ECharts,包括全量引入和按需引入的方法,并提供一个柱状图的示例。 ... [详细]
  • 通过手机获取的GPS坐标在手机地图上存在约100-200米的偏差,但在Google Maps中搜索同一坐标时,定位非常精确。这种偏差可能出于安全或隐私考虑而被有意引入。此外,不同设备和环境下的GPS信号强度和精度也会影响最终的定位结果。 ... [详细]
  • 每日学术推荐:异质图神经网络在抽取式文档摘要中的应用研究
    在抽取式文档摘要任务中,学习跨句子关系是至关重要的一步。本文探讨了利用异质图神经网络来捕捉句子间复杂关系的有效方法。通过构建包含不同类型节点和边的图结构,模型能够更准确地识别和提取关键信息,从而生成高质量的摘要。实验结果表明,该方法在多个基准数据集上显著优于传统方法。 ... [详细]
  • SRM 553:深入解析供应链管理系统的最新进展与应用本文详细探讨了供应链管理系统(SCM)的最新发展及其在实际应用中的影响。通过对当前技术趋势的分析,文章揭示了 SCM 在提高效率、降低成本和增强透明度方面的关键作用。此外,还介绍了几种创新的 SCM 解决方案,如区块链技术和人工智能的应用,以及这些技术如何帮助企业更好地应对市场变化和挑战。 ... [详细]
  • 本文探讨了BERT模型在自然语言处理领域的应用与实践。详细介绍了Transformers库(曾用名pytorch-transformers和pytorch-pretrained-bert)的使用方法,涵盖了从模型加载到微调的各个环节。此外,还分析了BERT在文本分类、情感分析和命名实体识别等任务中的性能表现,并讨论了其在实际项目中的优势和局限性。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
author-avatar
考试大试题网
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有