SVO ros 节点解读
测试执行
- 使用作者给出的bag文件,运行以下指令
rosbag play airground_rig_s3_2013-03-18_21-38-48.bag
这样会在ros环境中广播/camera/image_raw 图像message, svo节点重映射该message到cam_topic,并订阅该topoic。运行该节点程序
roslaunch svo_ros test_rig3.launch
可视化输出结果
rosrun rviz rviz -d src/rpg_svo/svo_ros/rviz_config.rviz
svo节点的输出节点通过一个tf变换和2个marker,这样可以可视化在rviz中。2个marker其中一个是point显示的相机的位置(svo/points),另外一个是(表示相机位姿的五面体(/svo/keyframe))
如图所示为svo节点广播的topic,其中svo/points和/svo/keyframe均为/visualization_msgs/marker类型的message.
运行结果
我使用同一段视频跑了2遍,发现所走的轨迹基本是完全一样的,从图中可以看出所用的背景很复杂,很有利于提取角点,有很多distinctive feature points。
ros node init
- 创建ROS句柄
- 订阅camera topic(svo/cam_topic)同时指定camera topic的回调函数
- 指定广播的topics(可视化marker)
- 订阅remote key用户输入,指定回调函数
VO的构造函数
vo节点的成员中包含FrameHandlerMono成员,该类完成svo的核心功能,其中包括image sparse alignment, feature alignment, pose and Structure Optimization
另一个是visualizer,负责输出message至rviz可视化显示计算结果,可以借鉴。广播的信息如下
pub_frames_ = pnh_.advertise<visualization_msgs::Marker>("keyframes", 10);
pub_points_ = pnh_.advertise<visualization_msgs::Marker>("points", 1000);
pub_pose_ = pnh_.advertise<geometry_msgs::PoseWithCovarianceStamped>("pose",10);
初始化(设置)marker的代码位于vikit中。
parameter设置,首先读取相机的内参数,使用分别读取了参数
cam_model: Pinhole
cam_width: 752
cam_height: 480
cam_fx: 414.536145
cam_fy: 414.284429
cam_cx: 348.804988
cam_cy: 240.076451
cam_d0: -0.283076
cam_d1: 0.066674
cam_d2: 0.000896
cam_d3: 0.000778
读取方法是
getParam<int>(ns+"/cam_width"),
其中ns为参数的外层命名空间(svo)。
其次是读取相机的初始位姿。参数格式如下
<param name="init_rx" value="3.14" />
<param name="init_ry" value="0.00" />
<param name="init_rz" value="0.00" />
事实上,并不需要在launch文件中难过给出全部6D数据,因为如果从参数服务器中读不到的时候会返回一个默认值0.0.
图像的回调函数
ROS中首先sensor图像数据类型转化为opencv Mat类型,其次是处理用户输入,然后在vo中增加当前传入的图像(该该函数中分阶段处理图像(首帧,前2帧,和普通帧,重定位帧)),之后就是发布可视化message。
具体的流程如下
相关类简介
类 FrameHandlerMono(VO entity)
| 函数 | 输入 | 输出 |
|---|---|---|
| 构造函数 | 抽象相机类 | - |
| 增加图像 | Mat,时间戳 | - |
| 设置首帧图像 | FramePtr | - |
| 读取末帧图像 | – | FramePtr |
初始化
- 构造特征检测子
- 指定深度滤波器回调函数
- 构造深度滤波器
- 开启深度滤波器线程
processFirstFrame
- 初始化机体到世界的齐次变化(4x4矩阵)
- 单应矩阵得到第一帧图像
- 增加keyframe
- 增加新帧
- 指示阶段变动
processSecondFrame
- 单应矩阵增加第二帧图像
- 两视图bundle adjustment
- 添加新帧
- 得到景深
- 增加关键帧
- 单应矩阵归零
processFrame
- 获取上帧图像计算单应矩阵
- 稀疏图像对齐 spase image alignment
- Feature alignment
- 如果重建误差大于预设阈值,那么丢弃计算所得变换,标注当前的计算是无效的.(map reprojection & feature alignment)
- 位姿最优化,optimizeGaussNewton
- 结构优化,optimizeStructure
5950


&spm=1001.2101.3001.11974&articleId=52512114&d=1&t=3&u=d8cf4814097845b19e49599cbde7ac32)

被折叠的 条评论
为什么被折叠?



