• This Node源码分析


    看军哥博客有Rtos的源码分析,手痒耍宝把自己读的源码笔记分享出来.愿与众君互相讨论学习


    
    
    namespace ros
    {
    
    
    namespace names
    {
    void init(const M_string& remappings);
    }
    
    
    namespace this_node
    {
    
    
    std::string g_name = "empty";
    std::string g_namespace;
    
    
    const std::string& getName()    //获取当前的名字
    {
      return g_name;
    }
    
    
    const std::string& getNamespace()   //获取当前命名空间
    {
      return g_namespace;
    }
    
    
    void getAdvertisedTopics(V_string& topics)  //返回实例的发布者话题名
    {
      TopicManager::instance()->getAdvertisedTopics(topics);
    }
    
    
    void getSubscribedTopics(V_string& topics)  //返回实例的订阅者话题名
    {
      TopicManager::instance()->getSubscribedTopics(topics);
    }
    
    
    void init(const std::string& name, const M_string& remappings, uint32_t options)    //这前面还有argc argv 才是节点名
    {
      char *ns_env = NULL;
    #ifdef _MSC_VER //ROS绝逼是在Win下开发的`_^`
      _dupenv_s(&ns_env, NULL, "ROS_NAMESPACE");    //从环境中取字符串,获取环境变量的值
    #else
      ns_env = getenv("ROS_NAMESPACE"); //在这里去环境变量应该指的就是命名空间惹
    #endif
    
    
      if (ns_env)
      {
        g_namespace = ns_env;   //获取的命名空间值和当前命名空间相等
    #ifdef _MSC_VER
        free(ns_env);
    #endif
      }
    
    
      g_name = name;    //节点名给全局
    
    
      bool disable_anon = false;
      M_string::const_iterator it = remappings.find("__name");  //关联容器重命名,不知道它想干啥,看着一堆宏头大了
      if (it != remappings.end())
      {
        g_name = it->second;
        disable_anon = true;
      }
    
    
      it = remappings.find("__ns");
      if (it != remappings.end())
      {
        g_namespace = it->second;
      }
    
    
      if (g_namespace.empty())
      {
        g_namespace = "/";
      }
    
    
      g_namespace = (g_namespace == "/")
        ? std::string("/") 
        : ("/" + g_namespace)
        ;
    
    
    
    
      std::string error;
      if (!names::validate(g_namespace, error)) //若检测到命名空间非有效数据,报错
      {
        std::stringstream ss;
        ss << "Namespace [" << g_namespace << "] is invalid: " << error;
        throw InvalidNameException(ss.str());
      }
    
    
      // names must be initialized here, because it requires the namespace to already be known so that it can properly resolve names.
      // It must be done before we resolve g_name, because otherwise the name will not get remapped.
      //还不太明白它的重映射功能
      names::init(remappings);  //还是不懂重映射==
    
    
      if (g_name.find("/") != std::string::npos)    //nops的定义static const size_type npos = -1;
      {
        throw InvalidNodeNameException(g_name, "node names cannot contain /");
      }
      if (g_name.find("~") != std::string::npos)
      {
        throw InvalidNodeNameException(g_name, "node names cannot contain ~");
      }
    
    
      g_name = names::resolve(g_namespace, g_name); //resolve名字,全名/+ns+name
    
    
      if (options & init_options::AnonymousName && !disable_anon)   //init_options::AnonymousName:  匿名节点,在你的节点名后面加一些数字使它变得unique
      {
        char buf[200];
        snprintf(buf, sizeof(buf), "_%llu", (unsigned long long)WallTime::now().toNSec());
        g_name += buf;
      }
    
    
      ros::console::setFixedFilterToken("node", g_name);    //把节点和名字联系起来
    }
    
    
    } // namespace this_node
    
    
    } // namespace ros

    下午写了一下午程序,快五点了不想继续写了,就发this node出来,又惊叹一番,回去看C++ 了bye~
  • 相关阅读:
    java将pdf转成base64字符串及将base64字符串反转pdf
    input校验不能以0开头的数字
    js校验密码,不能为空的8-20位非纯数字或字母的密码
    tomcat正常关闭,端口号占用解决 StandardServer.await: create[8005]:
    Eclipse中项目报Target runtime com.genuitec.runtime.generic.jee60 is not defined异常的解决
    Access restriction: The type Base64 is not accessible due to restriction on
    [操作系统] 线程和进程的简单解释
    ssh登录一段时间后断开的解决方案
    [SAMtools] 常用指令总结
    [C] 有关内存问题
  • 原文地址:https://www.cnblogs.com/feixiao5566/p/5284141.html
Copyright © 2020-2023  润新知