《孙子兵法·谋攻篇》:“上兵伐谋,其次伐交,其次伐兵,其下攻城;攻城之法为不得已。”
任何发生在自己国土上的战争,即便胜利,也饱含屈辱。
----~~~~----Gazebo 8
使用ROS / Gazebo版本的组合
gazebo_ros_pkgs
年7月12日,由Harry JE Day发表
所以你写了最终的ROS程序:经过数千行代码,你的机器人终将达到感觉,带来奇点!
一个接一个地启动你的节点。每一个使启示录越来越近。你输入最后一个命令。和。而且什么也没有。什么地方出了错?你会怎么找到,永远挤压那个妨碍你胜利的时刻的错误?这个博客试图回答这些问题,更多*。
在BLUEsat中,我们已经有了我们分享复杂的ROS调试问题。当您通过竞争任务中途进行时,最好的时间会发生,随着时间的推移。虽然这篇文章还会在较短的时间内看看更常见的调试情况,并且易发生火灾的环境**。
以下是我们成功部署以调试ROS环境的几种工具和技术。
保持冷静和火焰!
你以前可能已经听过这个消息,但是在调试时不重要的结论或者您没有正确测试的修复程序非常重要。例如,Google有一个策略,可以回滚其服务上的更改,而不是尝试推送修复。一个类似的想法适用于竞争或时间压力的情况:确保你已经想到通过这个补丁,从你的机器人删除“不要杀人”的安全!话虽如此,不幸的是,回滚不太可能适用于竞争情况,也不可能将您刚才在机器人上启动的火灾推迟。所以我们不能只是复制谷歌,但我们应该考虑一下我们在做什么。
基本上,在这种情况下您应用的任何修补程序或配置修复程序都是计算出的风险,您应该确保在做某些事情之前了解这些风险。在去年的欧洲巡回赛挑战赛中,我发现可以调整小型设置,重启某些节点,重新校准系统; 但是由于建立通信所需的时间,在任务期间强制循环流动站太危险了。同样重新启动我们的驱动系统或摄像机对我们的飞行员来说是非常具有破坏性的,所以只能在某些情况下完成,在这种情况下,通过不修复系统造成的损坏可能会更糟。话虽如此,在关键的摄像机失败后,我们试图以编程方式对该设备进行电源循环 - 这个决定是指摄像机足够重要,可以尝试这样一个危险的举动。
在非时间压力的情况下,您可以更灵活。可以测试不同的选项,看看它们是否工作。这是因为它们不会损坏您的机器人。然而,结构化的方法通常对于那些更复杂的错误是有益的。我经常发现,当我调试间歇性或难以检测到的问题,很容易就会失去跟踪我尝试过的结果,或者得到结果。我发现一个非常有用的技术是记录我在做什么,就像我所做的那样,特别是如果问题包括传感器数据。
基本上主要的一点也是保持头脑清晰,并在行动之前考虑后果。了解风险,并准备好您的E-Stop按钮!现在看看可以用来帮助你调试的一些工具。
抓住你的RQT
方便的“ rqt ”工具是ROS调试器的瑞士军刀。在时间压力和非时间压力的调试中,它节省了很多次。在2016年欧洲巡回赛挑战赛中,我是在调试台的不间断的伙伴,提供了许多有用的见解和许多有用的诊断数据。(一个标准的BLUEsat漫游者驾驶人员由驾驶漫游者的飞行员组成,一名副驾驶 - 跟踪任务目标,飞行员位置,并管理飞行员的通讯;以及一个调试器,用于监视流动站的状态软件和管理不同运行的ROS节点)。
RQT使用终端中的“rqt”命令运行,并且包含可通过插件菜单加载的一系列小部件 。下面我将简要介绍一些必须有用的小部件。
节点图
RQT的第一个工具是节点图。此小部件将您的ROS图中的所有节点描绘为椭圆形,并将所有主题作为正方形。方向箭头表示哪些节点正在广告或订阅主题。您还可以选择仅显示当前连接到发布者和订户(活动)的主题,或仅显示节点而不显示主题信息。
当我开始调试ROS问题时,节点图是我看到的第一件事情之一。一目了然,我可以看到哪些节点正在运行,如果两个节点正确连接。令人惊讶的是,ROS问题的频率可以像没有运行的节点一样简单(或者当不应该运行时)。该图还允许我们看到节点是否正确连接 - 拼写错误的主题名称当然不会在代码中跳出来,但它在图表中直接显示为缺少的一个链接。
主题监视器
如果我们使用节点图找不到我们的问题,那么 下一个小部件通常会有帮助。该主题监视器 是较年轻,更好地组织同级rostopic回声命令行工具。它显示所有当前广告主题的列表,并允许您监视它们。除了每个主题都是一个复选框,当选中订阅我们的主题,显示其完整的输出以及它使用的带宽和发布的频率。
这对于检查正确的信息是否正在通过您的ROS网络而言非常有用,而无需在所有节点中添加ROS_INFO调试。在BLUEtongue Rover上,我们发布了大量的诊断信息作为ROS主题(这里有一点更多)。其中一些用于通过GUI向我们的飞行员提供信息,但如果我们需要了解细节,那么RQT可以提供大量丰富的信息。
除了诊断信息之外,主题监视器可用于查找网络中的问题。一个常见的情况是没有实际发布任何消息的节点 - 在这种情况下,它可能无法正确连接,您应该查看ROSWTF部分。您还可以看到节点是否发布错误的消息类型,或者是否有任何值不正确。
最后,您还可以使用主题监视器来识别潜在的带宽问题,尽管您应该记住,在这样做时,rqt将会订阅主题本身,这可能会加剧问题。
消息发布者
RQT Message Publisher是 主题监视器的 邪恶双胞胎。顾名思义,它允许您发布消息,为命令行rostopic pub命令提供非常相似的功能 - 您可以选择主题,消息类型和频率,然后输入要发送的数据。然而,它还提供了一些额外的视觉辅助工具来加快调试过程。
首先,它预先填充主题列表和相应的类型列表,使您可以快速发布到当前在网络中的任何用户。这可以是压力下的救生员,并且阻止您不断提醒自己,如果该cmd_vel消息是geometry_msgs / Twist 或geometry_msgs / TwistStamped。
一旦您选择了消息类型,它还将显示该消息的字段,使其更简单地填写这些更复杂的消息。它还记住以前发送的消息,允许您快速重新发送。如果您需要执行类似发送特定消息集的操作,或者在事件发生后快速启用消息,这可能会很好。
最后,如果您是高级用户或需要发送更复杂的消息,则可以在“表达式”字段中输入有效的python表达式,而不是实际值。这包括时间,数学或随机模块中的任何方法。此外,它还为您提供自动计数器i(请参阅上述图像的示例)。
TF树
我将在RQT调试工具中讨论的最后一个工具是TF Tree。如果您使用ROS的变换系统,该工具很有用 ,如果您不想跳过本节。
TF树显示您的变换的连接结构,以及哪个节点发布给定的帧,最后一次更新,以及系统中最旧的变换。
我用过的最好的用法是检测图中的差距。例如,如果您没有向joint_state发布任何关于它的信息,那么ROS的robot_state_publisher将不会发布非固定联合的转换 ,这可能导致无法访问的转换。如果发生这种情况,最好的方法往往是返回并检查以确保要发布的任何节点正在正常运行。通过查看平均速率和 最近的变换值来识别转换超时的原因也很有用。
找到自己与RViz
RQT是一个非常有用的日常调试工具,但是如果您正在处理非常可视化的信息,例如点云或软件认为机器人的不同部分,那么需要更强大的功能。那就是RViz进入的地方,它是一个3D场景,您可以在其中可视化不同类型的ROS数据。除了URDF机器人模型,RViz还支持点云,占用网格等等。基本上如果您想要可视化的主题是ros-desktop的一部分,那么您可以在RViz中看到它。(注意:如果您真的想使用RQT,您可以使用RViz作为RQT插件)。
RViz实际上在ROS Wiki上有一些合理的教程,所以我只是在这里给出悬崖的笔记。RViz的关键特性是能够加载不同的ROS消息,并相对于彼此进行可视化。如果您尝试调试与本地化或自动化相关的任何操作,如果您的机器人认为它在错误的地方或传感器数据有问题,您可以快速解决问题,这很有用。作为RViz多功能性的一个例子,我们在2016年欧洲巡回赛挑战赛的“盲人导航”任务中利用它来显示相对于流动站估计位置的单个LIDAR数据平面(在该任务中禁止摄像机进给或全3D传感器可视化) )。我们还广泛使用它来调试LIDAR传感器输入(见下文)和各种SLAM解决方案。
ROSWTF!
如果你有奇怪的连接问题或节点,否则似乎正常工作,那么roswtf工具就是你的家伙/ gal。基本上,ROSWTF旨在成为您一站式商店,用于识别您的ROS系统中的问题,尽管我的经验是不完整的。然而,它真正的好处是检测您的ROS网络的任何设置或网络问题。
一个这样的问题是您的ROS网络上的机器无法识别对方的主机名。如果您没有像DHCP或DNS在机器之间共享这些东西,或者您的计算机的DNS名称与本地程序认为您的主机名不匹配,则可能会发生这种情况。这是一个难以检测的问题,因为节点通常会连接并正常运行,直到他们尝试与其他机器上的节点通信为止。ROSWTF会发现这很难找到问题。
在大多数情况下,有两种方法来解决这个问题,第一种是将本地机器的ROS_HOST环境变量配置为其IP地址,第二种是修复主机名解析,使机器可以找到对方。后者可以通过在/ etc / hosts文件中添加条目 或更新本地DNS服务器来完成。在BLUEsat中,我们倾向于使用环境变量选项作为我们的网络设置通常意味着我们不使用DHCP,并且拥有主机知道自己的ip意味着我们不必在我们的网络中的每台机器上更新 / etc / hosts 添加一个新的主机。
roswtf 可以检测到的其他问题 是:配置错误的ROS_MASTER节点,实际网络问题和ros启动文件配置问题。如果一切都看起来应该是工作,但不是, roswtf 是工作的工具!
用GDB和Valgrind深入挖掘
不用说,如果你已经经历了其他步骤,你的机器人还在着火,你可能没有太多的机器人。GDB和Valgrind是最适合初始测试和开发的工具,但是当您的机器人 不起火时,它们非常有用。
这两个工具本身都是主题,我建议您阅读有关各个工具(gdb,valgrind)的完整教程,以便更好地了解它们。在这里,我们将主要介绍如何在ROS环境中使用这两种工具。
为了有效地使用这些工具之一,您必须首先使用调试符号重新编译代码。这允许工具向您提供有关行号的信息,以及可能发生错误的代码片段。要重新编译启用了调试符号的catkin工作区,您可以运行以下命令。
1 2 | $ catkin_make -DCMAKE_BUILD_TYPE=Debug [Catkin Output Goes Here] |
第二个难题实际上是找到可执行文件来运行它,使用gdb或valgrind(不幸的是你不能在rosrun上运行gdb)。如果您位于catkin工作区的根目录,那么可执行文件应位于 devel / lib / <ros package name> / <node name>中。这意味着您可以使用以下命令使用gdb运行节点:
1 | $ gdb devel /lib/ [ros_package_name]/[node_name] |
然后,您可以按照gdb中的正常方式逐步执行程序。同样,您可以使用以下命令运行valgrind:
1 | $ valgrind --leak-check= yes devel /lib/ [ros_package_name]/[node_name] |
我发现当我试图调试segfaults,奇怪的输出或意想不到的行为时,我倾向于使用gdb; 而我几乎专门使用valgrind来查找内存泄漏和数组溢出。它们是调试C ++代码的关键工具,我强烈建议您阅读更多关于它们!
现在去获得这个奇点!
所有这些工具在我在BLUEsat期间对我来说非常有用,特别是在欧洲漫游挑战赛的任务中。我希望您下次尝试创建奇点时,甚至当您正在调试正常的ROS代码时,您会发现它们有帮助。如果没有,这里只是用很多这些工具刮掉了你可以做的事情,我鼓励读者对所有这些工具进行更深入的实验和深入探讨!
* BLUEsat UNSW及其成员(大多数)不赞同启发启示,并且对由于启示相关调试而可能发生的任何死亡或全球范围的灾难承担全部责任。
** 本文中的调试技巧不能在火灾中保证应用安全。BLUEsat建议自由使用E-Stop系统。
----~~~~----
ROS VSCode扩展这Visual Studio代码(VSCode)扩展提供支持机器人操作系统(ROS) 入门当您打开一个catkin工作区或一个catkin工作区内的文件夹时,扩展名将自动启动。 要启动ROS主机,请使用“ROS:启动核心”命令。左下角的“ROS主站”指示灯将显示 首次打开工作区时,扩展将自动创建 特征
命令
|
ROS Summer School 2017 挑战赛
团队介绍
- 队名: STAR Robot
- 单位: 上海科技大学自动化与机器人中心
- 成员: 陈宏宇, 旷皓飞, 龙肖灵
实验环境
硬件平台:
- Turtlebot 2(Kinect相机需要面向地面安装)
- PC(i7处理器, 8G内存)(PC的性能影响图像处理的效率)
软件环境:
- Ubuntu 14.04
- ROS Indigo
- Python 2.7, OpenCV2.4.8
Python以及OpenCV环境配置
Python环境:Ubuntu 14.04 已预装了Python2.7
安装OpenCV:
- 软件源安装:
sudo apt-get install python-numpy sudo apt-get install python-opencv
也可使用pip或anaconda安装。
- 源码安装:到OpenCV官网下载所需的版本, 按照其教程来安装。
IDE配置:
- PyCharm:到PyCharm官网下载,按照其教程来安装
- 配置PyCharm:详见ROS wiki IDEs
算法简介
Step 1 导入相机数据
- 读取相机数据: 通过rospy订阅 '/camera/rgb/image_raw' 这一Topic:
self.image_sub = rospy.Subscriber('/camera/rgb/image_raw', Image, self.image_callback)
- 在回调函数里,利用cv_bridge将每一帧图像转换为opencv格式的图片:
image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
Step 2 图像预处理
- 将原始图像转换为hsv图像
- 提取所需的颜色,将图像转换为二值图像
- 利用中值滤波和腐蚀来去除噪点
- 将处理后的图像切片,只保留相机下方某一范围内的区域
Step 3 提取关键点
- 对Step 2中产生的二值图像进行轮廓提取:
- 提取图片中的所有轮廓
- 将轮廓面积小于一定值的轮廓去除(消除了某些滤波没有清除的噪声的影响)
- 选取剩下的轮廓中面积最大的轮廓作为最终区域
- 经过上一步处理后,如果存在轮廓,取轮廓的质心作为最终所追踪的关键点
Step 4 控制
- 通过对 '/cmd_vel_mux/input/teleop' Topic发送Twist类型的消息来控制小车移动
- 如果存在关键点:利用P控制器控制小车移动(线速度为定值,角速度受error影响,error为质心的x值减去图像中线的值(Kinect是320), error所乘的比例可以调节,其决定角速度的大小)
- 如果不存在关键点: 在小车运动时,若是线离开了相机的视野(该处指对原图切片后的视野), 小车会立即停止运动,执行以下决策:
- 向某一方向旋转一定角度(根据最后一次error的正负来决定旋转的方向(error小于0,逆时针;error大于0,顺时针)),若旋转过程中检测到了关键点(即线又回到了视野内),则继续执行之前的决策; 若没有检测到,则执行2。
- 前进一段距离,停止(即到达终点或失败)。
参考资料
Programming Robots with ROS: A Practical Introduction to the Robot Operating System
我们对本书第12章中所提到的算法进行了改进,用于此次挑战赛
致谢
很感谢华东师范大学机器人运动与视觉实验室以及张新宇老师,还有暑期学校的组委会组织了此次活动。感谢GaiTech赞助了本次暑期学校的挑战赛。很高兴能与很多对机器人感兴趣的同学老师聚在一起交流学习。
由于时间较短,我们的程序还存在很多问题,如果同学老师对我们的程序有任何问题和建议,或是对我们的团队感兴趣,可以联系我们,我们的联系方式可以在我们实验室的主页上找到(上海科技大学自动化与机器人中心)
--------唯有全力以赴,方能不负此生--------