谢丫丫

如何使用自动碰撞检测保护您的机器人?

0
阅读(33) 评论(0)

在本文中,我们将开发并测试一种算法,用于响应碰撞(或其他一些暴力事件)自动关闭机器人。

为什么?

你的机器人迟早会撞到什么东西。它可能会从您的工作台上飞出,因为在您打开电源开关之前忘记在其下方放置一个挡块。这可能是一个错误的转弯,并走下楼梯。但在我看来,更简单的编程错误或通信故障将导致机器人在应该停止后继续移动,从而导致与墙壁,门或其他固体物体的意外遭遇。

这篇文章肯定没有提供防止冲突的方法; 这将需要一种能够检测快速接近物体存在的传感器。目标是检测碰撞,即使机器人能够意识到发生了坏事,然后采取适当的行动。

自动响应可以是发送求救信号,禁用电源,或启动试图评估损坏性质的自检程序。但是,在本文中,我们将保持简单:如果检测到碰撞,机器人将停止电机。这至少避免了混乱或受伤或半毁的机器人继续高速抚摸直到找到另一个固体物体或者加剧初始碰撞中遭受的损害的情况。

我们需要两篇文章才能完全解决这个问题。这篇当前文章介绍了开发过程,并为您提供了实验室测试和优化算法所需的固件。在下一篇文章中,我们将尝试收集真实的碰撞数据并相应地微调(或大修)算法,最终的固件将用于独立的机器人操作。

 

怎样做?

我们将使用Romi机器人底盘和定制设计的Romi控制板,其中包括一个三轴加速度计。

 

 

毫无疑问,碰撞涉及显着的加速(特别是减速)。因此,通过适当的信号处理,我们可以使用加速度计数据来检测碰撞事件,然后微控制器可以停止电机。

从理论上讲,破坏性事件可能来自任何方向,特别是如果你的机器人将受到其中一种竞赛的影响,在这些竞赛中,人们制造机器,成为安全地表达人类相互攻击和杀戮的长期趋势的工具。但是,在这个项目中,我们假设碰撞总是由一个前移机器人直接撞到一个固体物体组成。这意味着加速度将反方向,(如本文所述)对应于加速度计的正x轴。

 

模数转换

我们将使用EFM8微控制器的内部14位ADC对模拟加速度信号进行数字化处理。这是配置:

 

 

  • 采样率为1 kHz,显着高于加速度计信号的带宽(~200 Hz)。

  • 由于我们只关注上述碰撞类型,我们忽略了z轴和y轴; ADC输入信号始终是x轴输出,连接到P1.7。

 

 

  • 我们将使用ADC的自动累加和除法功能。这是一种降低噪音的简单方法,希望能够更轻松地识别低振幅加速度事件。每个转换触发器将产生四个ADC样本; 将它们加在一起,然后向右移动两位(相当于除以4)。

 

收集数据

我用我的自定义串口采集应用,这是讨论收集的测试数据在这里  的“YAT和Excel”部分。但是,当前版本得到了极大的改进:它现在可以发送ASCII命令,并且它有多个要发送的文本框,因此只需单击即可使用常用命令ICfans

 

 

此代码摘录为您提供与三字母ASCII命令关联的功能:

 

image.png

 

让我们来看看一些数据

我用我的手产生了一个向后加速的事件,希望它可以与碰撞引起的快速减速相提并论。(该技术在第一个视频中进行了演示。)

这是三个数据集:

 

 

 

 

我把这些波形放在一起,并确定了它们共有的两个特征:

  • 加速度信号迅速超过1660 mV,这也明显高于本底噪声。

  • 它们都保持高斜率,直到至少1670 mV。

因此,我围绕这两个值构建了算法:检测算法在ADC样本超过1660 mV(= 11332 ADC计数)时开始。然后等待在一定时间内信号是否超过1670 mV(= 11401计数); 时间到秒阈值限制基于这三个波形中看到的初始上升沿的斜率。

 

问题方案

我很快发现我的第一个算法是完全失败:机器人底盘正面的轻敲被识别为碰撞事件。事实证明,轻型水龙头产生类似于此的加速度曲线:

 

 

振幅非常高,但持续时间非常短。我意识到我需要结合最小持续时间条件:如果加速度过早地低于第一个阈值,则忽略该事件。我将最小持续时间(从第二阈值交叉点开始)设置为30个样本,即30 ms。这比模拟碰撞事件的从第二阈值(上升)到第一阈值(下降)的典型持续时间短,但是它似乎始终长于由敲击事件产生的尖峰的相应持续时间。

以下视频显示了修订算法的一些初步成功。绿色LED指示碰撞检测已激活,红色LED在识别出碰撞信号后立即亮起。正如您在视频中看到的那样,成功忽略了点击并正确识别了模拟碰撞。

 


禁用与制动

如果查看代码,您将看到我使用函数BrakeMotors()来响应碰撞事件。在这种情况下,尽可能快地停止机器人非常重要,因此我们使用MAX14870的制动模式而不是简单地禁用电机:

 

来自MAX14870 数据表


固件


评论和描述性标识符将帮助您了解正在发生的事情。

请注意,冲突检测算法位于ADC0WC(WC =“窗口比较”)中断服务程序中(在“Interrupts.c”源文件中)。您可以在EFM8LB1参考手册中阅读有关窗口比较功能的更多信息。这是一个方便的功能,因为它允许自动进行初始阈值检测,即CPU不必将ADC样本与阈值进行比较或执行与ADC转换相关的任何其他操作。ADC独立工作,在采样值超过第一个阈值之前根本不会打扰处理器。

 

结论

我们开发了一种碰撞检测算法,并确认它能够正确识别模拟的碰撞事件。它还可以忽略由于快速的局部冲击(即抽头)而产生的高振幅,短持续时间的加速度信号。下一步是从实际冲突中收集数据并测试功能。