安裝好Azure-Kinect的ROS版本,方法可參考:https://blog.csdn.net/u010497704/article/details/102583779
安裝好ORB_SLAM的ROS版本。
下面,介紹如何使用Azure-Kinect-DK實時跑ORB_SLAM:
1.更改一下driver.launch裏發佈的image類型,默認值圖像太大,幀速太慢
打開/Azure_Kinect_ROS_Driver/launch/driver.launch直接更改
我把
depth_mode:NFOV_UNBINNED
color_resolution:720P
fps:30
具體硬件規格可參考:https://docs.microsoft.com/zh-cn/azure/Kinect-dk/hardware-specification
2.更改Orb slam接收的topic名稱
需要注意!!!
orb slam默認的圖像size是640×480,因此yaml裏的ORB Parameters是僅符合640×480大小的圖像的。如果你輸入的圖像分辨率過高,需要自己去調節ORB Parameters,否則跟蹤效果很差,經常跟丟。
因此,這裏我們選擇的深度圖大小爲640×576,彩色圖像大小爲1280x720,將彩色圖像對齊到深度圖像,這樣輸入圖像的大小就爲640×576了,不需要自己再去調節ORB Parameters。
在/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_rgbd.cc中進行更改
topic名稱爲:
/rgb_to_depth/image_raw
/depth/image_raw
3.更改ORB Slam讀取的相機畸變參數個數
orb slam原本只能讀取5個相機畸變參數:k1,k2,p1,p2,k3
但是 azure-kinect有八個相機畸變參數:k1,k2,k3,k4,k5,k6,p1,p2
因此需要修改以下orb slam的讀入。
在Tracking.cc中:
(1)在
const float k3 = fSettings["Camera.k3"];
if(k3!=0)
{
DistCoef.resize(5);
DistCoef.at<float>(4) = k3;
}
下面增加
const float k4 = fSettings["Camera.k4"];
if(k4!=0)
{
DistCoef.resize(6);
DistCoef.at<float>(5) = k4;
}
const float k5 = fSettings["Camera.k5"];
if(k5!=0)
{
DistCoef.resize(7);
DistCoef.at<float>(6) = k5;
}
const float k6 = fSettings["Camera.k6"];
if(k6!=0)
{
DistCoef.resize(8);
DistCoef.at<float>(7) = k6;
}
(2)在
if(DistCoef.rows==5)
cout << "- k3: " << DistCoef.at<float>(4) << endl;
下面增加
if(DistCoef.rows==8)
{
cout << "- k3: " << DistCoef.at<float>(4) << endl;
cout << "- k4: " << DistCoef.at<float>(5) << endl;
cout << "- k5: " << DistCoef.at<float>(6) << endl;
cout << "- k6: " << DistCoef.at<float>(7) << endl;
}
4.更改yaml裏面的相機參數
在運行 roslaunch azure_kinect_ros_driver driver.launch 時,會把相機的參數都打印出來,我們將其中深度相機的參數寫入到yaml中(因爲前面說過是對齊到深度相機)
我用到的參數是:
Camera.fx: 505.076
Camera.fy: 505.239
Camera.cx: 319.893
Camera.cy: 328.057
Camera.k1: 1.12383
Camera.k2: 0.629452
Camera.p1: 6.53274e-05
Camera.p2: -0.000118945
Camera.k3: 0.035496
Camera.k4: 1.46064
Camera.k5: 0.950368
Camera.k6: 0.180062
Camera.width: 640
Camera.height: 576
Camera.fps: 30.0
DepthMapFactor: 1.0
注意!DepthMapFactor: 1.0,因爲kinect發送的depth圖像是CV_32FC1的,已經除以1000了。
5.最後,插上kinect,開啓roslaunch,就可以成功運行orbslam了!