带ROS的OMower,第一步

最初,OMower是为简单的pfodApp和Modbus控制界面设计的。 第一个是高级文本协议,在该协议中传输菜单和控制命令,第二个是该应用程序中众所周知的但不是很方便的东西,因为它需要控制程序不断地``手动''轮询所有使用的传感器的状态。 因此,决定逐步切换到ROS(机器人OS),这是一种用于控制各种机器人的广泛使用的框架。





目前,ROS支持尚处于起步阶段,仅包括来自传感器的简单数组形式的信息传输(不使用许多ROS库提供的专用消息格式),调试日志以及pfodApp / Modbus格式的命令控制流使用标准的ROS工具真正控制机器人。 也就是说,为了从其位置移开机器人或更改机器人的任何内部设置,您将需要以pfodApp格式发送文本命令。 但是,即使是以这种截断的形式,您也可以轻松地广播和记录机器人的活动,在标准ROS(rviz)工具中可视化它的运动,并为其他功能添加服务。 例如,这样的机会可以沿omower_seeker.py提供的视觉模板(棋盘)的方向骑行,以准确到达停车场。

图片显示了机器人中的数据流。 主要的ROS服务在Orange PI Zero上执行,并固定在机器人板上的特殊插槽中(在测试机上,使用Raspberry PI3,以类似的方式连接-通过串行端口)。 机器人通过rosserial接口将来自传感器的消息(例如/ imu /方向或/电机/ PWM),文本的调试日志以及pfodApp或Modbus格式的菜单/消息输出到ROS内核,从而接收文本命令或Modbus流-查询。 相机还提供了另外两个Raspberry PI Zero相机附带的图像流,但是正如实践所示,使用此方案无法正常同步处理立体图像(质量在下图中可见),因此普通立体相机将很快被替换。

OMower中的ROS集成程度将逐步提高,直至可以完全访问机器人的所有内部变量,并可以通过标准ROS工具(例如指定所需速度的cmd_vel消息)对其进行管理。



我将告诉您有关omower_seeker.py模块的更多信息,作为使用ROS向OMower添加函数的示例。 它的目的非常简单-朝棋盘方向前进,实时调整路线。 此功能将用于将割草机驱动到停车站,在停车站中它可以为电池快速充电。 分析来自其中一台摄像机的图像后,该模块将计算两个角度(电路板与摄像机中心的偏离角度以及电路板本身相对于垂直线的旋转角度)并将其作为文本命令传输到内部搜寻器模块(OMower SDK中的omower-seeker.h / cpp)。



从表面上看,这似乎是一个相当简单的任务,但是在现实生活中存在一个严重的问题-内置在机器人中的微型计算机上图像处理的速度。 如实践所示,使用相对较低功率的Orange PI和Raspberry Pi时,在图像中的opencv中搜索图案的速度非常低且不稳定,在640x480的分辨率下需要数十到数百毫秒的时间,这在驾驶过程中会偏离必要的路线,因为机器人即使速度很慢,在这段时间内仍能设法转弯较大角度或行驶较大距离。 实际上,这就是为什么选择具有最少单元格的棋盘的原因,因为其他模式需要更多时间。

为了补偿视觉模板的较长搜索时间,使用了指南针方案-机器人微控制器每100毫秒存储一次其值,在后半秒存储5个样本(较长的分析被简单地丢弃了,因为它们对于精确导航几乎没有用)。 使用保存的罗盘值(从搜索时间起算不超过100毫秒),将从omower_seeker.py计算出的角度(该角度还将模板搜索时间传输到微控制器)重新计算为实际旋转角度,并且机器人沿该角度行进。 这使您或多或少地准确地沿棋盘方向直线走。 或者,如果它相对于垂直线稍微旋转-沿着一条修正接近角的弧线使其尽可能接近模板的轴,因为我们不仅需要向上驱动到板子,还需要进入导轨并连接到充电触点。

到达车站的完整算法分为三个阶段。 在GPS字段上设置了两个点-起点(工作区域中间的某个位置),测站前方的点以及与测站的旋转角度。 机器人从起点到达第二个位置并朝工作站处的棋盘方向旋转至所需角度后,搜索器模块开始工作,通过PID控制器调整电动机的速度。 如果任何一个步骤失败,或者偏差角度超过设定值,则机器人取消比赛并再次返回到起点。

链接和视频:

OMower SDK,Arduino IDE库和电路板布局
使用实现pfodApp / Modbus并连接到ROS的SDK的现成固件
ROS的omower_gateway软件包



Source: https://habr.com/ru/post/zh-CN434952/


All Articles