void MySigintHandler(int sig){ //这里主要进行退出前的数据保存、内存清理、告知其" /> void MySigintHandler(int sig){ //这里主要进行退出前的数据保存、内存清理、告知其" />

ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

转:https://haoqchen.site/2018/04/28/ROS-node-init/

很多ROS新手编写节点的时候都不知道要怎么才能Ctrl+c退出,根本都没有注意到一个节点的生命流程,看完你就懂了~~

#include "ros/ros.h"#include <signal.h> void MySigintHandler(int sig){    //这里主要进行退出前的数据保存内存清理、告知其他节点等工作    ROS_INFO("shutting down!");    ros::shutdown();} int main(int argc, char** argv){//ros::init()    /**      * The ros::init() function needs to see argc and argv so that it can perform      * any ROS arguments and name remapping that were provided at the command line. For programmatic      * remappings you can use a different version of init() which takes remappings      * directly, but for most command-line programs, passing argc and argv is the easiest      * way to do it.  The third argument to init() is the name of the node.      *      * You must call one of the versions of ros::init() before using any other      * part of the ROS system.    */    ros::init(argc, argv, "ist_node");    //初始化节点名字必须在最前面,如果ROS系统中出现重名,则之前的节点会被自动关闭    //如果想要多个重名节点而不报错,可以在init中添加ros::init_options::AnonymousName参数    //该参数会在原有节点名字的后面添加一些随机数来使每个节点独一无二    //ros::init(argc, argv, "my_node_name", ros::init_options::AnonymousName); //ros::NodeHandle    /**      * NodeHandle is the main access point to communications with the ROS system.      * The first NodeHandle constructed will fully initialize this node, and the last      * NodeHandle destructed will call ros::shutdown() to close down the node.    */    ros::NodeHandle h_node;    //获取节点的句柄,init是初始化节点,这个是Starting the node    //如果不想通过对象的生命周期来管理节点的开始和结束,你可以通过ros::start()和ros::shutdown() 来自己管理节点。        ros::Rate loop_rate(1);    //loop once per second    //Cannot use before the first NodeHandle has been created or ros::start() has been called. //shut down    signal(SIGINT, MySigintHandler);    //覆盖原来的Ctrl+C中断函数,原来的只会调用ros::shutdown()    //为你关闭节点相关的subscriptions, publications, service calls, and service servers,退出进程 //run status    int sec = 0;    while(ros::ok() && sec++ < 5){        loop_rate.sleep();        ROS_INFO("ROS is ok!");        ros::spinOnce();    }    //ros::ok()返回false,代表可能发生了以下事件        //1.SIGINT被触发(Ctrl-C)调用了ros::shutdown()        //2.被另一同名节点踢出 ROS 网络        //3.ros::shutdown()被程序的另一部分调用        //4.节点中的所有ros::NodeHandles 都已经被销毁    //ros::isShuttingDown():一旦ros::shutdown()被调用(注意是刚开始调用,而不是调用完毕),就返回true    //一般建议用ros::ok(),特殊情况可以用ros::isShuttingDown()     ROS_INFO("Node exit");    printf("Process exit");    return 0;}

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部