我正在编写一些机器人运动学代码,我首先编写了用于计算关节角度的天真、有意非优化的函数,这样我就可以用逻辑分析仪测量时序,并有一种切实的方法来测量优化中的收益,例如作为定点数学。
我有两个正在玩的微控制器板:一个 Teensy 2.0 和一个 Teensy 3.0。我正在使用 Arduino 环境为他们构建代码。2.0 是一个 8 位 16MHz AVR,和大多数 Arduino 一样。3.0 是 32 位 48MHz ARM cortex M4。
代码将引脚拉低,进行一条腿的 IK 计算,然后将引脚拉回高电平。我正在使用一个古老的逻辑分析仪来测量线路低电平的时间。
奇怪的是,ARM 板的边缘之间的时间明显更长!AVR 大约需要 960 微秒,但 ARM 大约需要 18.5 毫秒!
这在我的脑海中没有加起来。有没有人知道为什么会这样?
这是我正在使用的代码。不要介意它是故意未优化的,可能我数学不好,但这不是这里的问题:)
#include <math.h>
#define lc 21.0
#define lf 40.0
#define lt 62.0
#define lfsqrd 1600.0
#define ltsqrd 3844.0
struct Vector {
double x;
double y;
double z;
};
struct Joints {
double c;
double f;
double t;
};
void calc_joints(struct Vector *foot, struct Joints *joints) {
double l1 = sqrt(pow(foot->y,2) + pow(foot->x, 2));
double l2 = l1 - lc;
double l3 = sqrt(pow(foot->z,2) + pow(l2, 2));
double tx = atan2(l2, foot->z);
double ty = acos( (pow(l3,2) + lfsqrd - ltsqrd) / (2 * l3 * lf) );
// todo: convert these from radians to degrees
joints->c = atan2(foot->y, foot->x);
joints->f = tx + ty;
joints->t = acos( (lfsqrd + ltsqrd - pow(l3,2)) / (2 * lf * lt) );
}
void setup() {
Serial.begin(9600);
pinMode(0, OUTPUT);
digitalWrite(0, HIGH);
}
void loop() {
digitalWrite(0, LOW);
struct Vector v = { 10, 20, 30 };
struct Joints j;
calc_joints(&v, &j);
digitalWrite(0, HIGH);
Serial.print(j.c);
Serial.print(", ");
Serial.print(j.f);
Serial.print(", ");
Serial.println(j.t);
}