即使相机工作,ROS ORB_SLAM2 /orb_slam2_mono/debug_image 也是空白
ROS ORB_SLAM2 /orb_slam2_mono/debug_image is blank even if camera works
我想使用 Picamera 进行制图。我有一个 Raspberry Pi 运行ning 一个 cv_camera_node 和一个 Ubuntu 20.04.1 运行ning roscore
,还有 slam 和 rviz。我有 OpenCV 4.2.0 并安装了以下版本的 orb-slam2:https://github.com/appliedAI-Initiative/orb_slam_2_ros。我是 运行ning ROS Noetic。我为 slam 编写了以下启动文件:
<launch>
<node name="orb_slam2_mono" pkg="orb_slam2_ros"
type="orb_slam2_ros_mono" output="screen">
<param name="publish_pointcloud" type="bool" value="true" />
<param name="publish_pose" type="bool" value="true" />
<param name="localize_only" type="bool" value="false" />
<param name="reset_map" type="bool" value="true" />
<!-- static parameters -->
<param name="load_map" type="bool" value="false" />
<param name="map_file" type="string" value="map.bin" />
<param name="voc_file" type="string" value="/home/dragonros/catkin_ws/src/orb_slam_2_ros/orb_slam2/Vocabulary/ORBvoc.txt" />
<param name="pointcloud_frame_id" type="string" value="map" />
<param name="camera_frame_id" type="string" value="camera_link" />
<param name="min_num_kf_in_map" type="int" value="5" />
<!-- ORB parameters -->
<param name="/ORBextractor/nFeatures" type="int" value="2000" />
<param name="/ORBextractor/scaleFactor" type="double" value="1.2" />
<param name="/ORBextractor/nLevels" type="int" value="8" />
<param name="/ORBextractor/iniThFAST" type="int" value="20" />
<param name="/ORBextractor/minThFAST" type="int" value="7" />
<!-- Camera parameters -->
<!-- Camera frames per second -->
<param name="camera_fps" type="int" value="30" />
<!-- Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale) -->
<param name="camera_rgb_encoding" type="bool" value="true" />
<!--If the node should wait for a camera_info topic to take the camera calibration data-->
<param name="load_calibration_from_cam" type="bool" value="false" />
<!-- Camera calibration and distortion parameters (OpenCV) -->
<param name="camera_fx" type="double" value="615.546" />
<param name="camera_fy" type="double" value="631.457" />
<param name="camera_cx" type="double" value="354.361" />
<param name="camera_cy" type="double" value="232.799" />
<!-- Camera calibration and distortion parameters (OpenCV) -->
<param name="camera_k1" type="double" value="0.0" />
<param name="camera_k2" type="double" value="0.0" />
<param name="camera_p1" type="double" value="0.0" />
<param name="camera_p2" type="double" value="1.0" />
</node>
</launch>
然后我 运行 另一个具有以下 python 脚本的自定义 catkin 包:
#!/usr/bin/env python
import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
bridge = CvBridge()
def callback(data):
frame = bridge.imgmsg_to_cv2(data, "bgr8")
cv2.imshow('Video Feed', frame)
cv2.waitKey(1)
rospy.loginfo('Image feed received!')
def listener():
rospy.init_node('vid_rec')
#first parameter is the topic you want to subcribe sensor_msgs/Image from
rospy.Subscriber('/orb_slam2_mono/debug_image', Image, callback)
rospy.spin()
if __name__ == '__main__':
listener()
我应该看到包含 slam 检测到的所有点的摄像头画面。但是 /orb_slam2_mono/debug_image
没有数据。我通过 运行ning rostopic echo /orb_slam2_mono/debug_image
确认了这一点。我知道有一个摄像头源,因为 rviz
和 rqt_image_viewer
都可以显示来自 /cv_camera/image_raw
的图像。我已完全遵循本指南:https://medium.com/@mhamdaan/implementing-orb-slam-on-ubuntu-18-04-ros-melodic-606e668deffa。有什么问题,我该如何解决?
可能你的相机没有被拿起。您正在使用 cv_camera_node 意味着默认主题将是 cv_camera 但 orb_slam2 只需要相机。要解决这个问题,请进入 cv_camera_node.cpp,它看起来像这样:
// Copyright [2015] Takashi Ogura<t.ogura@gmail.com>
#include "cv_camera/driver.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "cv_camera");
ros::NodeHandle private_node("~");
cv_camera::Driver driver(private_node, private_node);
try
{
driver.setup();
while (ros::ok())
{
driver.proceed();
ros::spinOnce();
}
}
catch (cv_camera::DeviceError &e)
{
ROS_ERROR_STREAM("cv camera open failed: " << e.what());
return 1;
}
return 0;
}
您必须将 ros::init(argc, argv, "cv_camera");
行更改为 ros::init(argc, argv, "camera");
。重新运行一切,它应该工作。
我遇到了同样的问题,我发现问题出在启动文件中,它是将相机提要重新映射到错误的 ros 主题,如果您使用默认启动文件并打开 rqt 节点图,您会看到有一个名为 camera/rgb/image_raw
的浮动主题,由于没有人发布该主题,orbslam 不会读取您的相机画面。要解决这个问题,我所要做的就是从启动文件中删除这一行
<!-- remove this -->
<remap from="/camera/image_raw" to="/camera/rgb/image_raw" />
在修复问题之前,ros node graph 显示 orbslam 没有订阅真实的摄像机镜头,而是订阅了 /rgb 主题,但在修复之后,它订阅了正确的摄像机主题。
修复前
修复后
我想使用 Picamera 进行制图。我有一个 Raspberry Pi 运行ning 一个 cv_camera_node 和一个 Ubuntu 20.04.1 运行ning roscore
,还有 slam 和 rviz。我有 OpenCV 4.2.0 并安装了以下版本的 orb-slam2:https://github.com/appliedAI-Initiative/orb_slam_2_ros。我是 运行ning ROS Noetic。我为 slam 编写了以下启动文件:
<launch>
<node name="orb_slam2_mono" pkg="orb_slam2_ros"
type="orb_slam2_ros_mono" output="screen">
<param name="publish_pointcloud" type="bool" value="true" />
<param name="publish_pose" type="bool" value="true" />
<param name="localize_only" type="bool" value="false" />
<param name="reset_map" type="bool" value="true" />
<!-- static parameters -->
<param name="load_map" type="bool" value="false" />
<param name="map_file" type="string" value="map.bin" />
<param name="voc_file" type="string" value="/home/dragonros/catkin_ws/src/orb_slam_2_ros/orb_slam2/Vocabulary/ORBvoc.txt" />
<param name="pointcloud_frame_id" type="string" value="map" />
<param name="camera_frame_id" type="string" value="camera_link" />
<param name="min_num_kf_in_map" type="int" value="5" />
<!-- ORB parameters -->
<param name="/ORBextractor/nFeatures" type="int" value="2000" />
<param name="/ORBextractor/scaleFactor" type="double" value="1.2" />
<param name="/ORBextractor/nLevels" type="int" value="8" />
<param name="/ORBextractor/iniThFAST" type="int" value="20" />
<param name="/ORBextractor/minThFAST" type="int" value="7" />
<!-- Camera parameters -->
<!-- Camera frames per second -->
<param name="camera_fps" type="int" value="30" />
<!-- Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale) -->
<param name="camera_rgb_encoding" type="bool" value="true" />
<!--If the node should wait for a camera_info topic to take the camera calibration data-->
<param name="load_calibration_from_cam" type="bool" value="false" />
<!-- Camera calibration and distortion parameters (OpenCV) -->
<param name="camera_fx" type="double" value="615.546" />
<param name="camera_fy" type="double" value="631.457" />
<param name="camera_cx" type="double" value="354.361" />
<param name="camera_cy" type="double" value="232.799" />
<!-- Camera calibration and distortion parameters (OpenCV) -->
<param name="camera_k1" type="double" value="0.0" />
<param name="camera_k2" type="double" value="0.0" />
<param name="camera_p1" type="double" value="0.0" />
<param name="camera_p2" type="double" value="1.0" />
</node>
</launch>
然后我 运行 另一个具有以下 python 脚本的自定义 catkin 包:
#!/usr/bin/env python
import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
bridge = CvBridge()
def callback(data):
frame = bridge.imgmsg_to_cv2(data, "bgr8")
cv2.imshow('Video Feed', frame)
cv2.waitKey(1)
rospy.loginfo('Image feed received!')
def listener():
rospy.init_node('vid_rec')
#first parameter is the topic you want to subcribe sensor_msgs/Image from
rospy.Subscriber('/orb_slam2_mono/debug_image', Image, callback)
rospy.spin()
if __name__ == '__main__':
listener()
我应该看到包含 slam 检测到的所有点的摄像头画面。但是 /orb_slam2_mono/debug_image
没有数据。我通过 运行ning rostopic echo /orb_slam2_mono/debug_image
确认了这一点。我知道有一个摄像头源,因为 rviz
和 rqt_image_viewer
都可以显示来自 /cv_camera/image_raw
的图像。我已完全遵循本指南:https://medium.com/@mhamdaan/implementing-orb-slam-on-ubuntu-18-04-ros-melodic-606e668deffa。有什么问题,我该如何解决?
可能你的相机没有被拿起。您正在使用 cv_camera_node 意味着默认主题将是 cv_camera 但 orb_slam2 只需要相机。要解决这个问题,请进入 cv_camera_node.cpp,它看起来像这样:
// Copyright [2015] Takashi Ogura<t.ogura@gmail.com>
#include "cv_camera/driver.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "cv_camera");
ros::NodeHandle private_node("~");
cv_camera::Driver driver(private_node, private_node);
try
{
driver.setup();
while (ros::ok())
{
driver.proceed();
ros::spinOnce();
}
}
catch (cv_camera::DeviceError &e)
{
ROS_ERROR_STREAM("cv camera open failed: " << e.what());
return 1;
}
return 0;
}
您必须将 ros::init(argc, argv, "cv_camera");
行更改为 ros::init(argc, argv, "camera");
。重新运行一切,它应该工作。
我遇到了同样的问题,我发现问题出在启动文件中,它是将相机提要重新映射到错误的 ros 主题,如果您使用默认启动文件并打开 rqt 节点图,您会看到有一个名为 camera/rgb/image_raw
的浮动主题,由于没有人发布该主题,orbslam 不会读取您的相机画面。要解决这个问题,我所要做的就是从启动文件中删除这一行
<!-- remove this -->
<remap from="/camera/image_raw" to="/camera/rgb/image_raw" />
在修复问题之前,ros node graph 显示 orbslam 没有订阅真实的摄像机镜头,而是订阅了 /rgb 主题,但在修复之后,它订阅了正确的摄像机主题。
修复前
修复后