基于视觉反馈的步进电机X-Y平台控制
关键词:步进电机、XY平台、视觉反馈
用途:工业自动化
文章类型:原理介绍、随笔纪念
@Author:VShawn(singlex@foxmail.com)
@Date:2017-05-01
@Lab: CvLab202@CSU
1.序言
半年没写过博客了,不过这对于我的博客来说似乎是常态?这半年来忙着做毕业论文,没弄什么自己的研究,而实验室的东西实在是不好泄露出来,所以我也是“虽欲言无可进者”了。
上星期趁着论文提交的空挡,把一直拖着的一个小项目开了个头,其实是朋友有个外快小项目要做,具体内容不说,项目的基础是XY平台的视觉控制,因此在前期研究中主要要做平台选型、控制购买、接线研究、模拟实验等工作,这里记述下来以防忘记,顺便也给其他人做个参考。
本次控制通过相机采集图像,以此为反馈信号做控制,使平台上的某个点位移到指定的位置。然后本文写得更像随笔形式,内容可能有点杂乱,见谅了。
2.平台选型与硬件接线
2.1 XY平台选型
项目中需要做到精度较高的位移控制,且承重要求3kg以上,因此XY平台选型时主要考虑步进电机的XY平台,淘宝上一搜就是一大片。
从中挑选了一台二手日本平台,由于价钱便宜店家不提供技术支持,接线什么的得自己搞。
2.2 步进电机驱动

步进电机驱动不需要购买,我手上有一块前辈留下来的,正好可以用,同样没有任何资料。从其电路板上发现驱动芯片是TA8435H,于是查到其引脚功能表。

根据这个功能表可以确定驱动上几个引脚的功能,并用一个四相步进电机测试,发现驱动板功能完好。

在电机供电上,考虑到要驱动两台步进电机,并获得足够的驱动力,因此我试用了一个12V 4.5A的开关电源。
2.3采集卡
为了使计算机能够控制电机驱动,这里还需要一个电脑IO卡,我用的依然是以前留下来mc100 USB Card,方便好用还便宜,淘宝上一搜一大把。这个东西IO口波纹比较大,而且没做好隔离容易烧,不过既然是实验用,那就将就一下了,实际产品中是肯定不能用这个的。

2.4平台接线

平台到货后检查发现电机型号查不到,只知道是三洋1.5A的步进电机,没办法只好电机的线给拨了,用物理方法来测极性。拨开线后发现步进电机是8相的,于是要测出四组通路,通过万用表测通,发现相通的几根线是这样的:
红-绿
蓝-白
黄-棕
黑-灰
为了测出四组线的相性,需要进行多次接线测试,并汇总结果得到下表(只保留了几组数据,实际中我为了完全确认相性,各种接线组合都测了):
|
B- |
B+ |
A- |
A+ |
状态 |
|
绿 |
红 |
白 |
蓝 |
逆时针转 |
|
绿 |
红 |
黑 |
灰 |
顺时针转 |
|
绿 |
红 |
黄 |
棕 |
不转 |
|
黄 |
棕 |
白 |
蓝 |
逆时针转 |
根据这个表,可以确定最终的接线方法,此处使用的是并联接法,连线如下表。
|
B- |
B+ |
A- |
A+ |
|
绿、黄 |
红、棕 |
白、灰 |
蓝、黑 |
8相步进电机还有另外一种串联接法如下图:

2.5硬件组装结果
最后把两个电机都接到步进电机驱动上,USB采集卡插好,XY平台锁死,相机固定。

得到了个凌乱的实验现场,图中上面那坨黑的是工业相机。
3.平台控制算法
控制这一块我已经丢了差不多三年了,现在再捡起来发现PID都不会写了,再加上步进电机的控制我也没做过,总之是不好弄啊。
首先极力回忆一下本科时微机原理课程设计里做步进电机控制那题是什么做控制的,想起有两种控制方式,一是控制步进电机的步长,二是控制其步数。那么这里既然要控制的是位移量,那么控制步数应该是比较好的选择。但对步进电机来说,每秒走1000步几乎已经是极限了,再快的话电机扭矩会不够,而1000步转换到XY平台上实际也就位移了1cm,所以当位移量较大时,控制的滞后环节可能会较大。但走几步就再控制一下也不现实,毕竟相机的采样时间摆在那,几步就采样控制一下那么控制花费的时间可能会较长……
想来想去也没想到一个最佳的控制方案,总之先用PID控制试试看。
于是搜索增量式PID公式,花十几分钟把C++版本的PID控制器写出来:
然后设计控制周期为100ms,死区5个像素,胡乱设置一下PID参数,只做x方向的平台控制。结果…好嘛,不管怎么样调试系统震荡都很严重,大概是这样子的:

最后我实在是懒得整定PID参数了,于是重新设计控制算法。
- 当误差大于50像素,用PD控制快速移动平台。
- 当误差在50像素以内时,根据事先做好的标定[注1],查表获得位移的步长进行一次移动。
- 移动完成后再次检查还有多少误差,以1的步长慢慢消除该误差。
[注1]这里目标点的位置是固定的,因此可以实现进行多次标定,确定图像上各个坐标上的点要位移目标点处需要走多少步,但考虑到相机畸变这个标定是无法完全准确的,因此为尽量减少畸变造成的误差,位移的目标点应放在相机视野中心,且只做该点半径50像素内的点的位移步数标定。
根据上述控制流程,能够较为快速地完成控制,控制精度可在0.5像素以内,具体可以达到多少由于现在相机的安装位置角度都没定下来,所以我暂时也没仔细测了。
4.程序结构设计
XY平台涉及到X方向与Y方向的控制,两个控制是相互独立的,因此我采用了两个线程对它们分别控制,下面是随手乱画的结构图:



程序运行后开辟三个线程,其中两个分别负责驱动两台电机,主线程则负责计算控制量,该控制量也就是另外两个控制线程的步数。
在架构上尚未做设计,但为了提高程序的可拓展性(毕竟实用化后相机、采集卡都得换),项目内的几个操作类都通过基类设计好了统一的接口,以方便今后更换硬件。

5.图像处理算法
这里图像处理算法偷懒了,采用的是《相机位姿估计2:[应用]实时位姿估计与三维重建相机姿态》中跟踪红点的方法,原理是差不多的,只是这里改成了追踪黑点而已,就不详细写了。
实际项目里图像算法当然不会那么简单,不过这里目前还是一片空白,是下一步的工作重点了。
6.实验截图
最后随便给两张程序运行时的截图,控制台坐标是当前黑点坐标,控制目标是[500,500],u1是x平台的控制量,u2是y平台的控制量。

运行过程中
两秒后完成位移,黑点被移动到设定位置。

完成控制
基于视觉反馈的步进电机X-Y平台控制的更多相关文章
- 使用Minifly打造基于视觉感知的跟踪无人机
前言:无人机和人工智能现在是非常热门的话题,将两者结合起来是一个比较好的创意,本文介绍一种可行的解决方案来实现基于视觉感知的跟踪无人机.从零开始搭建无人机系统工作量和难度(以及钱)都是非常大的,所以在 ...
- 搭建基于SornaQube的自动化安全代码检测平台
一.背景和目的 近年来,随着新业务.新技术的快速发展,应用软件安全缺陷层出不穷.虽然一般情况下,开发者基本都会有单元测试.每日构建.功能测试等环节来保证应用的可用性.但在安全缺陷方面,缺乏安全意识.技 ...
- 基于视觉的 SLAM/Visual Odometry (VO) 开源资料、博客和论文列表
基于视觉的 SLAM/Visual Odometry (VO) 开源资料.博客和论文列表 以下为机器翻译,具体参考原文: https://github.com/tzutalin/awesome-vis ...
- 基于docker搭建wordpress博客网站平台
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...
- 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-1
基于Kubernetes/K8S构建Jenkins持续集成平台(上)-1 Jenkins的Master-Slave分布式构建 什么是Master-Slave分布式构建 Jenkins的Master-S ...
- 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2
基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2 Kubernetes实现Master-Slave分布式构建方案 传统Jenkins的Master-Slave方案的缺陷 Mas ...
- 基于Kubernetes/K8S构建Jenkins持续集成平台(下)
基于Kubernetes/K8S构建Jenkins持续集成平台(下) Jenkins-Master-Slave架构图回顾: 安装和配置NFS NFS简介 NFS(Network File System ...
- cWeb开发框架,基于asp.net的cWeb应用开发平台介绍(二)
cWeb是基于微软的.Net Framework 4框架,数据库是sql server 2008 r2. cWeb开发框架下载,点击这里去下载. cWeb开发框架借鉴三层架构理论分为三层,分别是:cD ...
- cWeb开发框架,基于asp.net的cWeb应用开发平台介绍(一)
cWeb开发框架是基于asp.net的B/S应用开发平台,采用三层架构理论,应用简单.代码简洁.运行快速. cWeb是bubufx提供,是分享资源,无任何版权限制,bubufx继续传承互联网精神,可随 ...
随机推荐
- 轻量级UML工具-UMLet
免费.开源,而且灰常好用的工具,这里就当加一个备注.免得忘了 如何在UMLet中表示static和final? UMLet中表示static用下划线(对于method.function或者operat ...
- hdu 1018 Big Number 数学结论
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 查看和修改Oracle数据库服务器端的字符集
Oracle数据库查看和修改服务器端的字符集的方法是本文主要要介绍的内容,接下来救让我们一起来了解一下这部分内容. A.oracle server 端字符集查询 select userenv('lan ...
- vi/vim 光标移动命令
vi/vim 光标移动命令 移动光标上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行下:j nj:向下移动n行左:h nh:向左移动n列右:l nl:向右移动n列 w:光标以 ...
- linux学习笔记12--命令less
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- 删除Win10的自带应用
显示 Get-AppxPackage | Select Name, PackageFullName 按关键字删除 Get-AppxPackage *camera* | Remove-AppxPacka ...
- kettle的job中使用循环
job中使用循环 在一个不稳定的网络环境下作文件传输.偶尔会有超时或连接重置.这时须要稍等片刻再重试.在重试10次之后放弃并结束该job.类似使用循环解决这类问题. 该演示样例job演示了这样 ...
- Docker是用来干什么的?【快速入门】
Docker从去年开始不仅能在Linux下运行 ,还支持windows.osX等主流系统. 下面的例子我自己经常使用,当然你有更好的案例也可以分享给我. 尝试新软件 对开发者而言,每天会催生出的各式各 ...
- Python 使用标准库根据进程名获取进程PID
应用场景 在进行 Linux 运维的环境中,我们经常会遇到维护同一台服务器上的多个程序,涉及到程序的启动.关闭和重启操作. 通常这些程序之间存在着相互依存的关系需要进行依次的启动关闭操作. 下面介绍几 ...
- thinkphp 从服务器拉取下来 验证码失效
public function verify(){ ob_end_clean();//加入 $verify = new \Think\Verify(); $verify->entry(1); }