ORB-SLAM2 轨迹保存与ros::spin()相关问题(ctrl+c无法退出ros::spin()并进行轨迹保存,而是错误的直接退出主程序)

文章描述了一个在使用ROS处理RGBD图像时遇到的问题,即在ros::spin()过程中,使用ctrl+c无法优雅退出并保存轨迹。通过添加自定义的信号处理函数MySigintHandler,并在合适位置调用signal函数注册该处理函数,成功实现了在退出前保存数据和清理资源,从而能在按ctrl+c后继续执行后续程序。然而,当没有接收到rostopic信息时,仍然会直接退出程序,这个问题尚未解决。

问题描述:使用ROS接收RGBD图像进行处理时(单目、双目可能也存在类似问题),在运行到ros::spin()前一切正常。当需要使用ctrl+c退出ros::spin()并继续后续代码时,出现触发一次ctrl+c直接退出整个程序的问题(无法保存轨迹)

解决:以ros_rgbd.cc为例:

           1.进入ros_rgbd.cc文件

           2.添加信号处理函数在文件中(ImageGrabber类内外都可)

void MySigintHandler(int sig)
{
    //这里主要进行退出前的数据保存、内存清理、告知其他节点等工作
    // sleep(3);
    ROS_INFO("shutting down!");
    ros::shutdown();
    sleep(1);
}

           2.在末尾Track主函数上下任意位置加入linux中的signal信号函数

signal(SIGINT, MySigintHandler);
mpSLAM->TrackRGBD(cv_ptrRGB->image, cv_ptrD->image, cv_ptrRGB->header.stamp.toSec());
// signal(SIGINT, MySigintHandler);

            3.重新编译,运行build_ros.sh

效果:解决无法保存轨迹文件的问题,在按ctrl+c后可以继续运行ros::spin()后续程序而不会直接退出程序

遗留问题:仍然无法解决当没有接收到rostopic信息时,按ctrl+c直接退出程序的问题(不过正常使用中也仅仅需要在运行一段时间后生成了关键帧数据的情况下才会保存轨迹,在没有任何图片数据时完全是空白的,无需保存轨迹)

### 在ROS中验证ORB-SLAM3的性能或功能 在ROS环境中验证ORB-SLAM3的性能或功能,可以通过以下方式实现。这些方法包括配置环境、运行测试场景以及分析输出结果。 #### 1. 配置ROSORB-SLAM3环境 确保已经正确安装了ROSORB-SLAM3,按照引用中的步骤完成相关依赖库的安装[^2]。此外,需要检查ORB_SLAM3/Examples_Old/ROS/ORB_SLAM3/src目录下的代码是否已根据实际需求调整了话题名称[^3]。例如,确保`ros_mono.cc`和`ros_mono_ar.cc`文件中的订阅话题传感器发布的话题一致。 ```cpp ros::NodeHandle nodeHandler; ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 1, &ImageGrabber::GrabImage, &igb); ros::spin(); ``` #### 2. 使用摄像头数据进行验证 为了验证ORB-SLAM3的功能,可以使用真实摄像头或仿真摄像头发布图像数据。通过`rostopic echo /usb_cam/image_raw`确认图像数据是否正常发布。随后,启动ORB-SLAM3对应的ROS节点,观察其对输入图像的处理情况。 #### 3. 运行Gazebo仿真环境 如果希望在仿真环境中测试ORB-SLAM3,可以结合Gazebo仿真器。创建一个包含摄像头传感器的机器人模型,运行仿真场景。确保Gazebo发布的图像数据ORB-SLAM3订阅的话题匹配[^2]。 ```bash roslaunch gazebo_ros empty_world.launch rosrun orb_slam3 mono rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ``` #### 4. 分析ORB-SLAM3的输出 ORB-SLAM3会生成轨迹文件、关键帧信息以及其他中间结果。可以通过以下方式分析其性能: - **轨迹对比**:将ORB-SLAM3生成的轨迹地面真值(Ground Truth)进行对比,计算定位误差。 - **可视化工具**:利用RViz或其他可视化工具查看ORB-SLAM3生成的地图和轨迹- **日志文件**:检查ORB-SLAM3的日志文件,分析程序运行期间的异常或错误。 #### 5. 测试不同场景 为了全面验证ORB-SLAM3的功能,建议测试多种场景,包括但不限于: - 室内静态环境 - 室外动态环境 - 不同光照条件下的场景 ### 示例代码 以下是一个简单的ROS节点启动脚本,用于运行ORB-SLAM3的单目模式: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2 def image_callback(msg): bridge = CvBridge() cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") # 将图像传递给ORB-SLAM3进行处理 # 示例:调用ORB-SLAM3 API if __name__ == '__main__': rospy.init_node('orb_slam3_test', anonymous=True) rospy.Subscriber("/usb_cam/image_raw", Image, image_callback) rospy.spin() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值