m0_56563988 2024-08-07 20:59 采纳率: 0%
浏览 20
已结题

基于ros2的orbslam3的实时运行

根据站内文章

[](https://blog.csdn.net/liiiuzy/article/details/136272727) 

已完成使用电脑摄像头进行基于ros2的orbslam3的实时运行。将它迁移到turtlebot4(不用在意,他实际上只是一个带着摄像头的机器人)时,发生了如下问题,我实在是才疏学浅,尝试过很久都无法解决。

我的操作是将/src/ORB_SLAM3_ROS2-humble/src/monocular/monocular-slam-node.cpp内的/image_raw(即电脑摄像头的话题名称)改为机器人的摄像头话题名称

img

实现效果是程序可以正常编译运行,但是显示实时拍摄图像的弹窗一直是黑屏,如下所示:

img

终端里会不断的弹出one frame has been sent,但是和正常相比弹的不是很快。

我尝试过把turtlebot4摄像头话题/oakd/rgb/preview/image_raw改为/oakd/rgb/preview/image_raw/compressed(即模糊版的话题),但反而更糟糕了,连one frame has been sent都不弹了。

尝试很久也无法解决问题,希望可以有人救我小命,真的很绝望。永远感激每一个愿意帮助我的人。

  • 写回答

21条回答 默认 最新

  • 专家-司宇[在线] 2024-08-07 21:00
    关注
    获得0.20元问题酬金

    参考免费微信小程序:皆我百晓生 作答,经由专家-司宇整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要解决这个问题,我们首先需要确保图像数据正确地从TurtleBot4的摄像头传输到ORB-SLAM3节点,并且图像格式被正确处理。从你描述的情况来看,图像没有正确显示,可能是因为数据订阅、图像解码或图像处理的某个环节出现了问题。下面是一些可能的解决方案步骤:

    1. 确认图像话题正确性

    首先,确认/oakd/rgb/preview/image_raw是正确的图像话题名称。TurtleBot4的摄像头如果使用OpenCV等库可能提供压缩图像流,因此确保使用的是未压缩的图像流,因为ORB-SLAM通常直接处理原始图像数据。

    2. 图像数据订阅

    确保你的monocular-slam-node.cpp中的图像订阅代码正确指向了TurtleBot4的图像话题,并且设置了合适的回调函数处理图像数据。这里是一个示例代码段,展示了如何订阅图像话题并设置回调函数。注意,我将使用未压缩的话题作为示例,如果你确定需要使用压缩图像,还需在回调函数中添加解压步骤。

    // 在MonocularSlamNode类的初始化部分
    m_image_subscriber = this->create_subscription<sensor_msgs::msg::Image>(
        "/oakd/rgb/preview/image_raw",  // 请确保这是正确的图像话题
        10,                            // 队列大小
        std::bind(&MonocularSlamNode::GrabImageCallback, this, std::placeholders::_1));
    

    3. 图像回调函数处理

    接下来,确保你的回调函数GrabImageCallback正确地处理了图像数据。这包括但不限于图像格式转换、尺寸调整等。下面是一个简化的回调函数示例,它将ROS图像消息转换为ORB-SLAM能处理的格式:

    void MonocularSlamNode::GrabImageCallback(const sensor_msgs::msg::Image::SharedPtr msg)
    {
        cv_bridge::CvImagePtr cv_ptr;
        try
        {
            cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); // 假设ORB-SLAM期望BGR8格式
        }
        catch (cv_bridge::Exception& e)
        {
            RCLCPP_ERROR(this->get_logger(), "cv_bridge exception: %s", e.what());
            return;
        }
    
        // 将转换后的图像传递给ORB-SLAM系统
        m_SLAM.TrackMonocular(cv_ptr->image, cv_ptr->header.stamp.toSec());
    }
    

    4. 调整ORB-SLAM3配置

    确保ORB-SLAM3的配置文件(比如Stereo-Inertial.yaml或Monocular.yaml)与你的摄像头设置相匹配,特别是图像分辨率和帧率。不匹配的设置可能导致图像处理异常。

    5. 检查ROS日志

    仔细查看终端输出的日志,寻找任何错误或警告信息,这些可能是问题的关键线索。特别关注图像订阅失败、图像格式不支持或内存不足等问题的提示。

    6. 性能与资源检查

    确认运行环境有足够的计算资源处理图像数据和ORB-SLAM的密集计算任务。在某些资源受限的平台上,图像处理和SLAM算法可能会因CPU或GPU资源不足而表现异常。

    结论

    按照上述步骤逐一排查,应该能够定位并解决图像不显示的问题。如果问题仍然存在,建议进一步深入分析ROS日志、检查网络带宽(如果图像通过网络传输)、以及确认硬件是否完全兼容。记住,调试过程中细致记录每一步的修改和测试结果,这有助于快速定位问题所在。祝你好运!

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 创建了问题 8月7日

悬赏问题

  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?