KiCad 华秋发行版 new
供应链、设计、制造,一体成就未来
华秋PCB
高可靠多层板制造商
华秋SMT
高可靠一站式PCBA智造商
华秋商城
自营现货电子元器件商城
PCB Layout
高多层、高密度产品设计
钢网制造
专注高品质钢网制造
BOM配单
专业的一站式采购解决方案
华秋DFM
一键分析设计隐患
华秋认证
认证检测无可置疑
发资料
发帖
提问
发视频
扫码添加小助手
加入工程师交流群
实现该目的最简单的办法是将UNO更改为MEGA。MEGA和UNO是兼容的,所以对于原理图不用进行修改。另外,使用MEGA不仅可以为计算部分获取四倍多的RAM,还意味着将有八倍以上的闪存可用于我们的程序存储。我们很可能不会所有都用到,但是有更大的预留空间总是好的。以下是改进后的Fritzing原理图,如果您使用的是Arduino MEGA最新版本 (Rev 3),更换的过程很简单,跟断开UNO之后连接MEGA的过程一样。下面示意图以供参考。
图1:PWM扩展板改进后原理图
现在,我们来探究一些物理原理、所用到的大量数学知识以及少量代码。
可能有些人还记得,在高中的时候,物理课中有一部分内容叫做“运动学”。简单地说,这是力学领域中对一个目标对象(或一个点)运动的描述。这意味着在运动学中,您将使用数学公式和模型来对单个点的已知运动进行分析。顾名思义,逆运动学(IK)恰恰相反:通过一系列数学公式来反推并创建运动。
在机器人领域,通常使用的算法只能根据相应的端点运动来计算所有关节的运动。现在,您可以清楚地看到逆运动学在伺服运动编程部分的难题上所具有的优势——它是可以通用的。从理论上来说,仅一个算法就可以处理机器人所执行的任何运动。从使用者的角度来说,它非常易于使用—您只需要告诉机器人向左转90°,然后直行1米就可以了,而不必考虑每个伺服的位置。
struct body {float x;float y;float z;float facing;};
struct leg {uint8_t number;bool move;float phi;float z;};
body origin;leg legs[6];
将这些结构私有化有以下两个原因:
如果需要,我们可以将这些点可视化。现在,我们的整个机器人由七个点来表示(图3)。
图3:IK模型的图形表示。简而言之,这就是六足机器人“认为”它所看起来的样子。红点是身体,蓝点是腿。
这些结构用于追踪所有腿部的位置以及机器人本身的位置。您可能注意到了,腿部的位置仅由两个坐标来定义:phi 和 z。这是因为每条腿只有两个自由度,因此只能沿着两个轴进行移动。现在可以通过身体的x、y 和 z 坐标来对所有位置进行定义。每条腿的 phi 和 z 坐标的范围是-1到1,并且仅确定了腿相对于身体的位置。尽管现在来看这种复杂性似乎是不必要的,但是实际上这比每次运动后计算每条腿的 x、y 和 z 坐标容易得多。phi 坐标表示水平运动,z表示垂直运动。
图4:带有phi轴和z轴的腿部细节
现在,我们对于机器人有了足够简单的数学表达,但是还没有用它来做任何事。下一步就是研究如何通过仅仅修改该模型来实现伺服的运转。我们需要完成的程序是将输入作为一组点坐标,并将其转换为伺服的运行。
这时候另一个问题就出现了,而这次,仅仅替换成另一个Arduino无法解决。当启动伺服时,我们可能需要使大部分伺服同时运转。但是,Arduino(以及所有与此相关的AVRs)一次只能执行一项任务。这意味着如果我们如果想平稳地运转伺服,就需要一个一个进行启动。如果仅仅将伺服从一端直接运转到另一端,整个过程将非常不稳定。
这也是我们必须更换Arduino的原因。如果我们想要运行每一个伺服,那么我们需要大量的内存来存储刚刚所计算出的坐标。如果我们运转所有的伺服,我们将需要600个浮点数来存储运动坐标,因为每个伺服都至少需要50个位置才能产生平滑连续的运转效果。600个浮点数大约是 2.3 kB的RAM—这已经超过了UNO的容量。
现在我们开始进入IK编程的最后一步,即真正的行走。我们已经完成了所有基础工作:我们创建了一个模型来对所有事物进行追踪,我们可以运行多个伺服,甚至可以使伺服的运转变得相对平滑连续。在以下内容中,支腿的编号与下图中的编号相对应:
图5:支腿编号
该编号系统同时与您在库中找到的代码一致。
我们先从简单的操作开始:在场地上转向。通常,在为支腿设定新的位置时,您必须保证其中三条腿在地面上。这背后的原因很明显—除非您可以非常快地移动支腿,不然机器人将失去稳定性并跌倒。我们可以分几步使机器人转向:
1. 将支腿0、2和4移动到phi 坐标最大值处(最大水平角)。
图6:转向步骤1(支腿0、2和4)
2. 对支腿1、3和5进行相同操作。
图7:转向步骤2(支腿1、3和5)
3. 身体转向。这一步是通过沿与步骤1-3中相反的方向运行所有水平方向的伺服来完成的。因为所有的支腿都在地面上且不能移动,所以可以移动的只有身体。
图8:转向步骤3
对这些步骤进行重复执行后,机器人可以转弯80°。当然,只要不是在过程中一直保持 phi 轴最大坐标位置,可以实现小于该角度的转向。得益于 traceLeg() 函数背后的巧妙算法,我们不必计算支腿的任何 z 坐标值—这些计算会自动进行,并形成圆或椭圆的形状。您可以在以下视频中观察到这一过程。
最后一步是行走。具体来说,我们希望它至少能向前行走。六足机器人的行走算法有很多种,但大多数算法都基于有三个自由度的支腿。我们的支腿只有两个自由度,因此我们必须自己进行一些设计。我所提出的方法虽然没有达到预期的速度,但是这种方法是最易于编程的,并且易于观察过程中的现象。
1. 首先,支腿0和3向前移动
图9:行走步骤1(支腿0和3)
2. 然后,支腿2和5向相同方向移动
图10:行走步骤2(支腿2和5)
3. 对支腿1和4进行相同操作
图11:行走步骤4(支腿1和4)
4. 现在,身体移动向前,开始重复执行整个过程。
图12:行走步骤4
您可以在以下视频中观看整个运动:
您可能已经注意到了,库中有一部分专门用于SR04超声波测距仪。这是为了获取有关机器人所处环境的一些信息。当然,一个固定不动的传感器是不够的,因此在上一篇文章中我们在一个额外的伺服上也安装了一个传感器。
重要提示: 请注意,您需要Adafruit PWM驱动程序库来使AP_Utils运行,您可以点击此处 下载。下载完成后,和其他Arduino库一样对其进行安装。
Arduino 代码
审核编辑:汤梓红
浏览量
浏览量
浏览量
扫码添加小助手
加入工程师交流群
下载发烧友APP
电子发烧友观察
长沙市望城经济技术开发区航空路6号手机智能终端产业园2号厂房3层(0731-88081133)