まず、最適なを定義する必要があります。あなたはあなたが最適だと思うことを言わないので、ほとんどの人は二次式を選びます。たとえば、現在の関節角度がベクトルによって与えられているとします。必要な移動を最小化することを検討できます-エラーで、コスト関数定義できますいくつかの行列。通常、対角行列を使用しますが、正定行列でも使用できます。α⃗ x⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
2つの関節角度を持つ単純化された例では、関節がより安価なモーター(おそらくエンドエフェクターに近い)を持っている場合、a
J=[xaxb][1002][xaxb]、つまり 関節の動き関節として高価として2倍である。ba
さて、運動方程式は行列式であり、Denavit-Hartenberg表記では次のようになります。
∏Ti=⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥、ここで右側は位置と方向を表します(現在はゼロ回転として設定されています)、関節角度が与えられます。(x,y,z)
方向は気にせず、位置のみを考慮しているため、最後の変換行列の最初の3列と最初の変換行列の最後の行を切り捨てることができます。この式は次のように同等に表すことができます。
⎡⎣⎢100010001000⎤⎦⎥∏Ti⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢xyz⎤⎦⎥
左辺を乗算すると、3つの方程式が得られます。パラメータが線形であれば、簡単に解決できます。これは、すべてのアクチュエータがリニアアクチュエータの場合です。この場合、問題は実際には2次プログラムです。左辺を並べ替えて、次の式を取得できます。
Kx⃗ =⎡⎣⎢xyz⎤⎦⎥、いくつかの行列。K
二次計画は、次の形式で表現できる問題です。
最小化J=12x⃗ TQx⃗ +c⃗ Tx⃗
対象と、Ax⃗ ≤b⃗ Ex⃗ =d⃗
これを解決するために、たとえば内点、アクティブセットなど、使用できるアルゴリズムがいくつかあります。適切なライブラリを見つけるだけで、解決されます。
方程式の非線形システムは解くのがより困難です。これは非線形プログラミングと呼ばれますが、回転ジョイントがある場合はそうです。
基本的に、行列方程式の代わりに、非線形関数があります。
条件として最小化し、(制約のRHSをゼロにする必要がある場合は再配置します)f(x)h⃗ (x)=0g⃗ (x)≤0
これを解決するために使用されるアルゴリズムはさらに複雑ですが、内点逐次二次計画法(SQP)、アクティブセット、信頼領域反射アルゴリズムが含まれます。明らかに、これらのアルゴリズムがどのように機能するかについての説明は非常に長く、私はそれをこの回答の範囲から外します。二次計画法だけに使用されるアルゴリズムのコンテンツの量は、それ自体で全体のコースになる可能性があると言うだけで十分です。
問題を解決するためのライブラリを見つけるだけで、効率的な実装をコード化するには長い時間がかかり、効率的な実装は一度に100(またはそれ以上)の変数を処理できます。たとえば、MATLABを使用している場合、Optimization Toolboxの関数fminconの使用方法に関するドキュメントがあります。
オンラインで解決するには、C ++または他のネイティブ実装(NLoptなど)が必要になる場合があります。これはマイクロコントローラーがすぐに解決できるものではない場合があり、多くのライブラリーには他の依存関係がある可能性があることに注意してください(マイクロコントローラーで使用するのは簡単ではありません)。
効率を気にせず、自分でコーディングできるものが必要な場合は、逆運動学の問題を解決するために呼び出すことができる関数があると仮定して、勾配降下法を実行できます。たとえば、ランダムな開始方向を任意に選択し、逆の問題を解決してから、コスト関数を確認します。次に、摂動分析を使用して、方向をどのように変えるかを確認できます。たとえば、現在の向き(つまり、立方体グリッドの8ポイント)を中心に同様の向きを確認すると、コスト関数が各方向でどのように変化するかを2次近似で求めることができます。
2次近似(多変量であるためヘッセ行列と呼ばれる-方向は3次元)を使用すると、コスト関数の勾配のゼロ交差(つまり、予測される極小)を見つけることができます。
新しく予測された方向で、逆ソルバーに再度通し、精度が十分になるまで繰り返します。
インバースキネマティック問題自体は反復的に解決する必要があるため、これはおそらくそれほど効率的ではないことに注意してください(そのため、解決にしばらく時間がかかる関数を繰り返し使用しています)。また、含まれるコードは完全な最適化アルゴリズムよりも少ないかもしれませんが、それでもかなり重要であり、時間の取るに足らない投資ではありません。
どちらの方法(形式的には非線形プログラムとして解くか、関数を繰り返し使用して逆問題を解く)を使用しても、複数の極小値がある場合、解は最適ではない可能性があります。この場合、さまざまなアプローチを使用して、グローバルミニマムを見つけることができます。非線形プログラミングソルバーを使用しても、初期値(ジョイント角度など)をシードすることが期待されます。さまざまな方法で生成されたシードを使用して、いずれかのメソッドを繰り返し実行できます。
- ランダム再起動(ランダムに生成されます)
- グリッドベース
または他のカスタムメソッド。
ただし、極小値が多数ある場合、グローバルな極小値を見つけることを保証する良い方法はないことに注意してください。可能性を高めることができるだけです。