SISO-LAB不定期TOPIC Nov.2003


2003/11/30

週末は脚の設計だぁ(メカ設計苦手カモ)

今週末は、「とにかくメカを作ろう〜」と思って、ひたすらメカ考えていました。これまでで、だいたいの構想は練ってきていたので、これを具体化です。具体化っていうのは、要は、ABSを加工するための「型紙」作りです。うちでは、カットはPカッター、穴あけは普通の電動ハンドドリル(電動ドライバ兼用タイプ)、整形はヤスリなので、この型紙が大事なのです。

LilliCad
20031130P00.JPG設計と、それを型紙にするために、うちで大活躍しているのが、このLilliCadです。「らんゆうソフト」さんが配布してくださっている二次元CADなんです。ご存知ですか?ROBO-ONEで、とても滑らかに歩くロボット、「Brownie」の製作者の方のホームページです。すごいですね〜、ロボット以外にも、こんなすごいソフトが作れるなんて…と思ったりしています。

ホームページの下の方に「地下研究室」があって、そこをたどっていくとロボットの製作日記とかあったりします。

このソフト、いくつか使ってみたCADソフトの中で、「すぐに使えた」ソフトでして、自分と相性がいい感じがしていますので、前回からずっと使っています。

この絵は、型紙製作中の画面です。この部品の周りの3本線は…実は、ツールパスです。「手でPカッターにツールパスなんているの?」といわれそうですが、これが書いてあると、とても加工が楽です。

後でヤスリがけするときに、本来の大きさよりも少し大きめに切るわけですが、これがなぜか難しいんです。不思議です。どうしても切り口が曲がっていってしまうんです。正確に言うと、本来の線によっていってしまうんです。だから、余分なサイズで切る分もちゃんと書いておき、これをなぞるように切るわけです。一度お試しあれ。ちなみに、この余白の一本は0.5mmです。Pカッターでうまくカットすると、0.5mmの溝ができます。んで、これに0.5mmの余白を持たせています。結構きわどいですが、Pカッターで切るときに、なるべく垂直に切るようにすると、結構、大丈夫です。やすりがけも大変ですから、早く作るためには、削る面積を減らす方がベターです。

2003/11/27

引き続きGWS MICRO MGをバラしてみました。

うーん、インターネットに気軽にアクセスできるって、なんてすばらしいことなんだ〜と、ネットのある生活を実感しながら、今日もごきげんです。

GWS MICRO MGちぇ〜く
さて、本日はS03Tと一緒に購入したGWS MICRO MGをバラしてみました。今日も血沸き肉踊ります〜。ちなみに、「MG」はメタルギアです。スペックは、サイズ:28x14x29.8mm、重量:28g、性能:0.14sec 6.40kg-cmってところです。

20031127P00.JPG - 12,865BYTES
20031127P01.JPG - 9,852BYTES

■MICRO MGを外から眺める
まずは例によって広げた写真です。これで一式全部です。サーボホーンが棒タイプばかりです。なんとなくの気分の問題かもしれませんが、やっぱ小型円形ホーンが欲しいなぁなんて思ってしまいます。

サーボ固定用の部分が、他のサーボと違う感じです。この穴、3.9mmぐらいで、手持ちの4mmのカラーがちょっとはまりません。4mmビスでねじ込むとネジが軽く切れて、いいかも。でも重くなりそうですね。サーボホルダとかではどうやって固定しているんでしょう?参考になる資料が無いので、4mmドリルで穴を広げて、4mmのカラーかませることにしようかと思います。

 

20031127P02.JPG - 10,416BYTES

■MICRO MGを中から眺める
せ、狭い。ぎちぎちです。ギアとかモータ、サーボケースの方が少し曲線デザインになっていて、ぴったりと収まっています。う〜む。今回は、ケースをバリバリに加工して作ろうと思っていたので、誤算!です。これもベアリングが2つ入っています。すばらしい!しかもギアはオールメタルです。ちょっとぐらい無理しても大丈夫かな〜。制御基板ですが、S03Tより部品点数が多いです。でも、1つ1つの部品は小さいので、サイズは小型です。

■MICRO MGを線から眺める
さっそくパルスを入れてみました。まずは中立。あたりまえですが動きました。最小〜最大ですが、0.5〜2.35msecってところですね。動作範囲は180度ぐらいかな。S03Tの方でも「180度」と書きましたけど、実際にロボットを組むとき、サーボホーンの取り付け位置とかで、結構、欲しい位置で180度確保できないことが多いです。そのあたり、設計で要注意です。

 

2003/11/26

GWS S03Tをバラしてみました。

やっとaDSL開線!
やっとaDSLがつながりました。さ〜て、これからホームページめぐりをするぞ〜。思えば長かったです。でも、なんとなくマシンの設計が思ったより進んだような…。

GWS S03Tちぇ〜く
さてさて、ホームページめぐりをする前に…ちゃんとお金も払い込んで、自分のものになったS03Tを、さっそくバラしてみました。血沸き肉踊ります〜。バラしたあと、ちゃんと戻るかな〜。

20031126P00.JPG - 12,674BYTES

■S03Tを外から眺める
いきなり分解写真を載せるのもなんなんで、まずは広げた写真です。これで一式全部です。サーボホーンはいろいろありますね〜。普通に工作に使ってもよさそうです。

外形ですが、横から見ると極めて正方形です。でも良く見ると少し俵型になっているような気がします。測ってみると、0.5mmぐらいですが、やっぱり少し俵になっていました。

20031126P01.JPG - 8,993BYTES
20031126P02.JPG - 8,471BYTES

■S03Tを中から眺める
おお、やっぱり!ベアリングが2つ入っています(下の写真)。なんかこれだけで「お買い得〜」って感じです。GWSは、2BBっていう名前がついていると、「2つのボールベアリング」という意味なんですが、知らずに買った…というか、安いからついてないだろうなぁって思って買ったこれについているとは!うれしい誤算です。ちなみに、PARK HPX BBというは、「ボールベアリングが1つ」という意味です。

制御基板はちょっと安っぽい(無骨に取り付けられた電解コンデンサが、そんな感じ。すいません、写真とるの忘れました)感じですが、電子回路はよくわからないので、よしとします。中は結構、余裕があります。

■S03Tを線から眺める
「線から」ってなんじゃそりゃ?って感じですが、「外から」、「中から」と来たので、ついつい文字数合わせしたくて、ちょっと苦しいですが、このように書いてみました。「制御してみる」ってことです。さっそくパルスを入れてみました。まずは中立。あたりまえですが動きました。じゃあ、パルスの短い方はどこまでいけるのかな〜?(緊張!)0.55msecまで素直にいきました。じゃあ大きい方は〜?(再び緊張!)おお、2.48msecでもブルブルせず、何気に動いています。角度は180度越えてる感じです。うーむ。たまたま手にとった1つがそうなだけかもしれないので、後で、動作チェックがてら、他のも調べてみます。

でもすごいなぁ。とはいっても、PARK-HPX、S03T、MICRO MG(全部GWS)しか知らないので、他のがどうなのかはわからないんですが、180度は動かないっていいますから、やっぱすごいんでしょうね〜。

 

 

2003/11/24

かかか、買っちまったゾ、サーボ

相変わらず電話回線ですが
20031124P00.JPG - 16,532BYTESサーボ到着で「勢い」めちゃアップしていますので、電話回線の遅さにも負けず、ホームページアップデートです。 サーボいっぱい買っちゃいました。買ったのは、GWS S03TとGWS MICRO MGです。購入は「浅草ギ研」さんからです。ホームページから発注したら、翌日、すぐに到着してしまいました。ありがたい!です。浅草ギ研さん、火曜日にはお金振り込みますからよろしくお願いいたします。

サーボの構成ですが、脚関係のロール軸と腰はS03Tで、その他はMICRO MGと手持ちのPARK-HPXで構成しようと思っています。

そんなわけで、オプティカル・センター・ポンチ、マイコンその他部品購入ときまして、当初の目標、「第5回ROBO-ONEには、新規投資は3万ぐらい」というのは、あえなく撃沈しました。しかし、今度は今度で、かなりおもしろいマシンになると思いますので、それ相応の価値はある予定です。まだ設計中ということで、サーボが既に届いているにも関わらず、「あとS03T2つ増やしたいなぁ」なんて思っています。設計しながらだと、いけないですね!でも、採寸しないと設計できないので、発注しないわけにもいかないので。このあたりが、歴史が浅いSISO-LABのつらいところです。

さて、せっかく?ですので、後で、サーボをばらしてみたいと思います。あれ?この型番って、2ベアリングタイプ???\1800で2ベアリング?え〜、え〜???

 

2003/11/23

脚サーボ、速度けっこう要るカモ。

開線まで、なかなか時間がかかりますな〜
どーも、あいかわらず電話回線で、ちんたらちんたらとアップしています。 ネットワーク開線まであと3日です。そんなわけで、みなさんのホームページも少ししか見れていないです。なんかaDSLとか慣れちゃうと、電話回線って耐えられないですね〜。家の方はだいぶ落ち着きまして、ようやく、少しだけロボットが広げれるようになってきました。かっちょいい作業場所作っている時間が無いので、ちょっと効率は落ちますが、小規模に広げて製作続行したいと思っています。ソフトの方は、時間をみつけてこちょこちょと作っていますが、マイコンの電源、どこにしまったっけ〜とか、テスターが見つからないよ〜と、やっていて、これまた効率いまいちです。しくしく。

次期マシーン
ようやく引越し先での生活が落ち着いてきましたので、そろそろマシンの方も手をつけようと思っています。しか〜も、もう、ROBO-ONEのエントリーも始まっているようですし、アセアセです。さてさて、今回のコンセプトは…もちろん「寂しい制作費でも元気に動けるロボット」です。でも、今回はマシン製作に時間をあまり取れないので、作戦要検討です。

G-Tune(2003A)と同じコンセプトの「新逆間接リンクロボットを作る!」のが一番やりたいことなんですが…やっぱサーボのパワーが無いところとかカバーしやすく(なんといっても電源無しで立てますから)、また、軸がダブルになるため強度も高くしやすいので、非常に低価格ROBO-ONEマシン向きだと思っています。しかし結構部品点数が多く、また設計が複雑になるので時間的にきつそうです。「G-Tuneを改良」というのも…第4回ROBO-ONEのみなさんのパフォーマンスを見ていると、もう「元気に動けるロボット」というところで苦しいものがあります。それぐらい刺激的でした。ほんと、ため息でちゃいます。SISO-LABマシンも、いくら安ロボットとはいえ、世の中の流れについていかなければ、魅力半減です。

というわけで、部品点数やめんどくさい加工を減らすため(ホントか!?)、リンク無しフルサーボロボットで行こうと思います。今度は、「寂しい制作費」維持のために部品選定で苦労しそうですが、ウケるかもしれないのでこれで考えていくことにします。また、新規投入コストは上がってしまいますが、トータルは安くいけるよう、いろいろ考えようと思います。あまり格闘に強くなくとも、ハイパフォーマンス狙っていこうとおもいます。デザインは…悩み中ですが、ヒューマノイドで行くか、G-Tuneタイプで行くか、うーむ。やっぱ、前回でイメージついちゃっているんで逆間接がいいですかね〜。(参加するのをやめようとは、全然思っていないSISOです(笑))そんなこんなで、昨日、大量のサーボが仮SISO-LABに…届きました。ご報告は、また後日。

安いサーボで歩けるか?
じゃあ、安い部品探し!というわけで、まず目をつけたのが、GWS S03Tです。例によってGWSです(笑)。以前は、取り扱っているのは「浅草キ研」さんだけでしたが、今は、「ツクモロボット王国」でも扱っているようです。でも、ラインナップ、商品紹介文章も同じような…。このサーボのスペックは、6V時、8.0Kg-cm、0.27sec/60°です。これでお値段\1800。遅いです。安いです。うーむ。

どれくらい遅いかというと…電源が若干電圧が落ちたことを考えて、仮に0.3secで動作したとして360度回ったとすると(360度は回りませんけど、イメージのためです)、2秒弱で一周することになります。おお、そう考えるとけっこう遅い!ですね。これで二足歩行できるかどうか、机上で考察してみたいと思います。

脚のピッチ軸に要求されるサーボ動作速度
歩行する場合、やっぱ一番速度が要求されるのは、脚それぞれのピッチ軸(前後に動く軸…違ってたらお手数ですがご指摘願います)だと思います。SIPHAシステムには、一応、ピッチ軸だけですが脚の座標から角度計算するプログラムが載っていますので、これをそのまま使って軌道計算してみました。そんなわけで、精度はご容赦ください。ロボットの条件…腿−膝、膝−足首の軸間はそれぞれ60mmとします。また、負荷による云々とかはとりあえず考慮無しで、指示値がどうでるか?というところだけ考えてみます。うーむ、こうやって考えてみると、SIPHAシステム、結構、賢い!(自画自賛)でも、3mm近くずれていることが発覚しました。今後の課題です。

それぞれの角度は、直立のとき、0度。屈伸すると、腿が−方向、膝が+方向、足首が+方向に角度変化します。グラフは青色…腿、黄色…膝、赤色…足首です。縦方向は角度を表し、横方向は20msec毎のステップ数を示します。精度低いので、もっと精度を上げるとまた違った答えがでる可能性があると思うのですが、ちょっと時間が取れないので、これぐらいで勘弁してください。脚を前に出した状態から、0.5secで後ろまで水平に移動し、0.3secで脚を持ち上げ、0.2secで再び前に出した位置に降ろします。

以下に検証結果を書きますが、結論としては、結構、しんどいですね〜。使う場所によってはいけそうですが、膝は無理っぽいです。これ以上はツメませんが、最大角度変化は、脚を上げ始めるときに発生していますから、脚を上げる高さとか、前後に開く配分とかを調整すると、もう少し楽な結果がでてくるかもしれません。計算精度低いので、あくまでもご参考用ですよ〜。また、この考察で、膝にはまったくダメそうなことがわかりましたが、脚のロール軸や腰などはそんなに速度が要らないと思うので、使えそうです。

20031123P00.GIF - 7,460BYTES

腿軸を110mmの高さにして、脚を前に10mm、後ろに20mmの歩幅30mmとした場合で、脚を20mmまで上にあげ、これを1秒2歩(片足の1動作が1秒で終わるということです)で歩行した場合の、サーボ指示角度計算結果は左のとおりです。

これを見ると、膝が一番一生懸命動いていますね。んで、膝の最大角度変化が20msecで6度になっています。腿が4度、足首が3度となります。

ということは、腿=0.3sec/60deg、膝=0.2sec/60deg、足首=0.4sec/60degということになります。

20031123P01.GIF - 7,159BYTES

さらに110mmの高さで、脚を前に20mm、後ろに30mmの歩幅は夢の50mm!にした場合で、脚を20mmまで上にあげ、これを1秒2歩で歩行した場合のサーボ指示角度計算結果は?左のとおりです。

あら?腿が4度、膝が6度、足首が4度、30mmの歩幅と比べても、意外に大きくならないもんですね。計算誤差なのかな?でもグラフ(上のグラフとスケールが変わっちゃってすいません。固定する方法がわからないんです)と比べると、全体的に忙しい感じです。

とうわけで、腿=0.3sec/60deg、膝=0.2sec/60deg、足首=0.3sec/60degです。

 

2003/11/19

引越しましたがネットワーク未だ開線せず…

aDSLって、そうなの〜???
どーも、お久しぶりです。無事引っ越しました。し、しかし〜、aDSLがつながりません。おかしいなぁと思って問い合わせをしたら、電話番号が変わらなくても引っ越したら、再工事してもらわないといけないんですね!知らなかったです。電話番号が変わらないので、大丈夫大丈夫と、タカをくくっていたら、そういうことでした。
そんなわけで、電話回線で、ちんたらちんたらとアップしています。かろうじて「ONOの電脳壁新聞」だけはチェックしたんですが、ああ、チェックしたいホームページが一杯あります〜。でももう少し我慢することにします。

とりあえず、ダンボールはすべて片付けたんですが、まだまだ片付いていないものも多いですし、ロボットの部品に至っては、全然広げられていません。しか〜し、ふっふっふ。家具とかを置いているうちに、目立たないちょっとしたスペースができていることを発見!当初予定では、大々的に、かっちょいい〜家具調SISO-LABを考えていたのですが、結構、製作に時間がかかりそうなので、とりあえず第5回ROBO-ONEに向けての開発作業は、ここで我慢しようかなぁ。以前のようには部品を置けませんが、ちょっと工夫すれば、なんとかロボット製作再開できそうです。早いところ、こまこましたものも片付けて、SISO-LAB再開にこぎつけたいです。

 

2003/11/15

新Action Script実行エンジン、ちょいと動かしてみました。

本日の我が家の状況
引越し前日です。ああ、落ち着かない。でも明日の午後からなので、ネット環境はまだ残してあります。うちは荷物が少なく、しかも引越し先が近所なので、引越し屋さんから「半日で終わりますよ」とのことで。でも、引越し始めたら、しばらくネットにつなげないかもしれないので、ホームページの更新が無くともご心配なく。

新Action Script実行エンジン
20031115P00.GIF - 19,287BYTESなんでこういうタイプのソフトモジュールを「エンジン」というのかはよく知らないんですが、よく使うので、ちょっとエンジンなんていってみましたが、先日、書きましたAction Scriptの新仕様、さっそく実装してみました。良好良好。とりあえず、パソコンからメモリに転送し、それを実行するところまでできました。

Coreソフトの方にあわせて、Termソフトの方にも転送機能を追加したのですが、単純に、Action Scriptの書かれたテキストファイルを読み込んで、それを選択してH8/3664へ転送し、それを実行させるっていうだけのものです。

今のところ、特に不便を感じないので、グラフィカルな動作エディタみたいなものは作らず、テキストで書き上げたものを、バイナリデータに変換して送り込むソフトで行こうと思っています。画面は、デバッグ中の表示イメージです。読み込まれているAction Scriptがコメントとともに表示されているのがわかると思います。

さてそのテキストファイルのほうはどうなったかといいますと…こんな感じです。

[000]	屈伸
CDP2, DLFT, MLNR, MLNR, 50, 100, 0
CDP2, DRGT, MLNR, MLNR, 50, 100, 0
CSQT, 50
CDP2, DLFT, MLNR, MLNR, 50, 120, 0
CDP2, DRGT, MLNR, MLNR, 50, 120, 0
CSQT, 50
CRIJ, PCNT, PCNT, PCNT, PCNT, 1, 255
CPOS, LS,   MLNR, MLNR, 25, 30
CPOS, RS,   MLNR, MLNR, 25, 30
CSQT, 25
CPOS, LS,   MLNR, MLNR, 25, -30
CPOS, RS,   MLNR, MLNR, 25, -30
CRIJ, PCNT, PCNT, PCNT, PCNT, 8, 255
CPLS, OF, OF, OF, OF, OF, OF, OF, OF,    OF, OF, OF, OF, OF, OF, OF, OF
  • 1行目…Action Script番号を示します。後ろの文字列はコメントです。
  • 2行目…CDP2っていうのが、XZ座標系で脚位置を指示するものです。DLFTは左足、MLNRは、直線的加速で動作開始、次のMLNRも直線的減速で停止。その次の50は、50 Step(サーボ制御周期)で動作、100と0はX、Z座標です。
  • 3行目…1行目と同じですが、DRGT、これは右足を示します。
  • 4行目…次の行の実行を50 Step後に行います。
  • 5〜7行目…2〜4と同じですが、X座標が120ということで、100mmから120mmへ脚を伸ばします。
  • 8行目…プロポからの信号を読み取って、すべてセンターだったら先頭(2行目)へ、そうでなければ次の行へ進みます。
  • 9行目…CPOSは、サーボを角度指示するコマンドです。LSはLeft Shoulderの略で、左肩です。直接サーボ番号もかけるようにしたのですが、画面表示用にサーボIDを表示できるようにしたので、サーボIDでも表記できるようにしました。
  • 10〜14行目…既に説明済みなので説明省略
  • 15行目…サーボ制御パルスOFF!

見たいな感じです。こんな感じで今までやっていたことは一通りいけそうです。その他、条件ジャンプコマンドに、いろいろいれて拡張していけたらなぁと思っています。後は、これをI2C EEPROMに書き込みできるようにし、それを読み込み実行できるようにすれば、動作処理については実装完了ってところです。この先のアイデア(というか既に実装しかけていたりするんですが)としては、センサー入力値による分岐、センサー入力による値のオフセット、他のスクリプトへのジャンプなんてのを考えています。

 

2003/11/14

サーボ軌道補完プログラムの距離計算を1桁アップ…効果あり

20031114P00.GIF - 4,605BYTES1桁アップでなめらか〜
座標系によって指示する方のサーボ軌道補完プログラムで、距離を扱っている部分を1桁上げてみました。今まで「60mm」を表記するのに「60」として計算していたところを「600」にしてみました。これで、「0.1mm」まで扱うのと同等の結果が得られます。結果は、左の図のとおりです。例によって屈伸したときの2つのサーボの動作指示値グラフです。上が以前から使っているタイプ、下が1桁増やしたタイプです。グラフ上、ぐぐっとよくなりました。気を良くして、G-Tuneを実際に動かしてみたところ、「う〜む、すばらしい」って感じです。あとは角度の方も、もう1桁あげれるんですが、ちょっとめんどくさそうなので、これぐらいにしておくことにしておきます。

先日計算したときの値を忘れてしまったので、同じ値で計算したものを比較用に両方載せました。

平方根計算ルーチンの改良
さてさて、こそこそっと直したところが1つあります。1桁増やしたことで、平方根を求めるプログラムがすごくずれるようになりました。もともと、62500(250^2)の精度しかありませんからしょうがないですが、これを2500^2まで対応できるようにしました。ニュートン法というのは、計算するときの初期値が大事なので、1〜62500までの平方根を求めるときは初期値を1、それ以上のときは初期値を250にするようにしました。これで、整数においては、2500^2まではズレが発生しません。ちなみにループは10回でやっています。最初は、もっと細かくやらないといけないのかな〜と憂鬱だったんですが、やってみたらこの程度で収まり、よかったです。

 

2003/11/12

Action Scriptデータ構造考え中

眠い…
うぅ、最近は、引越し準備であっちこっち買い物に行ったり遅くまで片付けたりで、なんかだいぶつかれている感じです。昨日は昨日で仕事がトラブってちょっとバタバタしまして、さらにお疲れ〜。でも、今日も、お弁当に「大根の煮付け」が入っていてごきげんです。お弁当は妻が作ってくれるのですが、昔から大根の煮付けという食べ物、とても好きでして、肉料理よりも大根の煮つけが好きな子供でした。大根の醤油で染まったあの自然な透明感、ほおばったときに口の中で形の崩れていく感触、ぴりっと効いた唐辛子、その後、口の中に広がる、なんともいえない味わい。たまりません〜。

この大根の煮付け、実は最近まで、自分が大好きだったということを忘れていました。一人暮らしを始めたころからかな。その後、結婚して、妻が、私の母親から聞いてきて作るまで。忙しいという字は、「心を亡くす」と書きますが、ほんと、いろんなことを忘れちゃうもんですね〜。ここ1年は、以前より仕事が落ち着いているので、だんだん取り戻していますけど。それ以前はほんとひどかったです。

新Action Script仕様
そんなわけで、ちょっとした時間でソフトの方、ごちゃごちゃと作っています。今日は、サーボ動作などの指示スクリプトを表記する、Action Script (SISO-LAB用語)の新仕様を考えてみました。前回は、1レコードに、スクリプトID、実行開始時間、実行時間、動作目標角度、補完モードなどを全部入れてまして、1レコードあたり12バイトほど使用していました。1レコードでサーボ1つ動作します。これで実際に動作スクリプトを作ってみたら、いろいろ気づいたことがありまして、改善点、前回良かったと思って仕様キープする点をちょっと書き出してみました。

  • 実行開始時間とかを全レコードに入れる必要はない感じ。それよりは、実行開始時間を指定できるレコードがあった方が使いやすい。
  • スクリプトを作っている最中に、前の方に動作を挿入したい場合に、絶対時間指定だと後ろのレコードにある時間を全部ずらさないといけないので、相対時間の方がメンテがラクチン。
  • 角度指定(サーボパルス数指定ではなく)で書けるのはとてもいい。
  • 脚の座標指定ができることは成功だった。
  • プロポの状態で、次に実行するレコードを指定できたらもっとプログラム楽になりそう(歩行動作で、途中で歩行動作キャンセルなどの動作が、定義だけでできるようになる)。
  • サーボ制御信号ON/OFFは、一度に全サーボ指定できた方が便利。
このあたりを考慮して、現在設計中ですが、今度は1レコードあたり4バイトで収まりそうなのでいい感じです。おかげでデータがちょっと複雑になってしまい、説明が難しいので今回は載せるのをやめておきますが、いずれ説明とともに載せたいと思います。

専用のエディタとかまで作れれば、「相対時間の方がいいかなぁ」とか言わなくても、プログラム一発で「挿入」とかできるんですが、なかなか大変そうなので、今のところ、テキストファイルで作成して、それをロードしています。

サーボの角度からパルス幅への変換ですが、データとして、「基準位置パルス幅」、「90度動かすのに必要なパルス幅」(正負を持ち動作方向についても意味がある)を持たせて計算することで実現しています。計算は…パルス幅=指示角度×「90度動かすのに必要なパルス幅」/90+「基準位置パルス幅」で求められます。サーボによって、少しズレがあったり、なんとなくなんですが、使っているうちにずれてくることがあるので、このようなアジャスト機構(プログラム)を載せておいたほうがいいですよ。あと、サーボを取り替えたときには、「基準位置パルス幅」によって0度の位置を調整できるので、とてもいいです。サーボって取り替えると、必ずしもサーボホーンが同じ位置になってくれるわけではないですので。

角度で動作を作っていくと、非常にイメージしやすいのでお奨めです。また「動作方向についても意味がある」の動作方向についてですが、簡単に言えば、30度!と入れたときに、パルス幅を基準値からマイナスして作るのか、プラスして作るのか?という仕掛けです。これが設定できるようにしておくと、「右肩も左肩も+30度とすれば前に動作」なんてのができますので、さらに簡単になり、動作作成時間の短縮になります。

2003/11/09

SINとかCOSとかH8/3664に載せてみましたデス

高速演算プログラム
SH7074F版で実装していた、高速演算プログラムを移植してみました。テーブルを多用していたので、プログラム容量が心配でしたが、ここまでのプログラム、全部あわせて13KByte程です。おおっ、まだROMの容量にまだまだ余裕があります。しかも、残っている作業もまだまだあります(@_@)。「ここまで」っていうのは、サーボ制御、プロポ信号取り込み、サーボ軌道補完、メンテ用シリアル通信…ぐらいです。さてさて、HIP(High-speed Integer Processor)と名付けられたこの高速演算プログラム、「G-Tuneソフトウェア」では、あまり細かく解説しませんでしたが、気になるスペックは次のとおりです。

SIN…がんばってテーブル実装(0.1度単位で精度4桁)
COS…SINを90度ずらしてCOS。あたりまえだけどちょっと知的。
ATAN…これまたがんばってテーブル実装(0.000〜1.000)
SQRT…超手抜きニュートン法、0〜62500(250^2です)までの整数のみ。

おまけで「座標回転」、「直線の角度計算」、「2つの円の交点計算」なんてのがあります。おお、これだけあれば…そうです。アレです。G-Tuneは、低精度ですが、それなりの計算によって脚が動いています。さらに、これもまた手抜きで、横から見た2軸しか計算していないのですが、それでも、動作データを作るとき、「脚を前に2cmだす」なんても簡単に指定できるので、楽チンです。特に「脚を斜め前に上げる」なんていうのは、「作ったかいがあった〜」と思える至福の瞬間です。1つの動作コマンドだけで、サーボが後ろに動いたり前に動いたりして目標座標まで「つま先」が進んでいきます。そんなわけで指示がすごく簡単で、短時間で指示パラメータの決定ができるため、前回、G-Tuneが短期間で歩けた理由の1つだと思っています。

今、気づいたのですが…高速とうたいながら、速度を測ったことがありません!こんど測ってみることにしますけど、とりあえず、サーボパルス制御の隙間で計算するのに間に合ってます。

20031109P00.GIF - 4,308BYTESG-TuneのXZ指定?サーボ動作補完のデキ
第4回大会のときは、「な〜んかギクシャクしているなぁ、なんでだろう?」と思っていただけなのですが、エミュレータで出力データをよくみていると、結構、データ自体ががくがくしていますね〜(「前はやらんかったのか?」と言われると…あまり細かくは検証していませんでした。はい。)左の絵は、G-Tuneの脚モデルです。G-Tuneは並行リンクを使っていますので、左図の場合、緑のところにしかサーボがついていません。最大屈伸したときのサーボ指示値(縦軸5000で2.5msec)をグラフ化してみました。どうです?かなりがくがくしています。自分で言うなぁって感じですけど、現実です。嗚呼。

原因は……わかりました。時間があったら改良しようかなぁって思っているんですが、2つあります。1つは「指示値だけでなく、補完計算中も1mmの精度しか持たせていない」ということと「補完計算中、角度を1度単位で扱っている…せっかくSINとかは0.1度までいけるのに」です。

単純なサーボ角度補完プログラムの方も、1度単位でしか指定できないのですが、あくまでも停止位置が1度単位であって、計算はもっと細かくやっているため、なかなか滑らかに動くのですが、こっちはすっかり改良するのを忘れていました〜。あと、屈伸とかだと目立つのですが、脚を前後させるような動きの場合は、結構スムーズに見えます。脚が「垂直」に近い角度だと、結構目立ちます。

最後になりましたが、前回、あまり気にしなかった本当の理由を言うと、がくがく動くのは「サーボがそんなもん」と思っていたからです。サーボさん、ごめんなさい…(でも、他の動きみてたってそんなに細かく動いてくれるわけじゃないし、負荷かかってると5度ぐらい指示しないと動かないし、etc...)

引越し恐るべし…スケジュール遅延危機!?
来週は、めでたく新居に引っ越すことになってまして、現在、いろいろ片づけ中……これがすごく大変です。もう既に、どのダンボールにどのパーツしまったんだっけ?状態です。さらに、家族より、新居ではちらかさないで欲しいとの強い要望がありまして、これまた、いつ広げられるかという状態でして。友人をいろいろ招いたりしたいそうな。ここんところ、休みになると作りこみが進まないのも、新しい家具とか見たり探したりで出かけてることが多いってのが理由です。

新しい生活、非常に楽しみなんですが、うぅ、予想以上にロボット製作に影響大です。もともと、引越しそのものは時間で見込んでいたんですが、引越し後のSISO-LAB再開も前途多難そうで、すぐにとはいかないかもしれないです。引越し予定の在る方、特に新居に引っ越す予定のある方は、あらかじめ対策しておきましょう。

というわけで、引越して片付けが終わったら、まずは美しい作業スペースの製作が第一課題となりそうです。以前、MFさんがやっていたように(マイクロマウス工房ここの下の方です。すばらしいですよね!)、家具+収納+作業スペースみたいなのを造らないとダメっぽいなぁ。これ、あこがれです。よし、ロボットで培った設計技術で、いっちょやりますか。

 

2003/11/07

あっちハチ/3664、今、H8/3664が熱い!

H8/3664、SH7047F並に発熱!
いきなり受けねらいのようなタイトルを書いてしまいましたが、あ、熱い。ボクのカワイイH8/3664が熱い。知恵熱がでています。いったいどうしたんでしょう?SH7407F並に発熱しています。最近、確かにプログラムに悩まされて、自分に知恵熱が出ていた気はしますが、マイコンまで出るという話は聞いたことがありません。H8/3664の電源SWは切れているし…え?切れているぞ。おかしい。H8/3664の電源は切れているのに、テスト用のLEDが点灯している。もののけでもいらっしゃるのでしょうか?そういえば、ちょっと前に近所のDVDレンタル屋が80円キャンペーンやっていて「もののけ姫」は借りて観ましたけど…。何か宿ってしまったのでしょうか?

よくよく見てみたら、サーボの電源が入っていました。どうもサーボ電源が入っていて、H8/3664の電源を落とすとすごく発熱するようです。電流が流れ込むのかな?よくわかんないけど。SH7047Fの時はサーボをロジックICで駆動していましたので、気づかなかったのかもしれません。とりあえず、解熱処置(サーボ電源OFF)後は、無事回復したようで元気よく動いております。はぁ〜、よかったよかった。きっと、これって壊れたりするんですよね〜???もうどっか壊れているのかな?心配だな〜。

 

2003/11/05

整数型で計算するときの精度向上する計算順序

サーボ軌道計算のプログラム製作に精を出しているSISOですが、みなさんいかがお過ごしでしょうか?せっかくなので、この手の計算物のプログラムを作るときに、ちょっと注意しておくといいところをあげてみます。

サーボ軌道計算…というと、やっぱ小数点のついた計算(浮動小数点)をする方が、お手軽に精度とかでたりするんですが、そこはマイコン、パフォーマンスを考えると、結構、きついです。以前、SH7047F(RAMベースでプログラム実行)で、単純なインクリメントのプログラムを実行してみたのですが、long型のインクリメントと比較して、float型のインクリメントでだいたい20倍ぐらい、double型で30倍ぐらいの時間がかかります。コプロセッサとかあるといいんですけどね〜。

そんなわけで、多くの方は、すべて整数型で計算をされているのではないかと思います。整数型で計算する場合、小数点以下の値は無くなってしまいますので、いろいろ気をつける必要があります。例えば、もともと値を10倍とか100倍しておく方法があります。また、それ以外にも、計算順序を考慮するのがポイントとしてあります。

簡単な例として、サーボ軌道を直線で補間する例を書きます。サーボ軌道を直線補完するためには、以下のような感じの処理が一般的だと思います。

  1. 「(動作終了時のサーボ角度−動作開始時のサーボ角度)/全体の動作カウント数」という式によって、1カウントあたりのサーボ角度を求めます。
  2. これに、「軌道を求めたい動作カウント数」を掛けます。そうすることによって、角度の増減量が求められます。
  3. さらに、「動作会指示のサーボ角度」を加えることで、最終的な答えを得ることができます。

では、これをプログラムにすると…まずは変数の説明からです。lSrc, lDstにそれぞれサーボの動作開始時の角度、動作終了時の角度が入っており、全体の動作カウント数lTtlClockで、軌道を求めたい動作カウント数をlCurClockとします。

    lAns = ( lDst - lSrc ) / lTtlClock * lCurClock + lSrc;

となります。ところがこれだと、ちょっと変な結果が得られます。lSrc=10、lDst=30、lTtlClock=3、lCurClockを1〜3で変化させると、16、22、28となります。あら、最後が30になりません。うーん、どうしてでしょう。計算結果の差をみると、最初の位置から計算して、+6、+6、+6、で、挙句の果てに行ってほしい場所まで行ってくれません。なぜでしょう???これが小数点以下を切り捨てられる怖さなのです。「( lDst - lSrc) / TtlClock」のところで、ぐぐっと値が小さくなります。ここで切り捨てられた小数点下が、次の「* lCurClock」の結果にぐぐっと影響するわけです。いや〜、こういうテストするときって、GDLのエミュレート機能って、とても役に立ちます。

ポイントとしては、なるべく、式の中で常時数字が大きく保たれるようにした方がよいです。そこで、ちょっと計算の順番を入れ替えてみます。

    lAns = (lDst - lSrc) * lCurClock / lTtlClock + lSrc;

今度は16、23、30。おお、いいですね。差も、+6、+7、+7と、ゴールに向かってそれなりに均等に計算されています。これは、割り算よりも掛け算を先に行うことで、数値を一旦大きくし、小数点以下切り捨てによる誤差を小さくしているため、計算結果が良くなります。

これぐらいの式ならばすぐに気がつくのですが、これにちょっと複雑な要素を入れて長い式になってくると、なかなか見つけるのが難しくなります。最後になりましたが、オーバーフローにも気をつけましょう。

 

2003/11/04

こりゃ便利だ、GDLのエミュレータ機能

ちょいと出張行ってまして、結局、3連休にならなかったんですけど、いかがお過ごしでしょうか?

さて、そろそろという感じでサーボの軌道補間プログラムを作り始めました。与えられたサーボの目標位置と移動時間から、サーボ制御周期ごとのサーボ指示値を生成し、ソフトに動作開始終了させたり、逆にリニアに動かしたりするためのプログラムです。前回、SH7047Fでは、サインカーブを使ってソフトなスタートとかの補間指示を作っていたのですが、うちのマシンでは、あまり効能がなかった気がするので、今回はシンプルに(テキトーに)作ることにしました。

さてさて、こんなときに非常に役立つのがGDLのエミュレーション機能です。説明書を読むと「GNUツールのRUN云々」とあるので、GNUツール群の一部なんでしょうか?

GDLのエミュレータ機能
どのようなことを内部でしてくれているのかはわからないのですが、「マイコンのコア部分とメモリ・コンソールのみをエミュレート」とありますので、「割り込みやポートアクセスなどのハードウェアリソースに依存する部分はエミュレートできないけどプログラムそのものの振る舞いはOK」という感じなんでしょうか。H8/3664で、先日のsinged charとunsigned charまでちゃんと同じように振舞ってくれます。

だから、軌道生成等の計算プログラム関係のデバッグをするには最適です。

20031104P00.GIF - 7,098BYTESH8/3664のエミュレートをするためには、まず、GDLのGCCオプションから、H8TINYを選択します。これでOKです。後は、コンパイルしてエミュレート実行するだけです。ちょっとだけ注意点としては、エミュレートされたプログラムの入出力結果は、コンソール上に表示されますので、プログラムの最後に、表示結果を確認するまでウィンドウが消えないように、while(1);等の、「待ち」コードを書いておく必要があります。

また、エミュレートにてプログラムをデバッグしやすくするためには、プログラムの構成そのものを、なるべくハードウェアに依存する部分とそうでない部分を分けておくと良いです。そうすると、もとのプログラムに手を入れることなくデバッグできるようになります。デバッグですから、元のプログラムにはなるべく手を入れないようにした方が、効率が良いです。自分の場合、ソースファイルをいくつか分割して、メインとしているソースファイルにて"#include"命令で読み込ませて1つにしているのですが、このときのファイルの単位を、ハードウェアに依存するもの、そうでないものと大きく分けて、さらに細分化しています。

このため、エミュレータでデバッグするときは、ダミーのメインルーチンを書いたソースコードを用意して、そこにインクルードしてやるだけで、プログラムとして成り立つような感じで作っています。

さて、デバッグデバッグ。実行!あら???

 

2003/11/01

なんでだろう?H8/3664のcharって『うんしぐねど』?

本日は、H8/3664側のプログラミングのお話です。GDL(Version 1.5.0.18です)でC言語にてプログラムを組んでいるわけですが、ようやくプログラムの方も、多少は算術的な部分に入ってきて、マイナスを使い出しました。そしたらはまりましたよ〜。なんかcharってほかのと違うようですね…。

あ、タイトルの「うんしぐねど」は、SISOがunsinged(あんさいんど)を入力するときに頭の中でつぶやいている言葉です。ただし呼び方ではないので、決して間違えて覚えないようにしてくださいね。

サンプルプログラム
さてさて、次のようなソースコードがあります。これは、char型でcData01を、short型でsData02を宣言し、それぞれに-1を代入しています。これを、printfで表示させて、どのようなデータが入ったかを見ようというものです。printfは、エミュレータで動かすならこのまま、マイコン側で走らせるのなら、適当なものに変えてください。

    char cData01;
    short sData02;

    cData01 = -1;
    sData02 = -1;
    
    printf( "cData01代入の答え=%d\n", cData01 );
    printf( "sData01代入の答え=%d\n", sData02 );
    

まずは、心の予定からお話します。心の予定では、「すべてsignedのデータであるのだから、結果の表示は、2行とも「-1」になるというものです。実際そう思ってプログラムを組んでいたのですが…

実行結果
「なんでだろう〜」という結果になりました。まずH8/3664ではcData01は「255」になってしまいました。意外〜。そ〜してぇ、H8/3664とSH7047Fでは、結果が異なる…ということもわかってしまいました。SH7047Fは期待どおりなんですが、H8/3664はちょっとちが〜う。まあ、仕様で、きっと「char型がunsigned型の1バイトデータになっている」ということなんでしょう…。と書いているうちに、そういえば、ネットでいつか、同じようなフレーズを読んだような記憶が…。どこだっけ???

■H8/3664で実行

    cData01代入の答え=255
    sData01代入の答え=-1
      
■SH7047Fで実行
    cData01代入の答え=-1
    sData01代入の答え=-1

このプログラムで結果を見ると、見つけることは非常に簡単なんですが、これを実プログラムの中で見つけるのは大変でした(@_@)。えぇい、今日はプログラムやめやめ。というわけで、本日、ようやく角度指示(パルス数指示じゃなくて)でサーボが動くようになりました。めでたしめでたし。

 


Back Number of SISO-LAB FUTEIKI TOPIC
2003 Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov Dec.

Top Page