1

現在Arduinoを使用して構築しているロボットにPID制御アルゴリズムを実装しています。

私の質問は、プログラミングのロジックに関連しています。

変数、エラー、int eps を計算する必要があります。この eps は -7 から +7 の間になります。

ロボットから、0 から 7000 までの値を持つ double の形式で入力を取得します。

私のアルゴリズムは次のように動作する必要があります。

if(input >= 500){
     if(input >= 1000){
          if(input >= 1500){
          ..........
          }
     }else{
          eps = 6;
     }
}else{
     eps = 7;
} 

等々...

つまり、入力が含まれる間隔によって決定される値を eps に割り当てる必要があります。

私の質問は、これを行う最も効率的で、時間とリソースを節約する方法は何ですか?

私は Eclipse ではなく、Arduino と独自の IDE を使用しています。

4

4 に答える 4

3

arduinoにはマップ機能があります。http://arduino.cc/en/Reference/map

したがって、このようなものが必要です。eps = map(input、0、7000、-7、+7);

于 2012-04-22T17:36:41.367 に答える
3

7が7000に対応し、-7が0に対応し、イプシロンの異なる値の間の間隔が等しい(500)場合、を書くことができますeps = static_cast<int>(input/500.0) - 7。Arduinoの静的キャストについてはよくわかりません。値をより低い整数(床)に丸める必要があります。

epsを決定する他のアルゴリズムがある場合は、それをより明確に述べてください。このための数学を作成しようとします;)

于 2012-04-22T14:10:15.347 に答える
2

最速の方法は次のとおりです。

switch (int(input) /  500)
{
case 0: ... // 0..500
case 1: ... // 500..1000
case 2: ... // 1000..1500
etc
}
于 2012-04-22T17:40:31.050 に答える
2

コード例から何を達成しようとしているのか完全には明らかではありませんが、(0 から 7000)inputを (-7 から 7) のeps値に均等に分配して、すべての間隔が均等に表現されるようにすると仮定すると、使用できません。 500 の倍数。500 を使用すると、極端な値 (-7 または 7) の 1 つが非常に狭い範囲の値からのみ得られinputます。

たとえば、次の関数を使用して から計算できepsますinput

int eps(double input) {
  return ((int)(input/500.0)) - 7;
}

ただし、この関数を使用すると、次のマッピングが生成され、eps値 7 が他のすべての値よりもはるかにまれになります。

         input         | eps
>=    0.0 and <  500.0 | -7
>=  500.0 and < 1000.0 | -6
>= 1000.0 and < 1500.0 | -5
>= 1500.0 and < 2000.0 | -4
>= 2000.0 and < 2500.0 | -3
>= 2500.0 and < 3000.0 | -2
>= 3000.0 and < 3500.0 | -1
>= 3500.0 and < 4000.0 |  0
>= 4000.0 and < 4500.0 |  1
>= 4500.0 and < 5000.0 |  2
>= 5000.0 and < 5500.0 |  3
>= 5500.0 and < 6000.0 |  4
>= 6000.0 and < 6500.0 |  5
>= 6500.0 and < 7000.0 |  6
>= 7000.0              |  7

代わりに均等な分布が必要な場合は、次のコードを使用する必要があります。

int eps(double input) {
  return ((int)(input/466.733333))-7;
}
于 2012-04-22T17:44:06.697 に答える