我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++ Cartographer怎么加载配置文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++ Cartographer怎么加载配置文件

这篇文章主要介绍了C++ Cartographer怎么加载配置文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++ Cartographer怎么加载配置文件文章都会有所收获,下面我们一起来看看吧。

在node_main.cc文件中,有如下代码

  std::tie(node_options, trajectory_options) =      LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);

std::tie作用是同时对多个变量赋值,但是只能个从元组tuple赋值,在node_options.cc中有如下定义:

std::tuple<NodeOptions, TrajectoryOptions> LoadOptions(    const std::string& configuration_directory,    const std::string& configuration_basename) {  // 获取配置文件所在的目录  auto file_resolver =      absl::make_unique<cartographer::common::ConfigurationFileResolver>(std::vector<std::string>{configuration_directory});  // 读取配置文件内容到code中  const std::string code =      file_resolver->GetFileContentOrDie(configuration_basename);  // 根据给定的字符串, 生成一个lua字典  cartographer::common::LuaParameterDictionary lua_parameter_dictionary(      code, std::move(file_resolver));  // 创建元组tuple,元组定义了一个有固定数目元素的容器, 其中的每个元素类型都可以不相同  // 将配置文件的内容填充进NodeOptions与TrajectoryOptions, 并返回  return std::make_tuple(CreateNodeOptions(&lua_parameter_dictionary),                         CreateTrajectoryOptions(&lua_parameter_dictionary));}

这返回值为元组tuple.

ps:vector初始化:

要注意“()”和“{}”这样的初始化情况,比如:

std::vector<int> nVec(10,1);    // 包含10个元素,且值为1

std::vector<int> nVec{10,1};    // 包含2个元素,值分别为10,1

CreateNodeOptions,是定义在node_options.h文件里的一个结构体,同理CreateTrajectoryOptions,里面的参数是由lua文件传入的.

trajectoryoptions只在开始轨迹的时候用了,见node_main.cc

在trajectory_options.cc中有如下定义

void CheckTrajectoryOptions(const TrajectoryOptions& options) {  CHECK_GE(options.num_subdivisions_per_laser_scan, 1);  CHECK_GE(options.num_laser_scans + options.num_multi_echo_laser_scans +               options.num_point_clouds,           1)      << "Configuration error: 'num_laser_scans', "         "'num_multi_echo_laser_scans' and 'num_point_clouds' are "         "all zero, but at least one is required.";}

这个说明是要至少一个激光,或者激光+超声雷达+点云的个数要>1才能运行程序

NodeOptions CreateNodeOptions(    ::cartographer::common::LuaParameterDictionary* const        lua_parameter_dictionary) {  NodeOptions options;  options.map_builder_options =      ::cartographer::mapping::CreateMapBuilderOptions(          lua_parameter_dictionary->GetDictionary("map_builder").get());  options.map_frame = lua_parameter_dictionary->GetString("map_frame");  options.lookup_transform_timeout_sec =      lua_parameter_dictionary->GetDouble("lookup_transform_timeout_sec");  options.submap_publish_period_sec =      lua_parameter_dictionary->GetDouble("submap_publish_period_sec");  options.pose_publish_period_sec =      lua_parameter_dictionary->GetDouble("pose_publish_period_sec");  options.trajectory_publish_period_sec =      lua_parameter_dictionary->GetDouble("trajectory_publish_period_sec");  if (lua_parameter_dictionary->HasKey("publish_to_tf")) {    options.publish_to_tf =        lua_parameter_dictionary->GetBool("publish_to_tf");  }  if (lua_parameter_dictionary->HasKey("publish_tracked_pose")) {    options.publish_tracked_pose =        lua_parameter_dictionary->GetBool("publish_tracked_pose");  }  if (lua_parameter_dictionary->HasKey("use_pose_extrapolator")) {    options.use_pose_extrapolator =        lua_parameter_dictionary->GetBool("use_pose_extrapolator");  }  return options;}

上面的程序是根据lua字典中的参数, 生成protobuf的序列化数据结构, 结构体NodeOptions定义在头文件中,其中有个元素为::cartographer::mapping::proto::MapBuilderOptions map_builder_options;是proto类型,在上述程序中的第一个参数被赋值

在node_options.cc有个类ConfigurationFileResolver,定义在configuration_file_resolver.h中,公有继承来自FileResolver

class ConfigurationFileResolver : public FileResolver{ public:  // c++11: explicit关键字 的作用就是防止类构造函数的隐式自动转换  explicit ConfigurationFileResolver(      const std::vector<std::string>& configuration_files_directories);  std::string GetFullPathOrDie(const std::string& basename) override;  std::string GetFileContentOrDie(const std::string& basename) override; private:  std::vector<std::string> configuration_files_directories_;};

FileResolver定义在lua_parameter_dictionary.h中:

class FileResolver { public:  virtual ~FileResolver() {}  virtual std::string GetFullPathOrDie(const std::string& basename) = 0;  virtual std::string GetFileContentOrDie(const std::string& basename) = 0;};

这个都是虚函数,只是个接口

cartographer经常有对接口类的继承

ConfigurationFileResolver的构造函数在configuration_file_resolver.cc里面

ConfigurationFileResolver::ConfigurationFileResolver(    const std::vector<std::string>& configuration_files_directories)    : configuration_files_directories_(configuration_files_directories) {  configuration_files_directories_.push_back(kConfigurationFilesDirectory);}

这个函数有个初始化列表,可以看到最终传入的参数是kConfigurationFilesDirectory,这个参数定义在config.h.这个文件里,这个文件是config.h.cmake编译生成的,如下内容

namespace cartographer {namespace common {constexpr char kConfigurationFilesDirectory[] =    "@CARTOGRAPHER_CONFIGURATION_FILES_DIRECTORY@";constexpr char kSourceDirectory[] = "@PROJECT_SOURCE_DIR@";}  // namespace common}  // namespace cartographer

一个是定义工程配置文件的文件夹,一个是工程地址的目录,在config.h中会生成匹配自己电脑的字符串地址.那么上面的ConfigurationFileResolver的构造函数就是为了传入自己电脑的某些目录地址..

GetFullPathOrDie:遍历整个文件夹文件名看看能不能找到相应文件,如不能就报错

GetFileContentOrDie的作用是看传入的地址变量是不是空的,然后通过GetFullPathOrDie暴力查找是否在当前目录中存在,然后读取配置文件转为string格式然后返回.

再回到node_options.cc中

接下来是读取配置文件到code中,然后从code和之前读取的file_resolver生成一个lua字典

lua是个类似cpp的程序语言,定义在lua_parameter_dictionary.cc中,不细说了

如果想自己通过lua文件写入一些配置和参数,步骤如下

在自己写的lua配置文件中写入自己的参数,如th=1.1,

在想一下这个th是属于node_options还是trajectory_options,如在node_options中,则在node_options.h中定义好自己的数据类型和初始值,如double th = 1.1;

然后在node_options.cc中写入

  if (lua_parameter_dictionary->HasKey("th")) {    options.th =        lua_parameter_dictionary->GetDouble("th");  }

关于“C++ Cartographer怎么加载配置文件”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++ Cartographer怎么加载配置文件”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++ Cartographer怎么加载配置文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++ Cartographer怎么加载配置文件

这篇文章主要介绍了C++ Cartographer怎么加载配置文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++ Cartographer怎么加载配置文件文章都会有所收获,下面我们一起来看看吧。在node
2023-07-05

C++Cartographer加载配置文件过程介绍

这篇文章主要介绍了Cartographer加载配置文件过程,谷歌优秀的激光SLAM开源框架Cartographer算法简单,但是程序部分太多需要学习的地方了,不论是整体框架的结构,还是数据的使用,都是非常优美的
2023-03-19

Hibernate中怎么加载配置文件

本篇文章给大家分享的是有关Hibernate中怎么加载配置文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在向大家详细介绍Hibernate加载配置文件之前,首先让大家了解下
2023-06-17

spring中怎么加载xml配置文件

这篇文章主要讲解了“spring中怎么加载xml配置文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring中怎么加载xml配置文件”吧!spring 中加载xml配置文件的方式spr
2023-06-03

php不能加载配置文件怎么办

这篇文章主要介绍了php不能加载配置文件怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php不能加载配置文件的解决办法:首先通过“php --ini”命令查看是否加载了
2023-06-14

spring启动怎么加载外部配置文件

Spring启动时可以加载外部的配置文件,可以通过以下几种方式来实现:1. 使用@PropertySource注解:在Spring配置类上使用@PropertySource注解来指定外部配置文件的位置。例如,如果有一个名为config.pr
2023-09-28

Windows配置文件加载失败

有几个常见的原因可能导致Windows配置文件加载失败:1. 配置文件损坏:配置文件可能因为病毒感染、硬件故障或错误的操作而损坏。在这种情况下,可以尝试从备份文件或系统还原点中恢复配置文件。2. 重复的配置文件:如果系统中存在多个相同的配置
2023-09-12

配置java.library.path加载库文件问题

这篇文章主要介绍了配置java.library.path加载库文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-23

Spring加载加密的配置文件详解

本文实例为大家分享了Spring加载加密的配置文件,供大家参考,具体内容如下一、继承并实现自己的属性文件配置器类public
2023-05-31

docker怎么挂载配置文件

在使用Docker时,可以通过挂载配置文件来将宿主机上的配置文件映射到容器内部。以下是挂载配置文件的方法:使用 `-v` 参数挂载单个配置文件:docker run -v /path/to/host/config/file:/path/t
2023-10-26

如何实现SpringBoot加载配置文件

这篇文章主要为大家展示了“如何实现SpringBoot加载配置文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现SpringBoot加载配置文件”这篇文章吧。一、简介在实际的项目开发过程
2023-06-29

linux selenium chrome 加载用户配置文件

linux selenium chrome 加载用户配置文件需要安装linux桌面环境(系统版本: CentOS Linux release 7.6.1810 (Core))yumgroupinstall"GNOMEDesktop""Gra
2023-01-31

负载均衡怎么配置文件

负载均衡的配置文件可以根据所使用的负载均衡软件不同而有所不同。以下是一个常见的负载均衡软件Nginx的配置文件示例:```http {upstream backend {server backend1.example.com;server
2023-09-01

java怎么通过注解加载自定义配置文件

在Java中,可以使用注解来加载自定义配置文件。具体步骤如下:1. 创建一个自定义的注解,用来标记需要加载的配置文件。```javaimport java.lang.annotation.ElementType;import java.la
2023-09-17

按需加载怎么配置

配置按需加载按需加载技术允许浏览器仅在需要时下载和执行资源,改善页面加载时间和性能。配置步骤:使用defer或async标记HTML文件。链接CSS,使用media属性指定媒体查询。链接JavaScript,添加defer或async。内联JavaScript,声明模块并使用import导入代码。使用JS延迟加载大型脚本。使用Webpack等工具自动化配置。好处:减少加载时间提高性能节省带宽改善用户体验考虑因素:确保资源加载顺序正确。延迟加载非关键资源。测试和监控配置以确保正常运行。
按需加载怎么配置
2024-04-25

详解利用Spring加载Properties配置文件

记得之前写Web项目的时候配置文件的读取都是用Properties这个类完成的,当时为了项目的代码的统一也就没做什么改动。但事后一直在琢磨SpringMVC会不会都配置的注解功能了?经过最近的研究返现SpringMVC确实带有这一项功能,S
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录