ubuntu ctrl+c 无法结束ros节点

问题描述:
在命令窗口中按下ctrl+c后 程序虽然停止运行,但不能退出到命令行状态,必须强制退出才可以。 添加了signal(SIGINT, MySigintHandler);但不能自动调用
解决办法:
signal(SIGINT, MySigintHandler);添加的位置不正确。调整在程序中的位置如下所示:放到ros::Rate 和 ros::NodeHandle nh; 语句后面就可以了。

int main(int argc, char** argv)
{
    ros::init(argc, argv, "test");
    ros::AsyncSpinner spinner(4);
    ros::NodeHandle nh;
    ros::Rate rate(30);
    spinner.start();

    signal(SIGINT, MySigintHandler);
    //覆盖原来的Ctrl+C中断函数,原来的只会调用ros::shutdown(),按下了Ctrl+C,则会调用MySigintHandler
	//为你关闭节点相关的subscriptions, publications, service calls, and service servers,退出进程
    
    while(ros::ok())
    {
    	//code
    }
    
    return 0;
}

MySigintHandler代码如下:

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

参考:
https://www.cnblogs.com/HaoQChen/p/11048616.html

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果有一个节点无法接收到 `ctrl+c` 信号,可能是因为该节点的代码中没有处理 `SIGINT` 信号。ROS2 的节点默认会处理 `SIGINT` 信号,因此当你按下 `ctrl+c` 时,节点会优雅地关闭并退出。但是如果节点的代码中没有处理 `SIGINT` 信号,那么节点无法接收到 `ctrl+c` 信号,也就无法优雅地关闭。 要解决这个问题,可以在节点的代码中添加 `SIGINT` 信号处理函数。在该函数中,你可以在节点收到 `SIGINT` 信号时进行一些清理工作,然后调用 `rclcpp::shutdown()` 函数来关闭节点。这样,当你按下 `ctrl+c` 时,节点就会接收到 `SIGINT` 信号,执行相应的清理工作,并优雅地关闭。 以下是一个示例 `SIGINT` 信号处理函数的代码: ```cpp #include <signal.h> #include "rclcpp/rclcpp.hpp" // 定义 SIGINT 信号处理函数 void sigint_handler(int sig) { // 执行一些清理工作 // ... // 关闭节点 rclcpp::shutdown(); } int main(int argc, char **argv) { // 初始化节点 rclcpp::init(argc, argv); // 创建节点 auto node = std::make_shared<rclcpp::Node>("my_node"); // 注册 SIGINT 信号处理函数 signal(SIGINT, sigint_handler); // 运行节点 rclcpp::spin(node); return 0; } ``` 在上面的代码中,我们使用 `signal()` 函数注册了一个 `SIGINT` 信号处理函数 `sigint_handler()`。当节点收到 `SIGINT` 信号时,就会执行 `sigint_handler()` 函数中的清理工作,并调用 `rclcpp::shutdown()` 函数来关闭节点。这样,即使节点无法接收到 `ctrl+c` 信号,也能够优雅地关闭节点

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值