問題の説明:
コマンド ウィンドウで 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
元のリンク: https://blog.csdn.net/ABC_ORANGE/article/details/105096782
公式 Web サイト情報:公式ドキュメント - 初期化とシャットダウン
必ずヘッダー ファイル #include <signal.h> を追加してください。