【问题标题】:Difference between NXT-G visual programming and NXC C-like programming of Lego brick乐高积木NXT-G可视化编程与NXC类C编程的区别
【发布时间】:2012-08-27 09:34:47
【问题描述】:

我正在接近乐高 NXT 编程,我从非常好的网站 http://nxtprograms.com 开始。特别是我遵循了简单的 Segway 的说明,将光传感器作为平衡传感器 (http://nxtprograms.com/NXT2/segway/index.html)。 我研究了他的 (Dave Parker) NXT-G 程序,并成功地在他的机器人和更简单的自定义版本(没有“驱动程序”)上复制。一切正常,无论是他的程序还是我的程序。 我很快就转向了 NXC 编程,因为我已经了解 C 语言并且想利用更大的潜力。我用相同的 PID 常数和计算很好地复制了平衡算法。结果就是 C 程序不起作用:机器人平衡了 1 或 2 秒,振动比 NXT-G 的大,它掉下来了。

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

有没有人有 NXC 程序驱动那个简单的 segway-lego 的例子,或者可以解释为什么我的程序中的电机控制失败?在底部我附上了我的程序的源代码。

谢谢。

#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);
}

【问题讨论】:

  • 可能与您的问题无关,但为什么您在 main 内创建 RIFcount ,因为此后您不再使用它们?
  • 嗨,count 实际上没有被使用(它是用于在以前的版本中进行调试)。 RIF 用作 balance() 的参数。此外,read_light() 在上一个版本中被用于获得一秒内光线的平均值。所有这些实际上与问题无关 :-) 另请注意,在这个版本中,我使用 KO 常数来减少对电机的输出影响......但程序仍然无法平衡机器人:- (
  • SENSOR_3 的值是多少?为什么#include MotorActions.nbc 被评论了?
  • SENSOR_3 提供了在赋值“actual = SENSOR_3;”时准确检测到的反射光值被执行。不再需要 MotorActions.nbc(它包含 OnFwdSync 和 OnRevSync)。
  • 发现问题:不能使用 OnFwdSync 和 OnRevSync 函数;必须使用简单的 OnFwd 和 OnRev 函数。之后我也找到了正确的参数组合:KP=25, KI=0.25, KD=40。 3 个参数的组合首先取决于平衡循环的速度,在 C 语言(nbc 编译器)的情况下,它比 NXT-G 可视化 IDE 生成的代码更快。它们似乎不依赖于机器人构建结构。

标签: c nxt lego mindstorms nxc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2012-10-11
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多