ROS畢設坑3:在ROS下用視覺方法求取R和t,然後將其發佈

今天莫名遇到兩個問題:之前調好的代碼硬生生的跑不通,就會出現下面這個問題:

大概意思就是說我還沒得到圖片呢就讓他去計算,opencv就出錯了,我不信這個邪,自己去調試了一下發現能計算slovePnP,但是運行的時候就會出錯,後來我發現一個疑心好久的地方:

VideoCapture capture(CAMERA_INDEX);
capture >> frame;

然後我把它改成了我能理解的:

cv::VideoCapture inputVideo; 
inputVideo.open(CAMERA_INDEX);
inputVideo.retrieve(image);

我承認我沒認真去查這些具體的差別,但我覺得還是第二種靠譜,然後錯誤就沒了;


下面是第二個問題:

我把R和t算出來後,死活發不上去:

[FATAL] [1552307800.670041109]: ASSERTION FAILED
    file = /opt/ros/kinetic/include/ros/publisher.h
    line = 115
    cond = impl_->md5sum_ == "*" || std::string(mt::md5sum<M>(message)) == "*" || impl_->md5sum_ == mt::md5sum<M>(message)
    message =
[FATAL] [1552307800.670129102]: Trying to publish message of type [my_image_transport/camera/35d99f521ebbd634277d0f066a04ed68] on a publisher with type [std_msgs/String/992ce8a1687cec8c8bd883ec73ca41d1]
[FATAL] [1552307800.670153467]:

這大紅字看的我心裏癢癢啊。。。而且百度上也沒有,連游泳的時候也在想這個問題,會不會消息太長了?想想不對,還有比這個還長的;會不會是double和float32轉換的時候出問題了......後來我認真看錯誤信息的時候發現我在發佈camera信息的時候居然用的String的type,額好吧,是我傻了:發佈的時候應該用camera的type,這下我可更深刻的學到了ROS發佈信息時的許多注意點

    ros::Publisher camera_pub = n.advertise<my_image_transport::camera>("camera", 1000);

另外,我在室內導航用的二維碼,opencv檢測二維碼四個角點的2D座標,然後人爲將3D座標事先定好,匹配好後用solvePnP來算,等我把剩下一點改善完之後發到我的github上,和大家一起分享!

後來我把①aruco檢測出來的和②PnP計算得到的像極座標系下的座標以及③轉換後得到室內座標系下的座標,都輸出了一下,因爲我沒有太搞懂aruco計算的方法,所以我截了一下屏,希望有大佬看到可以幫忙講解一下,謝謝啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章