栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

VINS-Mono中的featrue

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

VINS-Mono中的featrue

文章目录

1.系统的打印输出相关问题(已解决)

1.1.设置ros log级别1.2.输出语句 2.特征点去畸变处理3.ros中的消息类型4.读取相机内参的函数5.其他细节

5.1.图像均衡化5.2.static_cast5.3. reinterpret_cast5.4.n.shutdown()

1.系统的打印输出相关问题(已解决) 1.1.设置ros log级别

参考: ros中的日志输出级别

feature_tracker_node.cpp中的语句

ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info);
  
ROS_INFO("load mask fail");
ROS_BREAK();		//; 这个ROS_BREAK();是什么意思?

这个设置的级别有什么用?输出到控制台打印呢还是输出到日志呢?设置这个级别对应作用的语句是什么?是下面哪些输出语句?ROS_BREAK()是什么意思?
ROS 辅助宏(常量/INFO/ASSERT/BREAK/…)
简单来说就是直接在这个语句的地方退出程序不在执行,并且同时会输出这个退出的程序所在的文件和行号,便于排查错误。
例如,使用ROS_ASSERT进行断言的测试,当条件为false的时候输出如下:
1.2.输出语句

    parameters.cpp文件
ROS_INFO_STREAM("Loaded " << name << ": " << ans);
ROS_ERROR_STREAM("Failed to load " << name);

std::cerr << "ERROR: Wrong path to settings" << std::endl;

注意:这里直接调用std::cerr也是可以的,只不过上面的ros专用 的输出语句,比如Debug,Info等等,会有ros设置的一些输出格式,比如前缀指示ROS输出级别、输出时间、输出有颜色等等,而使用标准的std输出的话就像控制台打印一样没有这些指示性的内容。

    feature_tracker_node.cpp文件中的void img_callback(const sensor_msgs::ImageConstPtr &img_msg)函数中
ROS_WARN("image discontinue! reset the feature tracker!");
ROS_DEBUG("processing camera %d", i);
ROS_INFO("whole feature tracker processing costs: %f", t_r.toc());
2.特征点去畸变处理

FeatureTracker.cpp中的rejectWithF函数:

    递归去畸变的算法步骤是先把特征点从像素平面投影到归一化相机平面,然后在归一化相机平面上进行递归去畸变操作,然后再把去畸变后的点投影到像素平面上得到像素坐标。

问题:为什么非要在归一化相机平面上进行去畸变处理呢?为什么不可以直接在像素平面上进行递归去畸变操作?

解答:注意相机的畸变产生的位置,是在归一化相机平面上往像素平面上投影的时候,这个时候经过透镜产生了畸变。带畸变的投影顺序:
1)3D点从世界坐标转到相机坐标系;
2)3D点从相机坐标系转到归一化相机坐标系;
3)从归一化相机坐标系向像素坐标系投影,这个过程中经过透镜会产生畸变。而畸变的参数是定义在归一化相机平面上的畸变参数,所以去畸变也要从归一化相机平面上来进行,这样去畸变就与相机的内参无关了;
4)经过畸变投影后到相机的像素平面。

    另外,程序中的虚拟焦距到底有什么用?
    这个虚拟焦距在后面计算F矩阵使用RANSAC剔除外点时的阈值进行使用了,判断是否是外点就是看匹配点离对极约束算出来的极线距离是否超过阈值,而这个阈值应该是和焦距有关系的,所以使用一个固定的虚拟焦距,这样判断对极约束外点的阈值也就可以使用一个固定的阈值。
3.ros中的消息类型

前端光流追踪如果给后端发送特征点数据的话,发送的是sensor_msgs::PointCloud数据;发送图片数据的话,发送的是sensor_msgs::Image数据。

关于这些消息的定义,有一篇博客写的非常好,参见:
VINS-Mono笔记02_前端特征点追踪feature_tracker

关于ros的点云消息,可以参看ros官网讲解

4.读取相机内参的函数
rackerData[i].readIntrinsicParameter(CAM_NAMES[i]); 

这个函数内部实现写法好像比较复杂,涉及较多的C++知识点,还没有细看。

5.其他细节 5.1.图像均衡化

feature_tracker.cpp中判断如果需要均衡化,那么调用图像均衡化的函数。

cv::Ptr clahe = cv::createCLAHE(3.0, cv::Size(8, 8));
5.2.static_cast
int n_max_cnt = MAX_CNT - static_cast(forw_pts.size());

计算需要额外提取的特征点数量的时候,这里为什么要使用static_cast的写法?

解答:static_cast是类型转换运算符,在C语言中的强制类型转换比较简单,但是也有出错的风险,所以在C++中增加了类型转换符,这样使风险更加细化、使问题追溯更加方便。

C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast

5.3. reinterpret_cast

这种强制类型转换在VINS的代码中也有很多地方进行使用,关于其用法可以参考下面知乎上的回答,有的解释比较通俗易懂。

如何理解C++中的 reinterpret_cast?

5.4.n.shutdown()

在读取参数的函数中如果参数读取错误,会执行

n.shutdown();       //; 没有注意到这里,shutdown之后是整个节点就关闭了吗?

这个n是ros的句柄,这样执行这一句之后会关闭ros节点吗?

解答:是的!看ros官网的解释:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767025.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号