cartographe map系列组织结构

现在是怎么个关系呢。。。
map_builder_bridge map_builder_interface 还有map_builder
我感觉应该是 map_builder_bridge是提供给外面调用的
map_builder_interface 是提供接口定义 ,map_builder是实现,就是说:
map_builder_bridge的里面定义了private的map_builder_interface,map_builder继承了map_builder_interface。
查阅map_builder_interface和map_builder的方法定义,发现在map_builder_interface中定义的虚函数 在map_builder里面有部分实现。现在的问题是,应该在map_builder_bridge里面定义到这个map_builder,下面是要找到他。
找到了。是在node_main里面传入了map_builder,而他的定义是

梳理一下:
Node的声明:

Node(const NodeOptions& node_options,
std::unique_ptr<cartographer::mapping::MapBuilderInterface> map_builder, //不应该是bridge吗?
tf2_ros::Buffer* tf_buffer, bool collect_metrics);

Node的定义:

Node::Node(
const NodeOptions& node_options,
std::unique_ptr<cartographer::mapping::MapBuilderInterface> map_builder,
tf2_ros::Buffer* const tf_buffer, const bool collect_metrics)
: node_options_(node_options), 
map_builder_bridge_(node_options_, std::move(map_builder), tf_buffer) { //std::move(map_builder) 左值变右值 int a = 10 ; int b =a(error) ---> int b = move(a)

// 将mutex_上锁, 防止在初始化时数据被更改
absl::MutexLock lock(&mutex_);

Node的实例化:

// Node类的初始化, 将ROS的topic传入SLAM, 也就是MapBuilder
Node node(node_options, std::move(map_builder), &tf_buffer,
FLAGS_collect_metrics);
可以看到Node构造函数中要有一个interface的接口类,并且有bridge的成员变量。bridge类中有一个interface的私有成员变量。
在Node实例化的过程中,传入了map_builder的子类对象。
Node node(node_options, std::move(map_builder), &tf_buffer,
FLAGS_collect_metrics);
这样就会调用Node的构造函数,可以看到Node构造函数其实除了初始化成员列表,剩下的啥也没有干。在初始化函数列表的时候,就完成了map的多态,并且完成了bridge类的初始化:
map_builder_bridge_(node_options_, std::move(map_builder), tf_buffer) 
就这样,完成了子类对象的传入和node_main->node->map_builer_bridge->map_builder_interface->map_builder的实现。

node -->构造函数中有 map_builder_interface
          -→成员变量中有map_builder_bridge

map_builder_bridge -->构造函数中有 map_builder_interface
→成员变量中有map_builder_bridge
→成员函数中有对map_builder_interface的调用

map_builder子类对象,只需要传到node类的构造函数,构造函数再对bridge初始化就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值