zoukankan      html  css  js  c++  java
  • ros:init()

    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

  • 相关阅读:
    Eclipse 插件Maven在使用 add dependency,找不到包,解决办法
    SimpleDateFormat是线程不安全的,切忌切忌!
    JNative 传递参数bug
    oracle存储过程递归调用
    oracle调用DLL
    telnet和Netstat使用
    notepad++搭配dev配置运行C++
    ubuntu第一次安装登陆密码不正确问题
    区分形参和实参
    爬虫2
  • 原文地址:https://www.cnblogs.com/klcf0220/p/11049857.html
Copyright © 2011-2022 走看看