可视化和调试工具(ROS Visualization)
一、调试ROS节点
(一)使用roslaunch和rosrun的调试选项
1. rosrun
rosrun命令用于运行单个节点。可以通过添加--ros-args和- - log-level选项来设置日志级别。例如:
rosrun my_package my_node --ros-args --log-level=debug
这会将节点的日志级别设置为调试模式,输出更详细的信息。
2. roslaunch
roslaunch命令用于启动多个节点和配置文件。可以通过在launch文件中设置<node>标签的output属性来控制日志输出。例如:
<node name="my_node" pkg="my_package" type="my_node" output="screen" />
这会将节点的输出直接显示在终端屏幕上。还可以使用--screen选项在命令行中查看节点输出:
roslaunch my_package my_launch.launch --screen
(二)使用gdb和valgrind
1. gdb
gdb是一个强大的调试工具,可以用于调试C++编写的ROS节点。可以通过rosrun或roslaunch的--prefix选项来启动gdb。例如:
rosrun --prefix "gdb --args" my_package my_node
这会启动gdb并加载节点程序,可以在gdb中设置断点、单步执行等。
2. valgrind
valgrind是一个内存检测工具,可以用于检测内存泄漏和内存错误。同样可以通过--prefix选项启动valgrind。例如:
rosrun --prefix "valgrind" my_package my_node
二、日志消息
(一)日志级别
ROS提供了多种日志级别,用于控制日志输出的详细程度:
-
DEBUG:最详细的信息,用于调试。 -
INFO:一般的信息,用于正常运行时的输出。 -
WARN:警告信息,表示可能的问题。 -
ERROR:错误信息,表示严重的问题。 -
FATAL:致命错误,通常会导致节点崩溃。
(二)日志输出
在C++中,可以使用ROS_*宏来输出日志信息。例如:
ROS_DEBUG("This is a debug message");
ROS_INFO("This is an info message: %d", value);
ROS_WARN("This is a warning message");
ROS_ERROR("This is an error message");
ROS_FATAL("This is a fatal error message");
在Python中,可以使用rospy.log*函数来输出日志信息。例如:
rospy.logdebug("This is a debug message")
rospy.loginfo("This is an info message: %d", value)
rospy.logwarn("This is a warning message")
rospy.logerr("This is an error message")
rospy.logfatal("This is a fatal error message")
三、检测系统状态
(一)使用rosnode命令
1. 查看节点列表
rosnode list命令可以列出当前运行的所有节点。例如:
rosnode list
2. 查看节点信息
rosnode info命令可以查看特定节点的详细信息,包括订阅和发布的话题、服务等。例如:
rosnode info /my_node
(二)使用rostopic命令
1. 查看话题列表
rostopic list命令可以列出当前所有的话题。例如:
rostopic list
2. 查看话题信息
rostopic info命令可以查看特定话题的详细信息,包括发布者和订阅者。例如:
rostopic info /my_topic
3. 查看话题消息
rostopic echo命令可以实时查看话题的消息内容。例如:
rostopic echo /my_topic
(三)使用rosservice命令
1. 查看服务列表
rosservice list命令可以列出当前所有可用的服务。例如:
rosservice list
2. 查看服务信息
rosservice info命令可以查看特定服务的详细信息,包括服务类型和提供者。例如:
rosservice info /my_service
四、设置动态参数
(一)使用dynamic_reconfigure库
1. 创建配置文件
在ROS包中创建一个cfg目录,用于存放配置文件。例如,创建一个MyConfig.cfg文件:
#! /usr/bin/env python
PACKAGE = "my_package"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("int_param", int_t, 0, "An integer parameter", 42, 0, 100)
gen.add("double_param", double_t, 0, "A double parameter", 1.0, 0.0, 10.0)
gen.add("str_param", str_t, 0, "A string parameter", "hello")
gen.add("bool_param", bool_t, 0, "A boolean parameter", True)
exit(gen.generate(PACKAGE, "my_package", "MyConfig"))
2. 生成配置文件
在CMakeLists.txt文件中添加以下内容:
generate_dynamic_reconfigure_options(
cfg/MyConfig.cfg
DEPENDENCIES other_package
)
运行catkin_make生成配置文件。
3. 在节点中使用动态参数
在C++节点中,可以使用dynamic_reconfigure::Server类来处理动态参数。例如:
#include <dynamic_reconfigure/server.h>
#include <my_package/MyConfig.h>
void callback(my_package::MyConfig &config, uint32_t level)
{
ROS_INFO("Reconfigure Request: %d %f %s %s %d",
config.int_param, config.double_param, config.str_param.c_str(),
config.bool_param ? "True" : "False", config.size);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "my_node");
dynamic_reconfigure::Server<my_package::MyConfig> server;
dynamic_reconfigure::Server<my_package::MyConfig>::CallbackType f;
f = boost::bind(&callback, _1, _2);
server.setCallback(f);
ros::spin();
return 0;
}
在Python节点中,可以使用dynamic_reconfigure.server模块来处理动态参数。例如:
import rospy
from dynamic_reconfigure.server import Server
from my_package.cfg import MyConfig
def callback(config, level):
rospy.loginfo("""Reconfigure Request: {int_param}, {double_param},\
{str_param}, {bool_param}, {size}""".format(**config))
return config
if __name__ == "__main__":
rospy.init_node("my_node", anonymous=True)
srv = Server(MyConfig, callback)
rospy.spin()
五、roswtf
(一)概念
roswtf是一个用于检测ROS系统问题的工具。它可以检查节点、话题、服务等的配置和运行状态,帮助开发者发现潜在的问题。
(二)运行roswtf
在终端中输入以下命令:
roswtf
roswtf会检查当前运行的ROS系统,输出潜在的问题和建议。
六、可视化节点诊断
(一)使用rqt工具
1. 安装rqt
sudo apt-get install ros-noetic-rqt
2. 启动rqt
rqt
3. 常用插件
-
rqt_graph:显示ROS计算图,包括节点、话题、服务等的连接关系。 -
rqt_console:显示节点的日志信息。 -
rqt_plot:绘制标量数据图。 -
rqt_image_view:显示图像数据。 -
rqt_tf_tree:显示TF树结构。
七、绘制标量数据图
(一)使用rqt_plot
1. 启动rqt_plot
rqt_plot
2. 选择话题
在rqt_plot窗口中,选择要绘制的话题。例如,选择/my_topic/data,可以实时绘制该话题的标量数据。
(二)使用plotjuggler
1. 安装plotjuggler
sudo apt-get install ros-noetic-plotjuggler
2. 启动plotjuggler
plotjuggler
3. 选择话题
在plotjuggler窗口中,选择要绘制的话题,可以实时绘制该话题的标量数据,并支持多种图表类型和数据处理功能。
八、图像可视化
(一)使用rqt_image_view
1. 启动rqt_image_view
rqt_image_view
2. 选择话题
在rqt_image_view窗口中,选择要显示的图像话题。例如,选择/camera/image_raw,可以实时显示摄像头捕获的图像。
(二)使用image_view节点
1. 安装image_view
sudo apt-get install ros-noetic-image-view
2. 启动image_view节点
rosrun image_view image_view image:=/camera/image_raw
这会打开一个窗口,实时显示/camera/image_raw话题的图像数据。
九、3D可视化rviz
rviz是一个3D可视化工具,可以用于显示机器人模型、传感器数据、路径规划等。
1. 安装rviz
sudo apt-get install ros-noetic-rviz
2. 启动rviz
rviz
3. 配置显示
在rviz窗口中,可以添加多种显示类型,如PointCloud、LaserScan、RobotModel等。通过配置这些显示类型,可以实时查看3D数据。
十、保存与回放数据---rosbag工具
1. 录制数据
rosbag record /my_topic /another_topic
这会将指定话题的数据录制到一个.bag文件中。
2. 回放数据
rosbag play my_bag.bag
这会将录制的数据重新发布到ROS系统中,可以用于测试和调试。
十一、插件
(一)概念
ROS支持多种插件,用于扩展功能。插件可以是节点、库、工具等,可以通过安装和配置来使用。
(二)常用插件
1. rqt插件
rqt提供了多种插件,如rqt_graph、rqt_console、rqt_plot等,可以通过rqt的插件管理器安装和配置。
2. rviz插件
rviz支持多种插件,如rviz_plugin_tutorials,可以通过安装和配置来扩展rviz的功能。
3. rosbag插件
rosbag支持多种插件,如rosbag_filter,可以通过安装和配置来过滤和处理录制的数据。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)