准备工作

(1)旭日X3派

本摄像头小车上位机采用旭日X3派开发板。开发环境为Ubuntu系统下的opencv-python环境。通过HDMI外接显示器实现对两个车载USB摄像头的监测与开发,进而感知周边地图环境,通过UART与下位机的通信实现对下位机的控制。

(2)Aduino Mega 2560 Pro 开发板+IO拓展板

搬运小车的下位机使用的是以开源开发板Arduino ATmega2560 为原型改进的YWRduino mega 2560 pro开发板,它可以满足搬运小车的基本设计需求。开发环境使用的是Arduino官方提供的IDE和基于VS CODE的Platform IDE。

(3)罗技C170网络摄像头

此摄像头是用于车身位置引导和视觉循迹的摄像头,对分辨率和视野范围有较为特殊的需求。使用视频流时分辨率可以达到640*480像素,每帧图像的品质最高可以达到500万像素,在视频流获取过程中可以实现自动变焦。

(4)免驱动USB摄像头

此摄像头用于颜色识别,其镜头焦距为6.0MM,调焦范围在20MM至极远之内,视像解析度为640*480。摄像头长约3.8CM,宽1.5CM,高约3CM,配有可伸缩线圈,最长可以65CM。

(5)补光灯

补光灯使用的是自行设计的双档可调补光灯,由8个发光二极管并联而成。通过GPIO口控制三极管的通断及发光二极管的通断,实现亮度调节的目的,以满足在不同的环境条件下摄像头对环境光的需求,进而提高颜色识别的精准程度。

轨道状态

(导航地图)

搬运机器人在地图上是这样一个状态

由于拍实体机器人看起来不是很生动(主要是机器人做的太丑了),为了便于生动理解原理我使用以下图片解释。搬运机器人在每次转弯以后,摄像头正对的地方都是一条长直线(生动一点解释就是以下图二)。

(模拟车身在导航线上)

当搬运机器人中轴线跟导航线中轴线刚好重合,也就是搬运机器人正居导航线正中的时候,这种状况就是最良好的导航状况——搬运机器人正在路的正中,正上方摄像头拍到的导航线状况如下:

(导航线居于图片正中)

当搬运机器人左右发生偏移的时候,机器人与正上方摄像头拍到的导航线状况如下

(模拟车身在导航线偏右)

(模拟车身在导航线偏左)

由此可见,旭日X3派要做的事情就是,通过摄像头实时拍摄导航线的图片,并且经过一系列算法处理,得出搬运机器人相对导航线的偏离状况,并且把状况实时反馈给下位机。而下位机要做的就是接收到偏离信息,通过姿态调整算法,把搬运机器人调整回到轨道正中。

实现原理

先把拍摄到的导航线图片进行中值滤波,去除噪点。接着转化成灰度图,再把灰度图片进行二值化处理,处理到这里的时候,二值化结果中就只有0——白色的地图;255——导航线,从而使用数学方式找到导航线的中轴线。

由于摄像头跟车身位置固定,所以摄像头拍到图片的中位线就是车身中轴线所在位置,把两条中轴线的坐标还有斜率进行比对,就可以分析出搬运机器人车身相对中轴线的姿态,进而可以把分析结果通过串口通信方式发送给下位机。

导入需要用的库:

import cv2 as cv

设置串口各种参数,波特率设置为115200,使用40PIN中的UART3:

os.system('ls /dev/tty[a-zA-Z]*')

选择8号相机用作视频获取:

cap_follow = cv.VideoCapture(8)

设置两个变量分别用作记录两个中轴线的坐标:

line_1 = 0

获取一帧图片并进行中值滤波:

#第二个参数frame:表示截取到一帧的图片

(此处要解释一些为什么采用中值滤波:均值滤波、方框滤波、高斯滤波,都是线性滤波方式。由于线性滤波的结果是所有像素值的线性组合,因此含有噪声的像素也会被考虑进去,噪声不会被消除,而是以更柔和的方式存在,这时使用非线性滤波效果可能会更好。中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果,它用邻域内所有像素值的中间值来替代当前像素点的像素值。)

剪切获取到的图像,只显示和处理一正中小块(可参考下面图片,由于处理整张图片占用算力而结果跟局部处理一样,所以先裁剪图片到一小块有用区域,然后进行灰度、二值化处理):

ROI = blur[0:210, 345:605]  # try to limit the ROI

找出搬运机器人中轴线和导航线中轴线:

n = [len(dst[:, 0]), len(dst[0, :])]

把线标注在处理后的图片上,以便调试时观察:

ROI = cv.line(ROI, (int(n[1] / 2), 0), (int(n[1] / 2), n[0]), (0, 0, 255), 2)

在电脑上显示处理后的灰度图片和标注完中轴线的灰度图便于调试时候观察(旭日X3派上的代码以删除了显示功能,因为用的是serve版本没有桌面,使用HDMI显示起来又挺麻烦而且占用算力):

cv.imshow("gray", gray)

在调试窗口输出两个中轴线坐标差值和斜率差值:

print(int(  (n[1] / 2 - p1(n[0]))/20  ))

把两个差值处理成0-9十个梯度通过串口传送给下位机:

if line_1 < -5 and line_2 > 141:

运行效果

为了方便展示使用电脑模拟搬运机器人(自己写了一个processing程序用作模拟),主要是搬运机器人一打开电源,跑的速度很快,发生偏移和脱轨后的纠正几乎都发生在一瞬间,为了方便展示,自己写了一个模拟的小程序(搬运机器人实跑视频见文末)。

用于仿真的processing程序

此处不一一对processing的程序进行讲解,这个程序实现的功能,仿真出导航线,并且仿真出下位机。这个仿真程序可以通过串口接收到来自旭日X3派反馈的姿态数据,并且根据数据调整搬运机器人的姿态,使导航线重新回到摄像头拍摄图片正中间,即搬运机器人中轴线跟导航线中轴线重合。

import processing.serial.*;

使用电脑运行程序(因为电脑可以看到调试窗口)

右上角的两个小窗口,不带两条直线的是截取后的原始灰度图片,另外一个就是仿真出两条中轴线的模拟图。视频主体模拟的是摄像头右移,即模拟搬运机器人右移,从带有中轴线的调试窗口可看出导航线出现在了图片左边;下位机模拟程序调整搬运机器人车身,可看到屏幕上的中轴线也跟着右移,证明数据反馈和姿态调整算法发生作用。

操作旭日X3派

连接usb摄像头到旭日X3派、用usb转ttl下载器把旭日X3派跟电脑连接在一起:

上电,使用ssh登录,在线操作:

在app文件夹里面创建了一个user的文件夹,把自己写的用于测试的代码都放在这里:

在命令串口执行代码,并且打开电脑端写的仿真软件:

python3 /app/user/xunxian_pi.py

用手控制摄像头先往右移动,即模拟机器人车身偏右;再往左移,即模拟偏左,可从视频中看出,都可以很快调整回去,黑色的导航线紧跟着摄像头移动。命令串口不断反馈数值和指令,left表示向左调整,right表示向左调整,go stright表示不需要调整(指令下面两行数字分别是坐标调整值和角度值):

原作者:衣柜旁的小明
原链接:详见地平线开发者社区 ( https://developer.horizon.ai/forumDetail/106482341031035950

智能搬运机器人系列之使用旭日X3派实现机器人防脱轨功能相关推荐

  1. 整车物流系统源代码_整车物流AGV智能搬运机器人一阶段实地测试顺利完成

    2020年10月20日,由同方环球(天津)物流有限公司(简称TFGL)主导研发的整车AGV智能搬运机器人完成首次实地测试,标志着TFGL在智慧物流领域迈上新台阶.随着我国社会人口红利逐步消失.人力成本 ...

  2. 搬运机器人举杯贺所需的条件_智能搬运机器人比赛规则

    附件 4 :分拣机器人(智能搬运机器人)比赛规则 1 .比赛目的 设计一个轮式或人形小型机器人,在比赛场地里移动,将不同颜 色. 形状或者材质的物体分类搬运到不同的对应位置. 比赛的记分根 据机器人将 ...

  3. 自然语言处理NLP星空智能对话机器人系列:NLP on Transformers 101 第16章:Kaggle BERT比赛CommonLit Readability Prize赛题解析

    自然语言处理NLP星空智能对话机器人系列:NLP on Transformers 101 第16章:Kaggle BERT比赛CommonLit Readability Prize赛题解析 第16章: ...

  4. 【agv搬运机器人价格大全】agv智能搬运机器人多少钱-厂家揭晓

    agv搬运机器人,通过近几年的飞速发展,agv搬运机器人价格已经降低到与传统人工叉车比较接近的水平,而人工成本却是每年不断上涨,这样看来,智能agv搬运机器人的优势已经日益明显,原来agv搬运机器人价 ...

  5. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Noisy relationships

    自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Noisy relationships 目录 Case 2: Noisy relationships Case 3 ...

  6. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 基于BERT模型微调实现句子分类

    自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 基于BERT模型微调实现句子分类 目录 基于BERT模型微调实现句子分类案例实战 Installing the H ...

  7. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 WMT数据处理

    自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 WMT数据处理 目录 Finalizing the preprocessing of the datasets 星 ...

  8. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Matching datasets and tokenizers

    自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Matching datasets and tokenizers 目录 Best practices Step 1 ...

  9. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Standard NLP tasks with specific vocabulary

    自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Standard NLP tasks with specific vocabulary 目录 Standard N ...

最新文章

  1. python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移
  2. mysql数据回滚占用id吗_mysqlbing 回滚数据问题
  3. 反向代理post参数怎么传输_面试必备:GET和POST的区别详细解说
  4. 理科卷math·english·chinese·biology·chemistry·physics
  5. cocos2dx 3.4 截图代码
  6. 独行速众行远,BitTitan携手世纪互联蓝云助力用户数据完美迁移
  7. linux php pdo server,linux服务器用PHP的PDO链接myql方法(php pdo)
  8. shell命令删除昨日的日志_linux定时自动清理日志文件
  9. ubuntu之间传输文件
  10. cadence设计运算放大器_「好设计论文」一种用于高精度DAC的实用型CMOS带隙基准源...
  11. Java同步队列(非阻塞队列与阻塞队列)——java并发容器
  12. 能破解百度网盘提取码,云盘万能钥匙宣布关闭!
  13. CF1503D Flip the Cards(思维题)
  14. 【二十二】 H.266/VVC | 选择最优的仿射AMVP候选项 | xEstimateAffineAMVP函数
  15. 七天毁灭地球的十种方法
  16. android 多个shortCut快捷方式实现以及对58同城快捷方式的实现思路的研究
  17. Cocos Creator:挑战全平台引擎极限
  18. 模式识别c语言isodata算法,《模式识别-黄庆明》第二章(ISODATA算法实例).doc
  19. 怎么看待软件测试这些软实力?
  20. 四种方法,怎么从旧iphone数据迁移到新iphone?

热门文章

  1. Fabric.js 自由绘制椭圆
  2. 特斯拉Q4财报:底部反弹70%,为信仰打call
  3. kotlin类的成员变量 方法
  4. java 实现异地登陆_Java实现用户异地登陆踢人操作
  5. 保存Unity中的Log日志
  6. Unity|一键复制log日志|小技巧
  7. Spring boot Mybatis-Plus数据库单测实战(三种方式)
  8. linux 读取内存颗粒,Linux中的内存管理模型浅析
  9. QT中设置字体和更改字体颜色
  10. 快手短视频产品分析报告-小白文