this_node::init
命名空间names
是在这里初始化的
1 | void init(const std::string& name, const M_string& remappings, uint32_t options) |
最后的函数是:1
2
3
4void setFixedFilterToken(const std::string& key, const std::string& val)
{
g_extra_fixed_tokens[key] = val;
}
主要是对变量g_extra_fixed_tokens进行赋值
file_log::init
file_log
就是个命名空间,函数定义在./src/ros_comm/roscpp/src/libros/file_log.cpp:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66void 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())
{
// 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;
//获取"ROS_LOG_DIR"
if ( get_environment_variable(ros_log_env, "ROS_LOG_DIR"))
{
log_file_name = ros_log_env + std::string("/");
}
else //如果不存在"ROS_LOG_DIR"这个环境变量
{ //获取"ROS_HOME"的环境变量值
if ( get_environment_variable(ros_log_env, "ROS_HOME"))
{
log_file_name = ros_log_env + std::string("/log/");
}
else //如果不存在环境变量"ROS_HOME"
{
// 无法跨平台?
// 如果没有设置以上环境变量,日志最终放在 ~/.ros/log
if( get_environment_variable(ros_log_env, "HOME") )
{
std::string dotros = ros_log_env + std::string("/.ros/");
fs::create_directory(dotros);
log_file_name = dotros + "log/";
fs::create_directory(log_file_name);
}
}
}
// 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];
}
}
// 变成了 节点名_pid_log
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 = fs::system_complete(log_file_name).string();
g_log_directory = fs::path(log_file_name).parent_path().string();
}
}
这个函数其实就是确定日志存放目录和日志名称,例如:
问题是为什么有的节点最后还要加上时间戳?
参考:
ros time.h