我正在编写一些机器人运动学代码,我首先编写了用于计算关节角度的朴素的、有意未优化的函数,这样我就可以使用逻辑分析仪测量时序,并有一种切实可行的方法来测量增益在定点数学等优化中。
我有两个正在玩的微 Controller 板:Teensy 2.0 和 Teensy 3.0。我正在使用 Arduino 环境为他们构建代码。与大多数 Arduino 一样,2.0 是一个 8 位 16MHz AVR。 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);
}
最佳答案
ARM cortex M4
Cortex M4 中的 FPU 仅支持单精度,但您在代码中使用了很多双。这意味着软件计算而不是硬件。您是否尝试过将 double
变量和函数调用更改为 float
?
关于c - 基于 ARM 的 arduino 型系统比基于 AVR 的系统慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15017061/