测试环境:
- Hardware : BCM2835
- Model : Raspberry Pi 4 Model B Rev 1.4
- CPU : 4x Cortex A72
- Linux version 5.4.0-1052-raspi (buildd@bos02-arm64-043) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #58-Ubuntu SMP PREEMPT Mon Feb 7 16:52:35 UTC 2022
- Orb-SLAM3: V1.0, December 22th, 2021
- ROS : noetic
- Camera : 640 x 480 @ 25Hz
问题描述:
1、运行:
Terminal 1:
gland@gland-desktop:~$ roscore
Terminal 2:
gland@gland-desktop:~/Downloads/ORB_SLAM3-master$ rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples_old/Monocular/EuRoC.yaml
2、播放标准数据集正常:
Terminal 3:
gland@gland-desktop:~/Downloads/DataSet$ rosbag play MH_01_easy.bag
视频图像数据rostopic 为: [Examples_old/ROS/ORB_SLAM3/src/ros_mono.cc]
image_transport::Subscriber sub = it.subscribe("cam0/image_raw",1,&ImageGrabber::GrabImage,&igb);
3、停止 “rosbag play MH_01_easy.bag”,改为本地摄像头视频:
摄像头端发送视频代码为:
#include <ros/ros.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
ros::init(argc,argv,"image_publisher");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Publisher pub = it.advertise("cam0/image_raw",1);
ROS_INFO("camera open ...");
VideoCapture cam(0);
if(!cam.isOpened())
{
exit(0);
}
ROS_INFO("camera opened!");
Mat srcframe;
ros::Rate loop_rate(10);
while(nh.ok())
{
cam >> srcframe;
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(),"mono8",srcframe).toImageMsg();
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
ROS_INFO("send image");
}
}
问题:
(1)ORB-SLAM3 Mono 接收不到视频数据;
(2)长时间等待后,能接收到摄像头发送的数据;
测试:
(1)rqt_graph 查看,节点的话题发布和订阅正常
(2)摄像头拍摄复杂图像(特征点多),Mono端较快出现图像并显示特征点
(3)摄像头拍摄简单图像(特征点少),Mono端不能出现图像,“WAITING FOR IMAGES”
(4)将摄像头由简单图像移动到复杂图像时,Mono端会捕捉到特征点,开始输出并显示图像。
结论:
ORB-SLAM3 Mono 在完成特征点抓取后才会首次输出并显示图像。