gpt4 book ai didi

c - NXT-G可视化编程与乐高积木NXC类C编程的区别

转载 作者:行者123 更新时间:2023-11-30 15:55:26 24 4
gpt4 key购买 nike

我正在接触乐高NXT编程,我从非常好的网站http://nxtprograms.com开始。特别是,我遵循了带有光传感器作为平衡传感器的简单 Segway 的说明 (http://nxtprograms.com/NXT2/segway/index.html)。我研究了他的(戴夫·帕克)NXT-G 程序,并在他的机器人和更简单的定制版本(没有“驱动程序”)上成功复制。一切正常,无论是他的程序还是我的程序。我立即转向 NXC 编程,因为我已经了解 C 语言并希望挖掘更大的潜力。我使用完全相同的 PID 常数和计算很好地复制了平衡算法。结果是C程序不起作用:机器人平衡了1或2秒,振荡比NXT-G大,然后就摔倒了。

我比较了 NXT-G 和 C 基本逻辑,没有发现任何差异。所以我想知道我的程序中的电机控制是否有问题。我认为控制电机的 NXT-G 图形框所做的事情不仅仅是简单地调用 OnFwdSync(...)/OnRevSync(...)。这可以解释为什么我的程序会产生较大的初始振荡。

有人有 NXC 程序驱动简单的赛格威乐高的示例吗?或者可以解释为什么我的程序中的电机控制失败?在底部我附上了我的程序的源代码。

谢谢。

#define KP 25
#define KI 1
#define KD 10
#define KO 0.5
#define LSAMPLE 100
//#include "MotorActions.nbc"

int balance(const int RIF)
{
int output = 0;
int previous_error = 0;
int error = 0;
int I = 0;
int D = 0;
int counter = 0;
int actual;

while (true)
{
actual = SENSOR_3;
error = actual - RIF;
counter++;
I += error;
D = (error - previous_error);
previous_error = error;
/**
* Compute de PID compensation
*/
output = KO * (KP * error + KI * I + KD * D);
if ((output > 1000) || (output < -1000))
break;
if (output < 0)
OnFwdSync(OUT_BC, -output, 0);
else
OnRevSync(OUT_BC, output, 0);
}
return (counter);
}

int read_light()
{
int L = 0;
int ctr = 0;

while (ctr < LSAMPLE)
{
L += SENSOR_3;
ctr++;
Wait(10);
}
return (L / LSAMPLE);
}

task main()
{
int i = 0;
int RIF;
int count;

while (i++ < 3)
{
//PlaySound(SOUND_LOW_BEEP);
Wait(800);
}
Wait(400);
//PlaySound( SOUND_DOUBLE_BEEP );
SetSensorColorRed(IN_3);
ClearSensor(SENSOR_3);
RIF = SENSOR_3;
count = balance(RIF);
Off(OUT_BC);
}

最佳答案

尝试改变你的常量。尝试将 KP 提高到一个更大的值,也许是 32?

关于c - NXT-G可视化编程与乐高积木NXC类C编程的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com