ROS源代码阅读(4):ROS程序的初始化——file_log::init()和param::init()

本文深入探讨ROS环境的初始化,关注file_log::init()和param::init()函数。file_log::init()负责日志文件初始化,param::init()则涉及参数设置。文中详细解析了get_environment_variable()、ros::param::set()以及XmlRpc::XmlRpcValue类,展示了ROS节点间通信的基础——XML-RPC协议。
摘要由CSDN通过智能技术生成

接着上一篇博文ROS源代码阅读(3):ROS程序的初始化——this_node::init()。在此文中我们继续探讨的是ROS环境的初始化——file_log::init()和param::init()函数。

1.file_log::init()函数

从file_log::init()的名字我们可以猜测,该函数用于对日志文件的初始化。
file_log::init()函数定义在./src/ros_comm/roscpp/src/libros/file_log.cpp
中,具体实现代码和注释如下:

void init(const M_string& remappings)
{
  std::string log_file_name;
  M_string::const_iterator it = remappings.find("__log");
  //在remappings中找到键为"__log"的项
  if (it != remappings.end())
  {
    log_file_name = it->second; //如果找到了,将对应的值赋值给log_file_name
  }

  {
    // Log filename can be specified on the command line through __log
    // If it's been set, don't create our own name
    if (log_file_name.empty())//如果log_file_name是个空串
    {
      // Setup the logfile appender
      // Can't do this in rosconsole because the node name is not known
      pid_t pid = getpid();//获取当前进程号
      std::string ros_log_env;
      if ( get_environment_variable(ros_log_env, "ROS_LOG_DIR"))//获取"ROS_LOG_DIR"的环境变量值
      {
        log_file_name = ros_log_env + std::string("/");//在获取的环境变量后面增加“/”
      }
      else//如果不存在"ROS_LOG_DIR"这个环境变量
      {
        if ( get_environment_variable(ros_log_env, "ROS_HOME"))//获取"ROS_HOME"的环境变量值
        {
          log_file_name = ros_log_env + std::string("/log/");//在获取的环境变量后面增加“/log/”
        }
        else//如果不存在环境变量"ROS_HOME"
        {
          if( get_environment_variable(ros_log_env, "HOME") )//获取"ROS_HOME"的环境变量值
          {
            std::string dotros = ros_log_env + std::string("/.ros/");//在获取的环境变量后面增加“/.ros/”
            fs::create_directory(dotros);//创建相应文件夹
            log_file_name = dotros + "log/";
            fs::create_directory(log_file_name);//创建相应文件夹
          }
        }
      }//end of "else//如果不存在"ROS_LOG_DIR"这个环境变量

      //处理节点的名字,并接到log_file_name后面
      for (size_t i = 1; i < this_node::getName().length(); i++)
      {
        if (!isalnum(this_node::getName()[i]))
        {
          log_file_name += '_';
        }
        else
        {
          log_file_name += this_node::getName()[i];
        }
      }

      char pid_str[100];
      snprintf(pid_str, sizeof(pid_str), "%d", pid);//将pid以整形变量的形式写入pid_str
      log_file_name += std::string("_") + std::string(pid_str) + std::string(".log");
    }

    //返回log_file_name对应文件的完整路径
    log_file_name = fs::s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值