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~
This Node源码分析的更多相关文章
- 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...
- kubelet分析-csi driver注册分析-Node Driver Registrar源码分析
kubernetes ceph-csi分析目录导航 Node Driver Registrar分析 node-driver-registrar是一个sidecar容器,通过Kubelet的插件注册机制 ...
- 从源码分析node-gyp指定node库文件下载地址
当我们安装node的C/C++原生模块时,涉及到使用node-gyp对C/C++原生模块的编译工作(configure.build).这个过程,需要nodejs的头文件以及静态库参与(后续称库文件)对 ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- ABP源码分析十五:ABP中的实用扩展方法
类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attribu ...
- MyCat源码分析系列之——结果合并
更多MyCat源码分析,请戳MyCat源码分析系列 结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实 ...
- MyCat源码分析系列之——SQL下发
更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...
- MyCat源码分析系列之——BufferPool与缓存机制
更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...
随机推荐
- 通达信5分钟.lc5和.lc1文件格式
一.通达信日线*.day文件 文件名即股票代码 每32个字节为一天数据 每4个字节为一个字段,每个字段内低字节在前 00 ~ 03 字节:年月日, 整型 04 ~ 07 ...
- android 获取设备拔插状态广播事件易漏掉的一行属性!
我们都知道设备拔插的状态获取需要一个权限 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILES ...
- AndroidManifest.xml详解(下)
本文编辑整理自:http://blog.163.com/hero_213/blog/static/39891214201242835410742/ 八.第三层<activity-alias> ...
- 关于ř与画面的集成---- k均值聚类
1.利用R内置数据集iris: 2.通过Rserve 包连接tableau,服务器:localhost,默认端口6311: 3.加载数据集iris: 4.编辑字段:Cluster <span s ...
- U盘插入电脑后,提示需要格式化U盘如何解决?
未弹出U盘就拔掉U盘,有可能会破坏U盘的分区表.当再次把U盘插入电脑时,会提示需要格式化U盘,这是什么情况,如何解决呢?其实只要用DiskGenius硬盘恢复软件就可以解决这个问题.下面和小编一起来看 ...
- MyEclipse中的SVN操作手册
原文出处:http://blog.sina.com.cn/s/blog_8a3d83320100zhmp.html 1.导入项目 点击工具栏上的[File-Import],进入下图 (如果你的对话框中 ...
- 读《编写可维护的JavaScript》第二三章总结
第二章 注释 添加注释的一般原则是,在需要让代码变得清晰时添加注释. 2.1 ① 单行注释 独占一行的注释,用来解释下一行代码.这行注释之前总是有一个空行,且缩进层级和下一行代码保持一致. 在代码行的 ...
- windows平台解决quick3.5final + sublimeText3 模拟器找不到的问题
下载了quick3.5 准备在sublime上进行开发,结果发现quick3.5中的player模拟器不见了,原来模拟器移到了quick引擎主目录下的 /tools/simulator/runtime ...
- Thread
问题:编写一个能提现多线程的例子?假设有t1,t2两个线程,如何保证t2线程在t1线程执行完后再执行? package cn.changb.thread; public class MyThread ...
- 一个div里有多个a标签,改变a标签的字体颜色方法
<script type="text/javascript">var all=document.getElementById("big");var ...