11.11---11.17
在此前一周进行yolo与cube slam整合的时候,采用ros通信的方式。存在两个问题:一个是darknet检测不到目标,就不对外发布检测结果,会造成检测结果和图片序列对不上。另一个问题是图片发布给darknet和cube slam的时间戳难以对齐。本周采用将darknet编译成动态链接库的形式,可以像调用API一样直接使用darknet预先定义的类型与模型。
在使用时只需要将动态链接库的.so文件和头文件darknet.h在cmakelist里包含进来就行。
这部分工作是在304的服务器上进行,但是304台式机不能使用sudo命令,因此无法安装ros,这一周剩下时间在给我的台式机配置cuda和ros环境。
11.18---11.24
上周采用直接darknet编译为动态链接库的方式,测试可行。这周主要将yolo加入object_slam
并实现功能。
object_slam
包中实现的并非完整的SLAM算法,只能算一个VO,实际上作者是利用g2o做简单的位姿估计与优化。
在将二维检测加入三维检测中遇到一个问题。算法的第一帧需要相机坐标系与世界坐标系的转换关系,这个世界坐标系不是第一帧相机坐标系,而是x,y轴所在平面为地平面,z轴向上的一个坐标系,x轴和y轴指向无所谓。因此可以简化问题,假设x轴指向相机,即指向相机坐标系z轴反方向。
https://www.zhihu.com/video/1185163673403912192 为了方便计算旋转矩阵,还可以假设相机的pitch和roll都为0,这样世界坐标系变换到相机坐标的旋转变换就是y轴90°,x轴180°。
但是实际这样做检测不到立方体,包括github上issue也有人提出这个问题,即采用这种旋转矩阵或者四元数得不到结果,必须偏一点角度。实际上我测试TUM数据集的时候,提供的ground truth显示相机pitch大约为-30°,摄像头使用这个姿态测试的效果比较好。视频如下:
11.25---12.1
本周主要是在orb slam中加入三维检测功能,以实现最终需求。
由于三维检测只与位姿有关,因此改动主要是在tracking线程里。
在主程序,例如mono_tum
.cc,mono_kitti.cc
中,
SLAM.TrackMonocular(im, tframe);
TrackMonocular是http://system.cc中的类方法,在TrackMonocular函数的最后调用了http://Tracking.cc中的函数
GrabImageMonocular(im, timestamp, msg_seq_id);
这个函数进入tracking线程,主要是讲图片转成灰度图,并调用orb slam提出的匀速模型函数
TrackWithMotionModel()
yolo功能实现,线条检测和三维检测主要是在这个部分实现。
编译的时候报错:darknet定义的list结构体冲突了。原因是在前几周的代码中都没有用到c++ STL里的list类型,但是orb slam里应该是用到了,因此才会冲突。