加载中…
个人资料
棉花肚
棉花肚
  • 博客等级:
  • 博客积分:0
  • 博客访问:5,259
  • 关注人气:80
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

scratch编程学习2--能绘制平面路径G代码的平面机械臂

(2015-12-21 09:20:23)
标签:

图形化编程

模拟机械臂

分类: 杂七杂八DIY
小车项目可说完美解决,另一个吸引我的项目就是机械臂了。
机械臂对我来说很难!旋转,角度,圆坐标系和平面坐标系转换......想想都晕。
首先还是确定目标吧!
最先确定做3轴的机械臂,包括几个部件。底座,大臂,小臂,夹子
按我想象中的难度确认目标如下。
1,手动控制机械臂。联动,单独动;2,随机绘制图案;3,机械臂可以指哪到哪;4自动跟随鼠标;5画直线;6画圆;7模拟机械臂分类码放物品;8根据坐标绘制图形
程序已共享
 

http://s14/mw690/001nKwlmzy6XWltvDqZ5d&690
绘制角色当然是第一件事
http://s7/mw690/001nKwlmzy6XWlaw6p026&690
这是后期版本,为了专注于解决问题提高精度,取消了夹子部分简化为两轴。
 
转起来吧
为了方便计算和精度,我是这么设想的。将一周就分为360度,然后设计一个键可以输入一个值,再点动按键就可以旋转相应的角度。由于scratch的坐标系和数学坐标系有所不同,这里就比较麻烦。程序里的角度规定是0度为上,向左转就是负值,一直到180(0)。向右是正值从0到180度。而数学坐标系是0是面向右,逆时针为正从0-360,顺时针为负360-0。总之有点绕,计算的时候需要注意。我是编了一段小程序,自动将坐标系转换成自己熟悉的方便计算。但是这两点造成了很大的麻烦,一是运行速度太慢,而是精度问题。这是后话暂且不提。
一开始转,问题就来了。大臂转起来后,小臂如何跟上大臂呢!程序里只能设置一个旋转中心,大臂的旋转中心已经定位到底座上了。另一点就只能通过计算得到。也就是通过臂长和角度就可以得到大臂另一点的坐标。然后让小臂随时定位到旋转轴,小臂就可以跟随大臂了。夹子也是一样的道理。在这里大臂长,小臂长,夹子长等等最好用变量来定义,看起来麻烦,但是到后期如果想改变臂长等等就会非常方便。
 
娱乐一下
事后分析程序设计,自然是简单明了。但是实际编写的时候我还是非常晕的,经常不得其法而入。遇到这种情况不如先整点简单的,放松一下。
http://s1/mw690/001nKwlmzy6XWoeNQpq50&690

http://s16/mw690/001nKwlmzy6XWoeDP67ef&690

这些看起来复杂漂亮的图案,其实只要在完成了转起来这一步之后就很容易实现了。随意定义几种随机数,然后循环运行一定的次数,就可以画出千变万化的图案了。

 

"指哪打哪"

手动转动大小臂显然很难定位到盘面上的一个点,就更加难以画出任何图形。那么如何让机械臂自动运行到鼠标指示的点或者是一个输入的XY坐标上呢?

我始终是不想计算?数学一直让我很头大!于是想通过倒推的方法来让机械臂动起来,也就是让夹子移动,然后带动小臂到大臂,想象是美好的,其实最后还是需要数学公式的计算。投机取巧不行,还是踏踏实实一步一步来吧。很明显当知道A点的坐标后,假定机械臂到位。那么我就已知这么几个条件。大小臂的长度,坐标点的XY值。通过这几个值,首先就可以计算出坐标点距离原点,也就是AB距离。可以计算出大小臂的夹角,AB连线和大小臂的夹角。然后通过一通推算,就可以得到大小臂应该转动的角度了。但是这个角度在输入坐标点不同时是不一样的。影响这个值的点主要是Y值是在负轴还是在正轴决定的。所以必须加一个对y坐标的判定来决定最后的转动角度。不做这一步的话,机械臂就只能在坐标系的上半部分运行。

 

http://s10/mw690/001nKwlmzy6XWqSNvSN59&690

"再指哪还打哪"

很爽啊!鼠标在盘面一点,机械臂就自动就位了。再次点击,哇!机械臂不知跑哪里去了。这都是因为计算是基于机械臂处于归零的位置,再次点击,计算出的角度依然是以零位为准的。所以必须将计算值和当前值进行比较计算才能得出正确的角度。

 

http://s5/mw690/001nKwlmzy6XWst9ucYa4&690

 

画直线

机械臂能按坐标就位,自然就可以开始画直线的程序了。还是由于之前的旋转方式和选取计算角度的方式问题,导致精度非常差,以至于必须每画一个点就需要归零校准,才能勉强画出直线。输入坐标和实际坐标误差达到2.5个单位以上。速度非常慢,必须以加速方式才能忍受。虽然狗啃一样的直线,但是能按输入的坐标画出来,我也很欣慰了。

http://s10/mw690/001nKwlmzy6XWssmRmxd9&690

进行到这里,几乎不想再继续了,想画出完美的直线几乎不可能。除非全面推翻......而且还不知到能不能成功?

考虑了几个因素,计算结果,程序,角色。计算虽然不是我擅长的,可明显计算结果无误。那么精度差由哪里产生的呢?

 

一是直线是由一系列的点组成,画多少点能得到平滑的直线,是由直线两个端点的长度除以点的半径得来的。所以不长的一段线就有相当多的点的坐标,而机械臂必须准确的画出每一个点才能画出完美的直线。由于追求机械臂的动画运行效果,机械臂就位速度慢,数据输入速度远快于机械臂的运行速度。一个点的动作还没有完成,下一个点的数据已经输入了,靠延时也无法很好的解决。最后靠每画一点归零来纠正误差及平衡速度差,实在是个笨得出奇的办法。

二来角色有3部分组成,每个部分的定位点都是靠计算得来,多次计算后会不会累积误差?

三是程序上我用自己计算出的角度(虽然到小数点后十几位,但是次数多了累积起来就可观了)来推导其他数据会不会误差太大?

 

要改变这三点,真的是几乎从头来过了。首先简化设计,3轴改两轴(原本画线也要将第3轴锁定)。然后直接用程序内建的角度(角色的朝向)来计算。虽然没有了机械臂转动的动画外观效果,但是计算精度简直超准,输入值和计算值零误差。由此想来即使恢复3轴也估计毫无问题。当然也证实了计算方法本身的确是没有错误的。

同样是之前的画直线程序,这次画出了完美的直线,而且速度飞快。

http://s5/mw690/001nKwlmzy6XWBW7wOg74&690

圆和弧

本以为这个最难,但是有了之前的基础。只是简单的导入求圆周上每点坐标的公式,输入圆心坐标和半径,圆就简简单单的画出来了。增加几个数据输入后,就可以画出任意长度的弧线,当然这只限于正圆和圆上的弧。

http://s2/bmiddle/001nKwlmzy6XWCue9BDf1&690

模拟分类

接下来的模拟机械臂分类物品也就顺利完成了。

机械臂会按

123

456

789

的顺序检查物品堆放处。

http://s15/mw690/001nKwlmzy6XWCU13GK1e&690

以不同的颜色模拟不同的物品,机械臂会根据颜色的不同而将物品码放到不同的位置。
http://s15/mw690/001nKwlmzy6XWCU31GS0e&690

这次机械臂的项目比起小车来难了很多,主要是增加了很多的数学计算。必须熟练三角函数的应用才能解决圆周运动,角度和平面坐标的关系。当年要是有这个爱好,促进学习那是必然的了。

 

最终目标

模拟扫描,模拟绘图

具备画点线面之后,只要有图形的坐标数据应该就可以模拟机械臂绘图了。

坐标也需要自行获得,那么只好做一个模拟扫描(黑白,位图形式非黑即白)的程序了。开始直接用机械臂的绘图点来扫描,速度实在有点慢。于是做了一个五点扫描头,一次扫描5行,然后将数据计入链表。描绘的时候调用就可以了。链表的数据可以外存,所以可以扫描各种图案,保存就可以随时调用了。

为了不让机械臂挡住画面,所以要将机械臂移动到边角,相应的臂长也需要增加。之前各数据和计算都用变量定义的好处就是这些改变非常方便,几乎不需要修改程序。

http://s16/bmiddle/001nKwlmzy6XZBByLw3df&690

图案最好是位图黑白。右下角荧光蓝绿色就是5个扫描点。按照可绘图面积逐点扫描,理论上精度还是很高的。
http://s13/mw690/001nKwlmzy6XZBBvvCA4c&690
5点扫描分别记录,只有一个“打印头”所以只能分5次打印完毕。第一组数据打印完毕。
http://s12/mw690/001nKwlmzy6XZBBjaqv6b&690
5组数据全部打印完成。

进化

黑白丢失细节太多,增加一些灰度就能大幅度改善绘制效果。从单纯识别黑增加4种灰度,效果得到大幅改善。

http://s2/mw690/001nKwlmzy6Y20ilbTXb1&690
再度进化,设计能够够画平面路径G代码。将G代码导入链表,通过程序转换成本机械臂绘制需要的数据并保存成绘制所需的数据链表。而且可以旋转,缩放,镜像操作。本来想直接读取G代码绘制,有一定难度。只好采取单独两个链表解决了。并且设计了计时和完成百分比。
http://s1/mw690/001nKwlmzy6ZDHOPHqw80&690




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有