介绍
此文章是对 Arduino Hexapod Robot 的总结及中文翻译。针对于六足机器人的算法,可以先看看:https://oscarliang.com/inverse-kinematics-implementation-for-hexapod-robot/ 如果你还不知道什么是 IK,可以先看看 IK 基础:https://oscarliang.com/inverse-kinematics-and-trigonometry-basics/
因为我网上买了一套六足机器人的框架,但还没到,所以决定先用塑胶做一个小尺寸的用来验证算法。我从上一个版本(2DOF 六爪昆虫)回收了不少材料,除了身体。
[31/Jan/2012]
[13/Feb/2012]
[03/Apr/2012]
[22/Aug/2012]
用的是 Arduino Mega,加上自己焊的 Shield 配有20个舵机接口(俩备用或接传感器)。
发现起直接转换 float 到 int 的时候,数字会造成 round off 错误,像是: 4.4 = 4, 4.8 同样 = 4
于是我写了一条函数来解决(四舍五入):
int FloatToInt(float input){ // this is an alternative to cast number directly, to avoid floor rounding int temp = (int)input; // floor-rounded input float dif = input – (float)temp; // if (dif < 0.5) return temp; else return temp+1; } |
在 Arduino 上用 float 的坏处就是计算时间变长,导致机器人动作变得不流畅。用 Int 又不够准确。Arduino 天生计算能力比较差,唯有从准确度和计算速度上找到平衡点,之后再说这个问题。
=======================================================
更新
09/02/2012
改写了一下代码,用上了 Rotation Matrix 来转换不同的座标系统(Body 是一个系统,每一只脚都有它们各自的座标系统)。原来只是估算不同座标系统的转换,快,但不准确。原理可以看看我上一篇 讲 roation matrix 的那一部份。
同时我也加长了脚的长度。。。
=======================================================
更新
12/02/2012
昨晚终于写出了 6 step ripple 步法。
=======================================================
更新
19/02/2012
这个周末我实现了
1. 整理了一下舵的线路
2. 实现了 fast SIN, COS, ACOS functions (跟内装的三角函数比起来,牺牲了一些准确度,但快10倍以上)
3. 七个新步法(从 Jeroen Janssen 的代码中 copy 过来的)
(1) Ripple 12 steps
(2) Quadripple 9 steps
(3) Tripod 4 steps
(4) Tripod 6 steps
(5) Tripod 8 steps
(6) Wave 12 steps
(7) Wave 18 steps
=======================================================
更新
03/04/2012
这两个星期都没有怎么时间。。。不过终于让我把新买的六爪昆虫身体给拼出来了。这东西比我想像中的要重。其实老实说不太值。。用塑胶一样可以做出来。。。
因为我当前用的遥控器是 Wii Nunchuck 手柄,没什么按钮,所以如果决定用 state machine 的原理来做一个菜单的功能。
下图每个盒子代表一个状态,三个颜色的 LED 来表示我们所在的状态。
=======================================================
更新
10/08/2012
今天开始学新开发 Android App 啦。。。以前没用过 Java 所以有一定的 Learning Curve。。。
http://android-meda.blogspot.co.uk/2012/01/writing-your-first-android-app-body.html
http://www.elecfreaks.com/677.html
=======================================================
更新
12/08/2012
Android App 关不多好啦,以下是通信协议格式:
Command format:
4 bytes
[type] [x] [y] [extra]
type – 操作类型
x – 第一个输入 eg X axis
y – 第二个输入 eg Y axis
extra –第三个输入, e.g. speed of the movement, or just 0 if not needed
Communication:
1. Arduino 等待 Android 的开始命令
2. arduino 发回“可继续”的讯号。
3. Android 收到“可继续”的讯号,发送动作命令,Arduino 每次执行完都会发回“可继续”的讯号。循环。。。原果 Android 那边没有命令可发,也是会发 “0”的。。。
If you want to discuss or share your ideas, you can post soething in our forum here.
1 comment
于是我写了一条函数来解决(四舍五入): 这个算法可以优化一下,
int FloatToInt(float input){
return (int)(input+0.5);
}
这样应该就可以了。