下午好,亲爱的读者们! 我将继续讨论机器人操作系统(ROS)机器人平台的各种有趣且有用的功能。 在这个简短的教程中,我将讨论在C ++中进行编程时使用ROS进行日志记录的可能性。 我认为许多人都会同意,在执行程序时(尤其是在调试时),在程序执行期间输出消息非常重要。 ROS提供了一种方便的API,用于将各种类型的消息输出到终端,并具有在特殊ROS工具中可视化和过滤消息的功能。 让我们开始吧!
使用console.h库方法在节点中显示消息
因此,让我们编写一个简单的节点,我们将其称为logging_tutorial:
catkin_create_pkg logging_tutorial roscpp std_msgs
添加到CMakeLists.txt:
add_executable(logging_node src/main.cpp) target_link_libraries(logging_node ${catkin_LIBRARIES} )
现在让我们开始编写main.cpp代码。 我们在文件头中导入一个特殊的头文件console.h,其中包含日志记录功能的定义:
#include <ros/console.h>
向main方法添加一条简单消息:
int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ROS_INFO("logging_node start"); return 0; }
编译软件包并运行它:
cd ~/catkin_ws catkin_make source devel/setup.bash rosrun logging_tutorial logging_node
输出将如下所示:
[ INFO] [1492194213.009783103]: logging_node start
在消息的开头,添加了从1970年1月1日起以秒和纳秒为单位的“级别”或类型和时间戳,在这种情况下,我们将获得一个具有INFO级别的消息。
我们可以将参数传递给消息,类似于printf方法:
int val = 5; ROS_INFO("message with argument: %d", val);
您可以将消息创建为标准流,例如std :: cout:
ROS_INFO_STREAM("message with argument: " << val);
ROS支持以下“详细程度”(相关性从高到低):
要显示特定级别的消息,将使用相应的功能,其格式为:ROS _ \ <LEVEL \>。 各种类型的消息以特定的颜色显示:DEBUG-绿色,INFO-白色,WARN-黄色,ERROR-红色,FATAL-紫色。 每种消息的目的很容易通过其名称来猜测。 例如,调试消息对于调试很有用。
添加一些不同的消息并循环运行所有内容。 我得到以下文件:
#include <ros/ros.h> #include <ros/console.h> int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ros::Rate rate (1); while(ros::ok()) { ROS_DEBUG("debug message"); ROS_INFO("logging_node start"); int val = 5; ROS_INFO("message with argument: %d", val); ROS_INFO_STREAM("stream message with argument: " << val); ROS_WARN("My warning"); ROS_ERROR("Some error"); ROS_FATAL("Fatal error"); ros::spinOnce(); rate.sleep(); } return 0; }
默认情况下,在程序执行期间会显示除DEBUG之外的所有类型的消息。 这由使用ROSCONSOLE_MIN_SEVERITY参数的最低级别(即所谓的“重要性级别”)确定。 ROSCONSOLE_MIN_SEVERITY参数以显示等于或高于最小级别的所有消息的方式限制消息的输出。 默认情况下,最低级别设置为DEBUG。 您可以通过使用节点文件开头的宏为ROSCONSOLE_MIN_SEVERITY分配消息级别之一(ROSCONSOLE_SEVERITY_DEBUG,ROSCONSOLE_SEVERITY_INFO等)或任何级别(ROSCONSOLE_SEVERITY_NONE)的值来更改最低级别:
#define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SEVERITY_DEBUG
您还可以在CMakeLists.txt文件中为包中的所有节点设置严重性级别:
add_definitions(-DROSCONSOLE_MIN_SEVERITY=ROSCONSOLE_SEVERITY_ERROR)
此方法有一个局限性:即使直接指定ROSCONSOLE_SEVERITY_DEBUG,也只会显示高于DEBUG的消息。 可以使用特殊的配置文件解决此问题。 创建一个配置文件夹,并在其中创建一个custom_rosconsole.conf文件,其中包含以下内容:
log4j.logger.ros.logging_tutorial=DEBUG
接下来,创建启动logging.launch文件,并在ROSCONSOLE_CONFIG_FILE变量中指定custom_rosconsole.conf文件的路径:
<launch> <env name="ROSCONSOLE_CONFIG_FILE" value="$(find logging_tutorial)/config/custom_rosconsole.conf"/> <node pkg="logging_tutorial" type="logging_node" name="logging_node" output="screen"/> </launch>
在这里,我们添加了output =“ screen”参数,该参数允许输出以INFO开头的级别消息。
编译并运行我们的启动器:
cd ~/catkin_ws catkin_make roslaunch logging_tutorial logging.launch
我们得出类似的结论:

ROS具有命名消息的功能。 默认情况下,消息获取主机名。 用户可以通过ROS _ \ <LEVEL \> [_ STREAM] _NAMED函数为各种消息命名。
ROS_INFO_STREAM_NAMED("named_msg", "named info stream message with argument: " << val);
名称允许您为配置文件中的每个命名消息分配不同的最低级别,并分别更改它们。 消息名称显示在程序包名称之后:
log4j.logger.ros.logging_tutorial.named_msg = ERROR
在一定条件下执行的条件消息也很有用。 为此,请使用ROS函数_ \ <LEVEL \> [_ STREAM] _COND [_NAMED]:
ROS_INFO_STREAM_COND(val < 2, "conditional stream message shown when val (" << val << ") < 2");
可以使用ROS _ \ <LEVEL \> [_ STREAM] _THROTTLE [_NAMED]函数以特定的频率输出消息。 第一个参数以秒为单位设置频率:
ROS_INFO_THROTTLE(3, "throttled message with period 3 seconds");
使用rqt_console显示消息
运行rqt_console实用程序:
rosrun rqt_console rqt_console
并使用启动启动我们的节点:
roslaunch logging_tutorial logging.launch
rqt_console窗口将如下所示:

在此表中,对于每条消息,将显示其级别,节点名称,文件名和生成该消息的代码行。
通过双击消息,您可以获得有关它的详细信息:
您可以通过排除所有错误消息来过滤消息。 为此,通过单击“排除消息”表旁边的加号并选择“ ...包含”选项来添加过滤器:

或排除具有“信息”级别的消息:

同样,可以使用“突出显示消息”部分中的过滤器来区分给定级别的消息:

因此,rqt_console允许您灵活地配置来自各个节点的消息显示,并简化ROS中的调试程序。
我希望本指南对工作有帮助,并简化编程过程中出现的问题的解决方案。 祝您在与ROS合作中取得圆满成功,并很快见到您!