モーション作成方式の改善
モーション作成時、いままでモーションデータをパソコンから1ポーズづつロボットに送信していました。(ロボット側は受信した1ポーズを実行するのみ)
それだと、静歩行ならよいのですが、動歩行の確認はできないため、ポーズを少し変えてはマイコンにプログラムをダウンロードするの繰り返しで、効率が悪かったのです。
今回の改善で、モーションデータをパソコンから一度に複数のポーズをロボットに送信し、すべての送信が完了したときに、ロボット側で複数のポーズを再生することを可能にしました。
思っていたよりも簡単に改善できました。こんなことならもっと早くやるべきでした・・・。よくあることですね。
これでモーション作成の効率がアップです。
とりあえず、ささっと起き上がりモーションを作成してみました。この動画もパソコンからモーションデータを送ってそれを再生しています。
仰向けからの起き上がり動画
それだと、静歩行ならよいのですが、動歩行の確認はできないため、ポーズを少し変えてはマイコンにプログラムをダウンロードするの繰り返しで、効率が悪かったのです。
今回の改善で、モーションデータをパソコンから一度に複数のポーズをロボットに送信し、すべての送信が完了したときに、ロボット側で複数のポーズを再生することを可能にしました。
思っていたよりも簡単に改善できました。こんなことならもっと早くやるべきでした・・・。よくあることですね。
これでモーション作成の効率がアップです。
とりあえず、ささっと起き上がりモーションを作成してみました。この動画もパソコンからモーションデータを送ってそれを再生しています。
仰向けからの起き上がり動画
棒術
棒術ってどういう物だろう???と思い検索してみた。
揆 奮 館 流 武 術というホームページを発見。
棒術の技が、連写画像で紹介されている。
これはためになる。モーション作りの参考にします。
それにしても、棒術といえば両手をつかって棒をくるくる回すのが印象に強いのですが、あれはどうやるんでしょうかね・・・
チアリーダーとかで検索すれば出てくるのかな(笑)。
揆 奮 館 流 武 術というホームページを発見。
棒術の技が、連写画像で紹介されている。
これはためになる。モーション作りの参考にします。
それにしても、棒術といえば両手をつかって棒をくるくる回すのが印象に強いのですが、あれはどうやるんでしょうかね・・・
チアリーダーとかで検索すれば出てくるのかな(笑)。
減速処理を諦める
先週末からやっている減速処理ですが、いくらやっても効果が現れないため、打ち切りとしました。
もっとゆっくり減速制御をかけないといけないのかもしれません。
(きびきび減速できないと意味が無い・・・)
もっと高精度な角度制御を行わないといけないのかもしれません。
(かりに高精度な角度指示ができても、サーボは保持しきれない・・・)
今月中にはソフトの改善を完成させ、
来月からはモーション作成に入る予定です。
加減速処理は今回のソフト改善項目の目玉だったのですが、仕方ないです。他の目玉に迷惑をかけないためにも加減速処理は打ち切りにします。
ふぅ・・・
もっとゆっくり減速制御をかけないといけないのかもしれません。
(きびきび減速できないと意味が無い・・・)
もっと高精度な角度制御を行わないといけないのかもしれません。
(かりに高精度な角度指示ができても、サーボは保持しきれない・・・)
今月中にはソフトの改善を完成させ、
来月からはモーション作成に入る予定です。
加減速処理は今回のソフト改善項目の目玉だったのですが、仕方ないです。他の目玉に迷惑をかけないためにも加減速処理は打ち切りにします。
ふぅ・・・
減速処理
減速処理がうまいこと機能しない・・・
減速ってどうやればよいのだろう???
目指しているのは素早いけどもスムーズな動作。出来るだけでいいの。
静歩行では左右の体重移動が必要ですが、今までは、その際に体重移動にかかる時間を長くして目的位置到着時の振動を減らしていました。
そうじゃなくて、目的位置付近のみゆっくり動作させて振動を減らしたいのです。
たとえばですが、今までは、
動作開始→30%,30%,30%,30%,30%,30%,30%,30%,30%,30%→目的位置
としていた所を
動作開始→100%,100%,60%,30%,10%→目的位置
といったことをすれば振動が少なく停止でき、且つ、早く到着できるのかなと思ったのです。(%はサーボの動作速度を表しています)
実際に試してみたのが、以下のパターン。
動作開始→100%,100%,84%,80%,75%,67%,33%,25%,20%,16%→目的位置
動作開始→100%,100%,80%,75%,67%,50%,50%,33%,25%,20%→目的位置
動作開始→100%,100%,96%,92%,84%,67%,33%,16%,8%,4%→目的位置
100%の数は適当に表現しています。(実際には12個ぐらい)
一回の指示は19.2msです。上記の例だと10回なので192msぶんです。
で、効果のほどは・・・まったく効果なしです。
あらら・・・
僕は減速処理の考え方が間違っているのかな?
それとも減速制御を150ms程度で実現することに無理があるのかな?
それともプログラムは減速制御処理ロジックを通ってないのかな?
思っていた以上にコーディングに時間がかかったんだけどな・・・(涙)
減速ってどうやればよいのだろう???
目指しているのは素早いけどもスムーズな動作。出来るだけでいいの。
静歩行では左右の体重移動が必要ですが、今までは、その際に体重移動にかかる時間を長くして目的位置到着時の振動を減らしていました。
そうじゃなくて、目的位置付近のみゆっくり動作させて振動を減らしたいのです。
たとえばですが、今までは、
動作開始→30%,30%,30%,30%,30%,30%,30%,30%,30%,30%→目的位置
としていた所を
動作開始→100%,100%,60%,30%,10%→目的位置
といったことをすれば振動が少なく停止でき、且つ、早く到着できるのかなと思ったのです。(%はサーボの動作速度を表しています)
実際に試してみたのが、以下のパターン。
動作開始→100%,100%,84%,80%,75%,67%,33%,25%,20%,16%→目的位置
動作開始→100%,100%,80%,75%,67%,50%,50%,33%,25%,20%→目的位置
動作開始→100%,100%,96%,92%,84%,67%,33%,16%,8%,4%→目的位置
100%の数は適当に表現しています。(実際には12個ぐらい)
一回の指示は19.2msです。上記の例だと10回なので192msぶんです。
で、効果のほどは・・・まったく効果なしです。
あらら・・・
僕は減速処理の考え方が間違っているのかな?
それとも減速制御を150ms程度で実現することに無理があるのかな?
それともプログラムは減速制御処理ロジックを通ってないのかな?
思っていた以上にコーディングに時間がかかったんだけどな・・・(涙)
ジャイロセンサの取り込みPart2
ジャイロの取り込みに成功しました。
わかってしまえばどうと言うこと無い(あたりまえ)
やはり、タイマBのパルス幅の計測というのは、立上がりから立下り間(HIレベル)のパルス幅と立下りから立ち上がり間(LOレベル)のパルス幅の両方が計測されます。
ジャイロ信号取り込みで必要なのは、HIレベルパルスのパルス幅計測。
HIの計測値なのかLOの計測値なのかは、SISOさんに教えていただいたように、閾値以下ならHI(計測値として採用)とし閾値以上ならLO(計測値として不採用)としました。
また、採用不採用の判定タイミングを、レベルの切り替わり時に行うようにしました。これで、いつも最新の計測値を使用することができます。
まず、初期化処理。
// ジャイロ用タイマの設定
m_usTb1 = 945 ;
m_usTb2 = 945 ;
tb1mr = 0x8a ;
tb2mr = 0x8a ;
tb1ic = 0x06 ; // 割り込みレベルを設定
tb2ic = 0x06 ; // 割り込みレベルを設定
tb1s = 1 ; // 計測開始
tb2s = 1 ; // 計測開始
です。m_usTb1とm_usTb2は計測値のバッファ(グローバル変数)です。初期値として適当に値を代入しています。計測開始から実際の計測結果が出るまでの40msぐらいは、ここで設定した初期値を使用することになります。
そして、割り込み処理。
void TimerB1()
{
if( tb1 < 5000 ) {
m_usTb1 = tb1 ;
}
}
当然TimerB2用の関数も必要です。
とりあえず閾値を5000にしてみました。
これでジャイロの取り込みは大丈夫な感じです。
次に、この値を状態制御にフィードバックさせる必要があるのですが、それは後回しにすることにします(笑)。
そのまえに、やるべきことが山積み・・・
わかってしまえばどうと言うこと無い(あたりまえ)
やはり、タイマBのパルス幅の計測というのは、立上がりから立下り間(HIレベル)のパルス幅と立下りから立ち上がり間(LOレベル)のパルス幅の両方が計測されます。
ジャイロ信号取り込みで必要なのは、HIレベルパルスのパルス幅計測。
HIの計測値なのかLOの計測値なのかは、SISOさんに教えていただいたように、閾値以下ならHI(計測値として採用)とし閾値以上ならLO(計測値として不採用)としました。
また、採用不採用の判定タイミングを、レベルの切り替わり時に行うようにしました。これで、いつも最新の計測値を使用することができます。
まず、初期化処理。
// ジャイロ用タイマの設定
m_usTb1 = 945 ;
m_usTb2 = 945 ;
tb1mr = 0x8a ;
tb2mr = 0x8a ;
tb1ic = 0x06 ; // 割り込みレベルを設定
tb2ic = 0x06 ; // 割り込みレベルを設定
tb1s = 1 ; // 計測開始
tb2s = 1 ; // 計測開始
です。m_usTb1とm_usTb2は計測値のバッファ(グローバル変数)です。初期値として適当に値を代入しています。計測開始から実際の計測結果が出るまでの40msぐらいは、ここで設定した初期値を使用することになります。
そして、割り込み処理。
void TimerB1()
{
if( tb1 < 5000 ) {
m_usTb1 = tb1 ;
}
}
当然TimerB2用の関数も必要です。
とりあえず閾値を5000にしてみました。
これでジャイロの取り込みは大丈夫な感じです。
次に、この値を状態制御にフィードバックさせる必要があるのですが、それは後回しにすることにします(笑)。
そのまえに、やるべきことが山積み・・・

