今天莫名遇到两个问题:之前调好的代码硬生生的跑不通,就会出现下面这个问题:
大概意思就是说我还没得到图片呢就让他去计算,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计算的方法,所以我截了一下屏,希望有大佬看到可以帮忙讲解一下,谢谢啦!