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

被折叠的 条评论
为什么被折叠?



