zoukankan      html  css  js  c++  java
  • ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle

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

    #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;
    }
  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/long5683/p/10950888.html
Copyright © 2011-2022 走看看