ROS毕设坑3:在ROS下用视觉方法求取R和t,然后将其发布

时间:2024-03-22 22:37:38

今天莫名遇到两个问题:之前调好的代码硬生生的跑不通,就会出现下面这个问题:

ROS毕设坑3:在ROS下用视觉方法求取R和t,然后将其发布

原谅我不太会修改这个难看的图片,我把错误信息复制了一下:

OpenCV Error: Assertion failed (total() == 0 || data != __null) in Mat, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/core/include/opencv2/core/mat.inl.hpp, line 533
terminate called after throwing an instance of 'cv::Exception'
  what():  /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/core/include/opencv2/core/mat.inl.hpp:533: error: (-215) total() == 0 || data != __null in function Mat

大概意思就是说我还没得到图片呢就让他去计算,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上,和大家一起分享!