构建一个拥有端到端自主绘图系统的机器人
扫描二维码
随时随地手机看文章
这个项目构成了伊利诺伊大学厄巴纳-香槟分校ME461:机械系统计算机控制的最终产品。该项目的主要课题是一个多用途机器人,配备了机载传感器,包括轮式编码器、IMU距离传感器等,以及德州仪器的F28379D发射台板,更大的项目目标是使用机器人完成给定的任务,或使用传感器和控制器来设计新型机器人功能。
对于我们的项目,我们选择开发一个移动绘图机器人,能够将简单的用户生成的图像转换为纸上的物理绘图。利用OpenCV实现了一个图像处理流水线,从输入图形中提取基于边缘的轮廓,并将其离散为有序的二维点集。这些点通过LabVIEW接口传递给机器人,该接口实时传输航路点数据和控制标志。在机载系统中,机器人利用轮式编码器反馈和机载陀螺仪跟踪其位置和航向,并使用点跟踪控制算法生成前进速度和转弯速率命令,以驱动机器人到达每个航路点。设计并集成了一个伺服驱动的笔机构,可以在绘制笔画之间升降标记,从而清晰地再现单个轮廓或线条。
总的来说,这个项目在ME461机器人的可编程动力学和实际用户输入之间建立了一个新的联系。它展示了即使只有一小部分传感器,也可以将不像编写代码本身的简单输入转录成机器人的有用指令,从而可以执行强大的现实世界任务。
Python图像处理
为了将数字绘制的图像转换为ME 461机器人的点集,我们使用OpenCV, Scikit-image和Numpy(以及用于可视化的Matplotlib)。使用img_to_stroke_points()函数,用户输入图像的文件路径、每个组件(路径)所需的路径数以及最小路径长度。然后脚本使用OpenCV读取图像,并额外应用Otsu灰度滤波器。这将使用Scikit-image skeleton()函数对要进行骨架化的图像进行预处理。skeleton()函数从灰度图像中创建一个1像素宽边缘的外推图,其中每个边缘是机器人要遵循的一组点(或路径)。创建点之后,将创建一个3D numpy张量(使用np.array()数据结构)。张量的形状如下:[(边/路径的数量)x(每条路径的点数)x 2 (x, y)]。该脚本还以可复制粘贴的格式打印张量。下面是一个将MS Paint星形转换为一组点的示例。
虚拟仪器实现
LabVIEW VI使用Python节点接收张量。然后,它开始使用TCPIP通信与机器人通信。它还通过嵌套的for循环开始迭代Python数组中所有轮廓(路径/边)中的所有点。每次机器人发送一个信号,表示它已经准备好进入下一个点,发送按钮就会被激活,这样用户就可以点击发送下一个点以及笔的“状态”,并且for循环会增加到下一个点。笔状态(向上[0]或向下[1])由LabVIEW通过检查下一个点是否是新路径/边的开始来确定。如果是,则将笔状态设置为抬起笔。否则,将笔状态设置为降低笔。
在前面板上,用户可以看到回路中的哪个点即将被发送给机器人(X坐标,Y坐标),笔的状态(笔值/笔状态),以及机器人的当前位置(X, Y),在坐标和视觉上都是绘图中的一个框。为了确认和调试的目的,显示了轮廓的数量和每个轮廓的点的数量。
路径算法
能够重建全尺寸绘制图像的软件管道的最后一段是ME461机器人本身的动态和航路点算法。控制机器人的软件集成了实时传感、状态估计、通信和运动控制,了解其当前位置,向下一个位置移动,并根据这些运动及时驱动绘图器具。
整个航路点算法是UIUC系统工程课程中现有脚本的修改版本。为了方便地与Python-OpenCV图像处理的输出接口,waypoint following被实现为一个顺序的点对点控制方法。目标坐标从LabVIEW流化并存储为控制器的活动目标。在每次控制更新时,机器人计算其当前位置与目标航路点之间的相对位置,从而提供到目标的距离和期望的前进方向。控制器产生正向速度指令,该正向速度指令随距离减小而减小(随距离增大而增大),并受饱和限制,以保证安全运行和减少超调。一个单独的转弯率命令调整机器人朝着目标方向前进。前进运动减少或暂停时,航向误差大,以防止横向漂移。一旦机器人进入指定的位置公差,就认为到达了一个航路点,之后控制器前进到下一个目标。这种方法使机器人能够可靠地沿着单个路径点和封闭路径进行平滑和可预测的运动。下图展示了主动态函数内部控制逻辑的摘录;它包括上述公差的定义和机器人接近最终目的地时发生的修改动力学。
机器人软件实现了一个简单的状态机来管理它从一个路径点移动到另一个路径点的行为。LabVIEW作为一个外部接口,传输航路点坐标并监控机器人状态,但排序和决策逻辑驻留在嵌入式控制器上。机器人一次处理一个航路点,将接收到的目标存储为活动目标,并执行闭环控制,直到检测到最后一个航路点。机器人的状态转换决定了何时接受新的航路点,何时启用运动,以及何时控制器前进到下一个目标。这种一次一点的结构简化了LabVIEW和机器人之间的协调,防止遗漏或乱序命令,并确保简单和复杂路径的可靠执行。下面的图像演示了用于启动路径点之间的移动以及笔移动的简单状态机控制流。
硬件的修改
我们设计了一个简单的3d打印支架,安装在机器人的前面,并将伺服装置固定在适当的位置。支架定位伺服器,使标记接触纸在前轮之间的中心点。
使用HS-311伺服器驱动标记。伺服旋转以提升和降低笔,提供绘图和非绘图运动之间的干净转换。之所以选择这种伺服装置,是因为它在实验室中很容易获得,并为这种应用提供了足够的扭矩。
扭力弹簧直接安装在伺服输出上,标记用拉链系在弹簧上。这创造了一个兼容的笔架,允许标记保持与纸接触,同时吸收由纹理实验室地板引起的小高度变化。扭转弹簧提供轻的、一致的向下的力,而不会增加过多的摩擦,这有助于防止机器人抬起或车轮打滑。拉链连接使不同的笔或标记之间的交换和微调性能变得容易。
设计的挑战
在开发这个项目的过程中,我们遇到了无数的设计挑战,这些挑战促使我们对软件管道的每个维度进行细化。第一个也是最重要的挑战涉及收紧航点公差,也就是说,机器人在决定向LabVIEW指示它准备好接受下一个命令之前到达目标目的地的精度。为了做到这一点,我们修改了目标点的径向距离,在这一点上,控制输入的前进和转向运动被减少到更大,并缩小了机器人需要达到的半径,以便认为自己已经到达了一个航路点。最终,这两种变化都是实现机器人对许多点的精确控制的核心;这些变化的净效果是更缓慢、更深思熟虑的动作。虽然这降低了机器人穿越航路点的速度,但它大大提高了精度,允许绘制封闭曲线,并在绘制多个连接组件时最小化漂移。
我们面临的另一个设计挑战涉及到图像分辨率,也就是说,我们为给定的输入笔画生成的路径点的数量。如果绘制的图像的笔画宽度太粗,或者如果我们允许python脚本生成的点网格过于密集,那么机器人可能必须遍历到许多邻接点。机器人的最终路径将是一系列急转弯或过多的点,这将花费机器人太长时间来跟踪。为了解决这个问题,我们将每个轮廓的点数量限制在一个合理的值,并在连接的组件之间进行标准化。虽然这在理论上限制了我们图像的实际分辨率,但它确保了更精简的软件工作流程,并最终从机器人产生更可靠的绘制图像。
总的来说,我们的设计过程是高度迭代的,并且对我们软件工作流程的所有元素进行了常规更改。考虑到我们的整个过程在三个不同的步骤之间移动- python, LabVIEW和ME461机器人上的c代码,很难理解我们遇到的错误来源是由于输入处理不当还是控制器错误。为此,我们的调试过程围绕着隔离问题和探索控制器或python处理代码中单元变化的输出变化而展开。如果有更多的时间,我们会继续更新我们项目的每个元素,目标是提高绘制的图像分辨率,并为整个软件工作流提供进一步的自主权。
传感器的实现
以下视频提供了该项目中使用的传感器和执行器的简要概述。一般来说,只有车轮编码器和IMU,特别是陀螺-z值被用于传感。这个设备单独允许一个稳定的估计线性位置坐标和速度,以及通过整合车辆的偏航率的轴承。重要的是要强调如何使用轮式编码器来控制和分析线性运动和轴承变化的变化;车轮打滑使这种方法不切实际。
结论
这个项目成功地展示了一个端到端的自主绘图系统,它集成了传感、通信、控制和机械驱动。通过将基于车轮编码器的位置估计与imu派生的航向信息相结合,机器人能够在来自LabVIEW界面的路径点之间准确导航。所实现的点跟随控制器可靠地检测到路径点的到达和绘制路径的闭合。此外,伺服驱动的笔机构和柔性扭转弹簧提供了稳定和精确的绘制和非绘制运动控制,能够干净地创建单个笔画或形状轮廓。总的来说,这个项目揭示了使用实时机器人导航和控制的实际挑战和解决方案。然而,它也展示了即使是简单的机器人控制系统也能完成的功能。这个项目培养了我们在机械系统编程和设计方面的技能,是我们未来在控制设计和自主系统方面工作的跳板。
本文编译自hackster.io





