本实验主要学习以下几方面的内容:
1.所需仪器设备
(1)“卓越之星”设备-用于功能调试;
(2)个人PC-用于应用程序的开发与展示;
2.注意事项
(1)个人PC需要安装NoMachine或者VSCode支持远程编程开发;
(2)运动实验尽可能将设备平放在地面上;
(3)实验开始前确保设备电量为满电,实验完成后关闭设备电源;
机器人程序往往非常复杂,我们往往需要对机器人的状态进行可视化的调试,观测,来确定程序运行是否异常,可以调整哪些参数来优化机器人算法程序,接下来我们就要介绍
ros 中的三大调试工具 rqt,rviz,日志。
rqt 工具集是 ROS(机器人操作系统)中的一组图形化用户界面(GUI)工具,旨在帮助开发者可视化、调试和监控 ROS
系统。这些工具提供了直观的用户界面,使得用户可以以图形化的方式与 ROS 系统进行交互。以下是 rqt 工具集的主要作用:
可视化 ROS 图(rqt_graph):rqt_graph 工具用于可视化 ROS 系统的连接图,展示 ROS 节点、主题和消息之间的关系。这有助于开发者理解系统的结构和数据流动。
实时数据可视化(rqt_plot 和 rqt_multiplot):rqt_plot 和 rqt_multiplot 工具允许用户将 ROS
主题的数据以实时图表的形式显示。这对于监控传感器数据、控制输出等非常有用,可以帮助开发者快速了解数据变化趋势。
ROS 数据包分析(rqt_bag):rqt_bag 工具用于查看和分析 ROS 数据包(bag files)。用户可以播放、暂停和回放数据包中的消息,以便调试和分析。
ROS 参数服务器操作(rqt_param):rqt_param 工具允许用户查看和修改 ROS 参数服务器中的参数。这使得用户可以在运行时动态调整系统配置,而无需重新启动节点。
TF 树可视化(rqt_tf_tree):rqt_tf_tree 工具用于显示 ROS TF(变换)的树形结构。TF 树展示了不同坐标系之间的关系,对于机器人运动学和姿态控制非常重要。
ROS 服务调用(rqt_service_caller):rqt_service_caller 工具允许用户手动调用 ROS 服务。用户可以在 GUI
中输入服务请求,触发服务调用,方便测试和调试服务功能。
图像可视化(rqt_image_view):rqt_image_view 工具用于显示 ROS 图像主题的实时图像。这在计算机视觉和图像处理应用中非常有用,可以帮助开发者查看图像数据。
机器人运动控制(rqt_robot_steering):rqt_robot_steering 工具提供了一个简单的界面,允许用户控制机器人的运动,包括速度和方向。
通过这些 rqt 工具,ROS 开发者可以更轻松地与 ROS 系统进行交互,实现实时数据可视化、参数调整、数据包分析等功能,提高开发和调试效率。每个工具都针对特定的任务提供了直观的界面,使得
ROS 开发变得更加直观和高效。接下来我们将一一介绍这些调试工具。
rqt_graph 是 ROS(机器人操作系统)中的一个可视化工具,用于可视化查看 ROS 节点(Nodes)、话题(Topics)、服务(Services)等之间的关系图。它的作用包括:
查看 ROS 节点之间的通信关系,包括发布者和订阅者之间的连接。
可视化 ROS 话题的消息传递流程,以帮助理解数据的传输方式。
查看 ROS 服务之间的调用关系,以了解不同节点之间的服务调用情况。
要使用 rqt_graph,通常可以按照以下步骤进行:
启动 ROS 系统:确保你的 ROS 系统已经启动,并你的节点、话题和服务正在运行。
打开终端:打开一个终端窗口,输入以下命令以启动 rqt_graph:
rqt_graph
可视化关系图:rqt_graph 窗口会显示 ROS 系统中节点、话题和服务之间的关系图。你可以在图中查看节点之间的通信连接,话题之间的消息传递关系以及服务之间的调用关系。
交互操作:你可以通过鼠标点击来查看节点和话题的详细信息,包括节点的名称、话题的数据类型等。
通过 rqt_graph,你可以更好地理解 ROS 系统的结构和数据流,有助于调试和监视机器人系统,确保各个组件之间的通信正常运作。
这里我们启动上一章的节点,并通过 rqt_graph 观察数据流向。
rqt_plot 是 ROS 中的另一个可视化工具,它用于实时绘制 ROS 话题中的数据,以帮助用户可视化和分析传感器数据、控制命令或其他实时数据流。其主要作用包括:
实时数据可视化:rqt_plot 能够将 ROS 话题中的数值数据实时绘制成图表,如折线图或散点图。这有助于用户直观地观察数据的变化趋势。
数据分析:用户可以使用 rqt_plot 来分析传感器输出、控制命令或其他实时数据,以便调试和优化 ROS 系统。
使用 rqt_plot 通常遵循以下步骤:
启动 ROS 系统:确保你的 ROS 系统已经启动,并相关话题正在发布数据。
打开终端:打开一个终端窗口,输入以下命令以启动 rqt_plot:
rqt_plot
数据可视化:rqt_plot 窗口会实时显示所选话题中的数据,以图表的形式呈现。你可以根据需要添加多个话题进行比较和分析。
交互操作:你可以调整图表的显示参数,如坐标轴范围、颜色和标签,以更好地满足你的需求。
在上面的 Topic 选择要显示的参数:
选择要显示的消息内容:
点击右边的加号即可观察到该数值的曲线。
通过 rqt_plot,用户可以更轻松地观察和分析 ROS 话题中的实时数据,有助于机器人系统的监视和调试。
rqt_bag 是 ROS 中的工具,用于可视化和分析 ROS 数据包(ROS bag files),这些数据包包含了 ROS 系统中的消息数据。其主要作用包括:
数据回放与分析: rqt_bag 允许用户回放先前记录的 ROS 数据包,并以图形界面的形式查看和分析这些数据。这对于诊断和调试机器人系统非常有用。
消息可视化: 用户可以查看 ROS 数据包中的消息,包括各种传感器数据、状态信息等,以便更好地理解系统的运行情况。
导出数据: rqt_bag 还允许用户从 ROS 数据包中导出特定的消息数据,以便进一步分析或在其他工具中使用。
使用 rqt_bag 通常遵循以下步骤:
启动 ROS 系统: 确保你的 ROS 系统已经启动,并相关话题正在发布数据,你可以通过 roscore 启动 ROS 核心。
记录数据包: 使用 ROS 命令行工具 rosbag 记录数据包,例如:
rosbag record -a
这将记录所有正在发布的 ROS 话题数据。
这里我们录制一个 topic:/cmd_vel
rosbag record /cmd_vel
打开终端: 打开一个终端窗口,输入以下命令以启动 rqt_bag:
rqt_bag
加载数据包: 在 rqt_bag 窗口中,加载你想要分析的 ROS 数据包,可以选择并可视化感兴趣的消息数据。
数据回放和分析: 你可以回放数据,暂停、播放,以及通过图形界面查看消息数据的时间序列图:
通过 rqt_bag,用户可以更好地管理、分析和理解 ROS 系统中的消息数据,为系统调试和优化提供有力支持。
rqt_console 是 ROS(机器人操作系统)中的一个图形用户界面工具,用于查看和分析 ROS 节点的日志消息。它有助于调试和监视 ROS
系统中的节点通信和信息输出。
要使用 rqt_console,首先确保你已经安装 ROS 并启动了你的 ROS 系统。然后按照以下步骤使用 rqt_console:
打开终端并运行 ROS 主节点(如果尚未启动):
roscore
打开一个新的终端窗口,并运行 rqt_console:
rqt_console
rqt_console 窗口将打开,显示 ROS 系统中的日志消息。你可以在窗口中看到不同级别的消息,例如 INFO、WARNING、ERROR 等。
你可以使用过滤器来筛选特定节点的日志消息,或者按消息级别进行筛选。这有助于定位和解决问题。
如果你想清除日志消息,可以点击窗口底部的“Clear”按钮。
rqt_console 还提供了一些其他功能,如保存日志到文件,配置日志级别等,这些可以根据需要进行使用。
总之,rqt_console 是一个强大的工具,用于监视和调试 ROS 系统中的日志消息,有助于识别和解决潜在的问题。它是 ROS
的一部分,可帮助开发人员更轻松地管理和维护 ROS 节点。
rqt_image_view 是 ROS(机器人操作系统)中的一个图形用户界面工具,用于查看和订阅 ROS 图像话题的实时图像数据。它是一个方便的工具,用于可视化和调试图像传感器数据。
以下是如何使用 rqt_image_view 的简要介绍:
确保你已经安装 ROS 并启动了你的 ROS 系统。
打开一个终端窗口,并启动 rqt_image_view:
rqt_image_view
rqt_image_view 窗口将打开,并显示一个空白的图像显示区域。
要查看 ROS 图像话题的实时数据,你需要订阅一个图像话题。在 rqt_image_view 窗口的工具栏中左上角选择框,选择当前想查看的图像的
topic:
按下回车键或单击订阅按钮,rqt_image_view 将开始接收和显示该图像话题的实时图像数据。
你可以使用工具栏上的按钮来控制图像的缩放、保存当前图像、暂停/恢复图像流等。
如果你想查看不同的图像话题,只需在“Topic”字段中更改话题名称并重新订阅即可。
rqt_image_view 是一个非常方便的工具,特别适用于在 ROS 系统中使用图像传感器时进行调试和可视化。你可以轻松地查看实时图像数据,以确保传感器正常运行,并进行问题排查。
rqt_service_caller 是 ROS(机器人操作系统)中的一个图形用户界面工具,用于调用 ROS 服务并与 ROS 节点进行交互。ROS
服务是一种用于节点间通信的方式,允许一个节点请求另一个节点执行特定的任务或提供信息。
以下是如何使用 rqt_service_caller 的简要介绍:
确保你已经安装 ROS 并启动了你的 ROS 系统。
打开一个终端窗口,并启动 rqt_service_caller:
rosrun rqt_service_caller rqt_service_caller
rqt_service_caller 窗口将打开,显示一个用于填写服务请求的界面。
在窗口的顶部,你可以选择要调用的 ROS 服务。服务的名称通常以/节点名称/服务名称的形式表示。
在服务参数部分,你需要填写服务请求的参数。这些参数的具体值和数据类型取决于所选服务的定义。你可以在 ROS 文档中查找服务的参数说明。
填写完参数后,点击窗口底部的“Call Service”按钮,rqt_service_caller 将发送服务请求到相应的 ROS 节点。
你可以查看服务的响应以及调用的状态。如果服务请求成功,你将在界面上看到响应数据。
如果需要,你可以多次调用相同或不同的服务,以与不同节点进行交互。
rqt_service_caller 是一个用于调用 ROS 服务的强大工具,特别适用于与 ROS 系统中的不同节点进行交互,获取信息或请求执行特定任务。
rq_tf_tree 是 ROS(机器人操作系统)中的一个图形用户界面工具,用于可视化和查看 ROS 中的变换(tf)树。tf 系统用于在 ROS
中跟踪不同坐标系之间的变换关系,这对于机器人导航和传感器数据融合非常重要。
以下是如何使用 rqt_tf_tree 的简要介绍:
确保你已经安装 ROS 并启动了你的 ROS 系统。
打开一个终端窗口,并启动 rqt_tf_tree:
rosrun rqt_tf_tree rqt_tf_tree
rqt_tf_tree 窗口将打开,显示 ROS 系统中的变换树结构。
变换树以图形形式呈现,显示了不同坐标系之间的关系。你将看到坐标系之间的链接、变换关系和坐标系之间的转换。
你可以通过点击图形界面上的不同坐标系来查看其父坐标系和子坐标系,以了解它们之间的关系。
rqt_tf_tree 还提供了一些视图选项,例如不同的坐标系展开/折叠状态和坐标系之间的变换关系。
此工具允许你可视化 ROS 系统中的 tf 变换,以帮助你了解和调试坐标系之间的关系。
rqt_tf_tree 是一个有用的工具,特别适用于了解机器人系统中的坐标系变换,如机器人末端执行器相对于基座坐标系的变换,或者传感器数据相对于机器人坐标系的变换。这有助于确保机器人的导航和感知系统能够正确理解坐标系之间的关系。
Rviz(Robot Visualization)是 ROS 中的一种可视化工具,用于查看和交互式探索机器人的传感器数据、状态信息和 3D
模型。它通常用于调试和监控机器人系统。
要使用 Rviz,首先确保你已经安装 ROS,并已启动你的 ROS 工作空间。然后按照以下步骤操作:
打开终端并运行 ROS Master(如果尚未运行):
roscore
打开新的终端窗口,运行 RViz:
rosrun rviz rviz
请注意,Rviz 的使用取决于你的具体应用和机器人系统的需求,因此你可能需要在 ROS 文档和 Rviz 文档中查找更多信息,以满足你的需求。Rviz
提供了丰富的可视化功能,可以帮助你更好地理解机器人的运行状态和环境感知。
ROS 的日志系统是一个重要的工具,用于记录和管理 ROS 程序的输出信息,以帮助调试和跟踪问题。ROS 使用一种称为 ROS
日志系统的灵活方式来实现日志记录。下面是关于 ROS 日志系统的一些重要信息:
ROS Log Messages(ROS 日志消息): 在 ROS 中,你可以使用 ROS 提供的 C++或 Python 库函数来记录日志消息。例如,在
C++中,你可以使用ROS_INFO、ROS_WARN、ROS_ERROR等宏来发布不同级别的日志消息。在 Python 中,你可以使用rospy.loginfo()
、rospy.logwarn()、rospy.logerror()等函数。
ROS Log Output(ROS 日志输出): 默认情况下,ROS
会将日志消息输出到终端。你可以使用rosout节点查看日志消息。另外,你可以将日志消息记录到日志文件,以便后续分析。要记录到文件,你可以使用参数服务器设置log_file参数。
ROS Log Analysis(ROS 日志分析): 针对大规模和分布式 ROS 系统,可以使用工具来分析和可视化日志数据,以便快速识别问题和瓶颈,例如我们前面提到的
rqt_console 就是很好的日志分析工具。
总之,ROS 日志系统是一个强大的工具,可以帮助开发人员跟踪程序的运行状态,诊断问题和调试 ROS
应用程序。通过合理使用不同的日志级别和配置选项,你可以有效地管理和分析 ROS 日志信息。
这里,我们展示一下打印不同等级 ROS 日志的 C++代码:
#include <ros/ros.h>
int main(int argc, char** argv) {
// 初始化ROS节点
ros::init(argc, argv, "ros_logging_example");
// 创建ROS节点句柄
ros::NodeHandle nh;
// 打印不同级别的日志消息
ROS_DEBUG("This is a DEBUG message.");
ROS_INFO("This is an INFO message.");
ROS_WARN("This is a WARNING message.");
ROS_ERROR("This is an ERROR message.");
ROS_FATAL("This is a FATAL message.");
// 运行ROS事件循环
ros::spin();
return 0;
}
打印不同等级 ROS 日志的 python 代码:
#!/usr/bin/env python3
import rospy
if __name__ == '__main__':
# 初始化ROS节点
rospy.init_node('ros_logging_example')
# 打印不同级别的日志消息
rospy.logdebug("This is a DEBUG message.")
rospy.loginfo("This is an INFO message.")
rospy.logwarn("This is a WARNING message.")
rospy.logerr("This is an ERROR message.")
rospy.logfatal("This is a FATAL message.")
# 运行ROS事件循环
rospy.spin()
运行效果如下图所示:
glog(Google Logging Library)是由 Google 开发的 C++日志库,用于记录日志信息和跟踪程序执行。它旨在提供高效的日志记录和灵活的日志配置,使开发人员能够更好地管理和调试他们的
C++应用程序。以下是关于 glog 的一些重要信息:
要在你的 C++应用程序中使用 glog,首先需要安装 glog 库并包含其头文件。然后,你可以使用google::InitGoogleLogging(argv[0])来初始化
glog,并使用LOG(INFO)、LOG(WARNING)、LOG(ERROR)和LOG(FATAL)等宏来记录日志消息。配置文件可以用于自定义日志记录行为。
总之,glog 是一个功能强大的 C++日志库,特别适用于需要高效、灵活和可配置的日志记录的应用程序。它提供了丰富的功能,可帮助你更好地管理和调试
C++代码。
以下是一个创造 glog 节点的 C++程序:
#include <glog/logging.h>
#include <iostream>
#include <sys/stat.h>
inline void mkdirs(const char *dir) {
int i, len;
char str[100];
strcpy(str, dir);//缓存文件路径
len = strlen(str);
for (i = 0; i < len; i++) {
if (str[i] == '/') {
str[i] = '\0';
if (access(str, 0) != 0)
mkdir(str, S_IRWXU | S_IRWXG | S_IRWXO);
str[i] = '/';
}
}
if (len > 0 && access(str, 0) != 0)//检测是否创建成功
mkdir(str, S_IRWXU | S_IRWXG | S_IRWXO);
}
inline void initLog(char *const *argv) {
//替换成指定文件夹
std::string logDirStr = "/home/zhuoyuezhixing/LOG";
mkdirs(logDirStr.c_str());
FLAGS_logtostderr = false; //设置日志消息是否转到标准输出而不是日志文件(false)
FLAGS_stderrthreshold = google::ERROR;//严重性级别在该门限值以上的日志信息除了写入日志文件以外,还要输出到stderr。
// 各严重性级别对应的数值:INFO—0,WARNING—1,ERROR—2,FATAL—3 默认值为2.
FLAGS_minloglevel = google::INFO; //严重性级别在该门限值以上的日志信息才进行记录。默认值为0.
FLAGS_log_dir = logDirStr; //设置日志文件保存目录,这个目录必须是已经存在的,否则不能生成日志文件.
FLAGS_log_prefix = true; //设置日志前缀是否应该添加到每行输出
FLAGS_logbufsecs = 0; //设置可以缓冲日志的最大秒数,0指实时输出
FLAGS_max_log_size = 10; //设置最大日志文件大小(以MB为单位)
FLAGS_stop_logging_if_full_disk = true; //设置是否在磁盘已满时避免日志记录到磁盘
google::InitGoogleLogging(argv[0]); // 全局初始化glog,argv[0]是程序名
google::SetStderrLogging(google::GLOG_INFO);// 设置glog的输出级别,这里的含义是输出INFO级别以上的信息
google::SetLogDestination(google::GLOG_INFO, std::string(logDirStr + "/info_back_charge").c_str());
google::SetLogDestination(google::GLOG_WARNING, std::string(logDirStr + "/warn_back_charge").c_str());
google::SetLogDestination(google::GLOG_ERROR, std::string(logDirStr + "/error_back_charge").c_str());
FLAGS_colorlogtostderr = true;// 开启终端颜色区分
}
int main(int argc, char **argv)
{
initLog(argv);
return 0;
}