首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使摄像机工作,ROS ORB_SLAM2 /orb_slam2 2_mono/orb_image也是空白的。

即使摄像机工作,ROS ORB_SLAM2 /orb_slam2 2_mono/orb_image也是空白的。
EN

Stack Overflow用户
提问于 2021-02-09 17:21:05
回答 2查看 914关注 0票数 2

我想用Picamera来绘制地图。我有运行cv_camera_node的Raspberry Pi和运行roscore的Ubuntu20.04.1,以及slam和rviz。我有OpenCV 4.2.0,并安装了以下版本的orb 2:https://github.com/appliedAI-Initiative/orb_slam_2_ros。我在经营罗丝·诺西奇。我为slam编写了以下启动文件:

代码语言:javascript
复制
<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>

然后运行另一个定制catkin包,它具有以下python脚本:

代码语言:javascript
复制
#!/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没有数据。我通过运行rostopic echo /orb_slam2_mono/debug_image来确认这一点。我知道有一个摄像头馈送,因为rvizrqt_image_viewer都可以显示来自/cv_camera/image_raw的图像。我已经完全遵循了这个指南:https://medium.com/@mhamdaan/implementing-orb-slam-on-ubuntu-18-04-ros-melodic-606e668deffa。有什么问题,我怎么解决呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-10 19:02:30

也许你的相机没被拿起来。您使用的是cv_camera_node,这意味着默认的主题将是cv_camera,但是orb_slam2只需要摄像头。要解决这个问题,请进入cv_camera_node.cpp,它将如下所示:

代码语言:javascript
复制
// 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");。重新运行所有的东西,它应该能工作。

票数 0
EN

Stack Overflow用户

发布于 2021-03-04 18:26:00

我也遇到了同样的问题,我发现问题发生在启动文件中,它正在将摄像机提要重新映射到错误的ros主题,如果您使用默认的启动文件并打开rqt节点图,您将看到有一个名为camera/rgb/image_raw的浮动主题,而且由于没有人发布该主题,所以轨道same没有读取您的相机提要。要解决这个问题,我所要做的就是从启动文件中删除这一行。

代码语言:javascript
复制
 <!-- remove this -->
       <remap from="/camera/image_raw" to="/camera/rgb/image_raw" />

在修复问题之前,ros节点图显示,不是订阅了真正的摄像机镜头,而是订阅了那个/rgb主题,但是在修复之后,它订阅了正确的摄像机主题。

在修复之前

修复后

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66123837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档