ros::init()是ROS程序调用的第一个函数,用于对ROS程序的初始化。

ros::init()函数的声明在ROS代码中的./src/ros_comm/roscpp/include/ros/init.h文件中。

该函数的具体实现在./src/ros_comm/roscpp/src/libros/init.cpp文件中。

该函数主要调用了以下五个函数对ROS程序进行初始化:

network::init(remappings);

master::init(remappings);

this_node::init(name, remappings, options);

file_log::init(remappings);

param::init(remappings);

network::init(remappings)

其实现在./src/ros_comm/roscpp/src/libros/network.cpp中。

该函数从输入参数remappings提取信息,完成对 g_host 和 g_tcpros_server_port 两个变量的赋值。

g_host:(1)首先尝试 remappings[ __hostname ];(2)然后尝试 remappings[ __ip ];(3)最后尝试 determineHost()。

g_tcpros_server_port:尝试通过 remappings[ __tcpros_server_port]赋值。

master::init(remappings)

master::init()函数定义在./src/ros_comm/roscpp/src/libros/master.cpp文件中。

该函数从输入参数remappings提取信息,对g_uri进行赋值,然后再将g_uri解析成g_host和g_port。

g_uri:(1)尝试通过remappings[ __master ]进行赋值;(2)尝试通过ROS_MASTER_URI的环境变量值进行赋值。

this_node::init
(name, remappings, options)

this_node::init()函数的源代码在./src/ros_comm/roscpp/src/libros/this_node.cpp

该函数对ThisNode类进行初始化,具体地是对该类的成员变量 name_ 和 namespace_ 进行赋值。另外,在ROS程序中,ThisNode类的实例化用了单例模式,整个ROS程序只有singleton一个ThisNode类的对象。

name_:(1)用该函数的输入参数name对该变量进行赋值;(2)在remappings中查找remappings[ _name ],如果存在,则用该项的值覆盖name,并将disable_anon置成true。

namespace_:(1)尝试用ROS_NAMESPACE的环境变量值对其进行赋值;(2)在remappings中查找remappings[ _ns ],如果存在,则用该项的值覆盖namespace。

除此之外,该函数还

调用了names::init(remappings),将remappings映射为g_remappings和g_unresolved_remappings两个变量

调用了ros::console::setFixedFilterToken,增加了一项g_extra_fixed_tokens[node] = name_

file_log::init
(remappings)

file_log::init()函数定义在./src/ros_comm/roscpp/src/libros/file_log.cpp

该函数主要是根据环境变量,生成日志文件的路径和文件名,并赋值给g_log_directory。

param::init(remappings)

该函数定义在./src/ros_comm/roscpp/src/libros/param.cpp文件中。

该函数主要完成一些与执行XML-RPC相关的操作,实现的内容比较多,有待进一步的分析。

总结

根据分析,ros::init()调用的五个函数,即:

network::init(remappings);

master::init(remappings);

this_node::init(name, remappings, options);

file_log::init(remappings);

param::init(remappings);

中,最后一个函数涉及到执行XML-RPC相关操作,而XML-RPC协议是ROS节点通讯的核心调用机制,后续我们会着重进行分析。前面4个函数的功能都主要是对一些全局变量进行赋值。被赋值的变量有(与前面不同,在此我们加上的命名空间):

ros::network::g_host

ros::network::g_tcpros_server_port

ros::master::g_uri

ros::this_node::ThisNode.name_

ros::this_node::ThisNode.namespace_

ros::console::g_extra_fixed_tokens[node]

ros::file_log::g_log_directory

具体这些变量被赋值后,发挥了怎样的作用,在后续对ROS的XML-RPC通信实现进行了分析之后,再进行细致地解析。

参考链接:https://blog.csdn.net/wanghuiquan0712/article/details/78052093

ros:init()的更多相关文章

  1. 节点的启动与关闭 ros::init()解析(c++)

    1.初始化roscpp 节点 ros::init()  API链接:http://docs.ros.org/api/roscpp/html/init_8h.html 在node代码中在调用其它rosc ...

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

    https://haoqchen.site/2018/04/28/ROS-node-init/ #include "ros/ros.h" #include <signal.h ...

  3. ros::spin() 和 ros::spinOnce() 区别及详解

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5925381.html 博主提示:本文基于ROS Kinetic Kame,如有更(g ...

  4. 编写ros串口节点,使用官方serial包

    参考http://www.roswiki.com/read.php?tid=557&fid=39 1.通过sudo apt-get install ros-<distro>-ser ...

  5. ros语音交互(四)移植科大讯飞语音识别到ros

    将以前下载的的语音包的 samples/iat_record/的iat_record.c speech_recognizer.c speech_recognizer.c 拷贝到工程src中, linu ...

  6. ROS语音交互(四)接入图灵语义理解

    首先程序中会用到Json,curl 安装相应的库 $ sudo apt-get install libcurl3 libcurl4-openssl-dev$ sudo apt-get install ...

  7. ROS语音交互(三)科大讯飞语音在ROS平台下使用

    以上节tts语音输出为例 下载sdk链接:http://www.xfyun.cn/sdk/dispatcher 1.下载SDK,解压: 2.在ROS工作空间下创建一个Package: catkin_c ...

  8. ROS笔记——创建简单的主题发布节点和主题订阅节点

    在安装好ROS后,接着学习如何创建节点和节点之间的通信方式,以一个简单的主题发布节点和主题订阅节点说明. 节点是连接ROS网络等可执行文件,是实现某些功能的软件包,也是一个主要计算执行的进程. 一.创 ...

  9. Ros集成开发环境配置

    参考资料: http://blog.csdn.net/yangziluomu/article/details/50848357 ROS使用IDE Eclipse http://blog.csdn.ne ...

随机推荐

  1. Delphi对Excel保护操作

    http://www.docin.com/p-378093577.html在金融系统的应用系统中经常需要与Excel交换数据或利用Excel制作报表,但在某些情况下,我们的业务系统要求生成的临时或最终 ...

  2. Java中关于数据类型的一些问题

    Java中关于数据类型的一些问题 总结一下最近笔试遇到的一些关于Java中数据类型的一些问题. 虽然比较基础,但在实际做题却很容易出错的点,而且往往这些题出错了会给面试官很不好的感觉:你的基础不好. ...

  3. 一条SELECT查询语句在数据库里执行时都经历了什么

    每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...

  4. Nginx02(环境配置以及基本使用)

    一:Nginx环境配置 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet ...

  5. odoo10学习笔记五:高级视图

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189279.html 树视图 tree视图表现出来是列表视图,列表中一行一纪录.可以根据每行纪录的某字段值 ...

  6. 【洛谷P4542】 [ZJOI2011]营救皮卡丘(费用流)

    洛谷 题意: 给出\(n\)个点,\(m\)条边,现在有\(k,k\leq 10\)个人从\(0\)号点出发前往\(n\)点. 规定若某个人想要到达\(x\)点,则\(1\)~\(x-1\)号点都有人 ...

  7. grep命令用法

    linux中grep命令的用法 作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:grep  [选项]  ”模 ...

  8. woocommerce如何隐藏/显示product meta

    前面我们说了woocommerce如何隐藏SKU,那如果不想显示产品分类category和标签tag呢?我们知道SKU, Category list 和 Tag list在woocommerce产品页 ...

  9. continue and break

    #1.continue终止当前循环开始下一次循环count = 0while count < 10: if count == 7: count = count +1 continue print ...

  10. JDOJ 3055: Nearest Common Ancestors

    JDOJ 3055: Nearest Common Ancestors JDOJ传送门 Description 给定N个节点的一棵树,有K次查询,每次查询a和b的最近公共祖先. 样例中的16和7的公共 ...