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. LinuxShell——特殊符号

    LinuxShell——特殊符号 摘要:本文主要学习了Shell命令中具有特殊功能的一些符号. 多命令执行 顺序执行“;” 如果使用“;”连接多条命令,那么这些命令会依次执行,但是各命令之间没有任何逻 ...

  2. apache-tomcat-7.0.94在Windows上启动时,控制台黑窗口出现乱码解决

    一.问题 二.解决 原因是tomcat日志编码的配置问题. 打开tomcat/conf/logging.properties配置文件. 把编码注释掉或者改为gbk就可以了. 参考:https://bl ...

  3. GSOAP服务卡住?

    很久以前参考了https://www.genivia.com/doc/soapdoc2.html 中的一段: How to Create a Multi-Threaded Stand-Alone Se ...

  4. boa移植 boa交叉编译

    官网:http://www.boa.org/ BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的.适合于嵌入式系统的单任务的http服务器,源代码开放.性能 ...

  5. maven的配置及基本操作

    ---恢复内容开始--- 1.官网下载maven 官方网址:http://maven.aparche.org 2.将maven解压到硬盘(最好没有中文路径)下 3.配置maven环境变量  4.配置m ...

  6. Django 练习班级管理系统六 -- 编辑老师列表

    修改 views.py @auth def edit_teacher(request, nid): if request.method == "GET": obj = models ...

  7. itextpdf5单元格中的段落没有行间距

    关于对表格中的段落没有行间距的解决方式:通过观察和推测的结论:itextpdf对一些属性,只会对最外层元素的属性进行接收处理,如行间距.例: Paragraph p = new Paragraph(1 ...

  8. Everybody Dance Now

    一.摘要 作者提出了一种简单的动作迁移方法,实现了"do as I do":给定一个人跳舞的源视频,作者可以在目标对象表演标准动作的短短几分钟后,将该表演转移到一个新的(业余的)目 ...

  9. Js中的对象、构造函数、原型、原型链及继承

    1.对象 在传统的面向过程的程序设计中,会造成函数或变量的冗余.而JS中对象的目的是将所有的具有相同属性或行为的代码整合到一起,形成一个集合,这样就会方便我们管理,例如: var person1={  ...

  10. Hello,DTOS!(中)

    org 0x7c00   //主引导程序的入口地址为0x7c00(物理地址),类似于用c或c++程序中的main函数. start:  //定义标签,标签的含义就是mov ax,cs这条指令的地址. ...