0

私はレゴNXTプログラミングに近づいており、非常に優れたサイトhttp://nxtprograms.comから始めました。。特に、バランスセンサーとして光センサーを備えたシンプルなセグウェイの指示に従いました(http://nxtprograms.com/NXT2/segway/index.html)。私は彼の(Dave Parker)NXT-Gプログラムを研究し、彼のロボットとより単純なカスタムバージョン(「ドライバー」なし)で正常に複製しました。彼のプログラムと私のプログラムのどちらでも、すべてが機能します。私はすでにClangを知っていて、より大きな可能性を活用したかったので、すぐにNXCプログラミングに切り替えました。まったく同じ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);
}
4

1 に答える 1

1

定数を変更してみてください。KP をもっと大きな値、32 に上げてみてください。

于 2012-10-06T22:33:04.237 に答える