車両型ロボット(W6)の製作日誌 その2
製作の区切りごとに、古い物から新しい物の順に書いてあります。
2003.04.26
共通上半身
移動ユニットと共通上半身(なんかいい名前を考えたい・・・)のイメージです。
移動ユニットへのコマンドはある範囲で共通化しようと思っています。
共通化できる範囲はいろいろ考えられますが、例えば「1m前進」の様なコマンドは
クローラー、2足、4足等に関わらず使えると思います。共通化出来ないのは
「真横に移動」とか、重心の上げ下げを含む安定性を変えるようなコマンドが
脚式にあってクローラー式に無いコマンドになります。
この辺りの判断を移動ユニットに任せて上半身/頭からはただ移動方向、距離、速度だけを
与えるようにすれば、2次元移動に関して完全に互換性があるインターフェイスになると思います。
一歩進めて3次元化すると宇宙、空中、水中まで共通化できるのかなどと思いました。
こう考えを進めてみると、移動方法、場所に関する属性判断は移動ユニットがわに
出来るだけ判断させるのが良さそうな気がしました。
でも、クローラーに対して「秒速1km」みたいなナンセンスなコマンドを出さないように
頭の方もよく状況を認識しないといけませんね。
ソフト、ハードを含めたモジュール化、機能の分け方、情報伝達なんかを考えているとなかなか楽しいです。
W6は移動ユニットと上半身を6Pのフラットケーブル1本でつなぐようにしました。
今のところ2L2、4L1へ載せてみたのはイメージで、ただのせてるだけです。でも、
電源容量や積載能力から判断して多分、実際にのせられると思っています。
SFに出てくるロボットは、だいたい胴体で分断されたり、首が取れたりしても
頭に近い側が独立して動くものが多いです。W6は腕をもう少しましなものに
変えると、上半身だけで這っていく様な事も可能になるので、
ちょっとロボットのイメージに近づいたような
気がします。
頭のデザイン
正月休にロボコンマガジン館で浅草ギ研さんの生首ロボットを見て、とても面白いと
思ったので、はじめはああいったアニマトロニクス系の頭を考えて、いろいろと
絵を描いてみたのですが、どうもしっくりこないので(というか非常にブキミになったので)
惑星探査機なんかのセンサーユニットみたいな、
箱にマイコンとセンサーを入れただけの、機能性と作り易さだけ考えたものに決めました。
W6v1の仕様
大きく仕様が変わるので、名前のバージョンを上げることにしました。
旧仕様をここに残しておきます。
全高 |
245mm |
全長 |
175mm |
全幅 |
115mm |
重量 |
775g |
合計自由度 |
4 |
モーター |
首振り用 RC用サーボモーター 2個
(メーカー:三和 機種:SM-391 個数:1)
(メーカー:JR 機種:NES-305 個数:1)
走行用モーター 2個
(メーカー:マブチ 機種:FA-130 個数:2)
|
電源 |
ニッケル水素電池 (4.8V 650mAh / 動力系統)
ニッケル水素電池 (8.4V 150mAh / 超音波センサーユニット用)
リチウムイオン電池 (7.2V 1500mAh / 制御系統)
|
センサー |
C−MOSイメージセンサー(画像取込用)
超音波センサー(測距用)
(メーカー:日本セラミック 型式:T40-16(送信)/R40-16(受信))
PSDセンサー(測距用)
2軸加速度センサー(姿勢/傾斜測定用)
(メーカー:アナログデバイセズ 型式:ADXL202)
反射型フォトインタラプタ(走行距離測定用)
マイクロスイッチ(タッチセンサー用)(搭載予定)
|
CPU |
Win98 PC(Celeron 500MHz)
H8/3048F(16MHz)
|
2003.05.11
メインCPU
いろいろ考えた結果、今までの延長で使えてなるべくメモリの大きいマイコンボード
ということで、LANインターフェイス無しの方の秋月のH8/3069マイコンを選びました。
2MByteのDRAMが付いているので、結構いろいろ遊べそうだと思います。
キットにはH8OSが付いて来るので、連休中にH8OSについて一通りドキュメントに
目を通しましたが、W6v2(当面はLAN機能なし)に使うにあたっては特に魅力を感じなかったので
今までどおり、日立マイコンスクール?のHPからダウンロードしたモニタを
このマイコンボードのメモリマップにあわせてカスタマイズし、
内蔵ROMにインストールしました。
取り付け場所は、アナログ信号を出すセンサーを集中的に配置する「頭」の中を
予定しています。(アナログ信号線の長さをなるべく短くし、ノイズを拾いにくくするため)
頭のデザインは、
ゲームボーイポケットカメラから取り出したイメージセンサーのM64282FPを
左右対称に2つ内蔵する等、「顔」を連想させるようなものにしようかと思っています。
ちなみに、1つめのポケットカメラは5000円以上しましたが、最近購入した2つめ以降のものは
500円程度でした。
No.2サブCPU
H8/3664にしようかと思っていましたが、やはり双腕の軌道追従制御ていどは行いたいので
AE-H8/3067Fにして、2L2v1の脚程度には動かせるようにすることとしました。
2003.05.18
頭の製作
凝ったデザインにするのはまた今度・・・ということで箱にマイコンとセンサーを
収めました。
このあと「頭」に入れようとしているものは電子式の磁気コンパス、ピエゾブザー、
テレメータ用の無線モジュール等です。
2003.05.25
首の製作
上は床に置いた時に人の顔を見上げることができ、下は手元を見ることができるような
可動範囲を設定しました。3自由度あると動きの表情が豊かになると思いますが
当面は画像認識/空間認識/ナビゲーション等のソフト開発プラットフォームとして
動かすことを念頭に置いているので、必要最低限の2自由度としました。
直方体を基調とした、ロボットらしい素朴なデザイン・・・
頭のセンサーの動作確認
配線が出来たので通電してみました。左右のカメラ、PSDはOKでしたが
超音波センサーユニットのベステクBTE054が正常動作?していません
でした。出荷状態で60cm程の距離から出力が4.9Vに固定して動きませんでした。
コンパクトで5V電源だけで使えるので期待していたのですが、動かない原因が
不明なので、ひとまず降ろしました。
以前はPSDが直射日光の下では使えないと思っていたので超音波センサーも
積むつもりでしたが、ある程度使えるようなので、しばらく無しで行こうかと
思いました。
腕の設計
肩から先の部分を設計中です。自由度は手首を入れて片腕あたり4とし、腕の先は
両腕で挟んで物を保持するタイプを考えています。
そこで、両腕で挟んだ時の保持状態と「手探り」する時を考えて、
片腕辺り4〜10個程度の
マイクロスイッチを取り付けようと、いろいろスケッチを描いています。
2003.06.01
No.2サブCPU I/Oボードの配線/テスト
No.2サブCPUボードのI/Oボードの配線とテストをしました。始めに、初めて使う
Sipexのレベル変換ICのSP233ACPの配線を行い、メインCPUとNo.2サブCPUの
間の通信が正しく行われるか確認しました。特に問題はなかったので、SP233ACP
の使い方に誤りがないことを確認できました。
テストプログラムとしては以下の様なものを使いました。
ハイパーターミナルから'9'を入力−>サブCPUはRXD1から'9'を受け取ったらTXD2へ
'0'を出す−>メインCPUはRXD0から'0'を受け取ったらブザーを2回鳴らす
No.2サブCPUのソフト
腕の配線
2L2の脚のように、簡単に外せるようにするかどうかについて考えました。
今のところW6はロボコン参加等のために部屋から持ち出す予定がないことと、
2足ロボットの脚と同様に、腕を何回か作り直すつもりでいるため、搬送については
当面の間は考慮しないこととしました。
露出調整ルーチンのバグ修正
ロボットの外見(主に顔)
部屋に置いておくロボットの外見について作りやすさと見た目の印象の面から
考えています。ロボットの骨格が見えるまま、ガンダム系、
グラスファイバーの骨格にフォームラテックスのカバー、子供向け番組のパペット等が
思い浮かびました。私の好みとしてはパペットが良いと思いました。
2003.06.08
No.2サブCPUのソフト制作
テスト操作用画面のスクリーンショット
2003.06.15
No.2サブCPUのソフト制作
手先の軌道生成等に使うため、テーブルを使ったsin, cos, tan関数を作りました。
引数をラジアンではなく「度」単位で渡します。テーブルとしては
sinの0度から90度までの範囲を1度刻みで小数点以下5位まで持っていて、
点と点の間は1次の線形補間(要は直線でつないでいる)で求めています。
ロボットの関節計算に使うものなので、けっこう適当なプログラムです。
秋月のマイコンキットと一緒に売っていたり付いてきたりするCコンパイラ用です。
そのあと、2L1/2L2の足先の加減速パターンとしてずっと使っている
cos関数から作った加減速パターン生成関数をPCから移植しました。
ソースコードの表示(参考までにブラウザで見えるように.txt拡張子にしたソースを置いておきます)
加減速パターンのテストを兼ねて、うなずき動作を作ってみました。
W6v2をPCに接続していない時の出力の一形態としてジェスチャーを
検討しています。Yes/No、処理の成功/失敗等を表現する時に
使おうと思っています。
2003.06.22
No.2サブCPUのソフト制作
先週に引き続き、手先の軌道生成等に使うため、テーブルを使ったasinおよび
多項式の近似式を使ったatan2関数を作りました。これらも引数をラジアンではなく「度」
単位で渡します。
これら関数を利用して
ボールを拾うモーションを作ってみました。このモーションは、2つの関数から構成されています。
1つは腕を開/閉する関数で、手先の間隔などを引数にしています。そしてもう一つは、
腕を上げ下げする関数で、手先の床からの距離等を引数にしています。
テストで使っているスポンジボールは直径約10cmで、知能ロボコンのボールよりも
一回り大きなものです。W6v2の腕も、ボールも柔らかいので、腕先間隔を9cm程度に
設定すると、このムービーのようにちょうど良い握力で持ち上げられます。このまま走らせても
落とすことはありませんでした。
今後は、適当な場所に転がっているボールを発見し、決めておいた場所まで持ってくる
ようなプログラムを書く方向で進めようと思っています。
2003.06.29
メインCPUのソフト制作
No.2サブCPUのソフトは腕と首を動かすところと通信に関する
ところまで出来たのでひとまずROM化し、メインCPUのソフトにかかりました。
左目のプログラム、メインCPUに付いているプログラマブル水晶発信器とのインターフェイス
ルーチン(起動後の積算経過時間等の計測用)、サブCPUとの通信部分等細かいサブルーチンを
そろえている途中です。
テスト操作用画面のスクリーンショット
左右のカメラからの画像の中(ボールの部分)に明るいスポットがそれぞれ2つ写っています。
PSDセンサーの赤外線LEDが照らしている場所がこの様に写ります。
ここまでハッキリ出るものとは思っていませんでした。画像処理に影響がありますので
、「盲点としてソフトで処理」「撮影時はPSDの通電を止める」「積極的に利用」等
どう扱おうか考えています。
壁に沿って走る
装備されているハードの機能を使うソフトが一通りそろってきたので、壁に沿って
走るプログラムを書いてみました。3分間連続(距離にして約21mです)
で3回試してみたところでは
「だんだんと蛇行が大きくなり壁にぶつかる」といったこともなくうまく動いていました。
壁との距離の制御精度はだいたい45cm±20cmといったアバウトなものです。
2003.07.06
コンパイラ
H8用にはずっと秋月でキットと一緒に買ったCコンパイラを使ってきました。
2L1や2L2等、ロボット内蔵のプログラムがRCサーボの信号生成や
センサーとの簡単なインターフェイスの機能のみの時は、ほとんど
unsigned charとunsigned intの変数しか使わず、単純な関数しかなかったので、
あまり不都合を感じていませんでした。しかし、W6のメインCPU用プログラムのように、
いままでPCに載せていたプログラムを移植し始めると、いろいろと不都合を感じ始めました。
感じている不都合は主に関数への引数の受け渡しと、変数の型変換が発生する計算です。
しばし「なんでこれが動かないの?」みたいな挙動にあたり、プログラムを書いている時間の
半分くらいを、そういった挙動の回避するためのコーディング変更にかけているかんじです。
今のところはまだ「だましだまし、なんとかいけそう」とは思っていますが、
コンパイラにはまっている時間が惜しいので、H8/3069のキットについてきたgcc
を試してみようと思い、セッティングしドキュメントを読み始めました。
2003.07.13
PSDセンサーでのスキャン
頭を180度動かしながら、PSDセンサーで測距し、結果を
レーダーチャートの形式で画面に表示するプログラムを書きました。
線で囲まれた内側が
「障害物が無いので走っていい場所」というように解釈できます。(環境によっては)
実際のところは、頭がついている場所より低い物にぶつかったり、物体表面の状態
(極端な例では鏡面とか)によっては正しい距離が測れなかったり・・・と、
このデータだけで部屋を自律走行させると、けっこう良く行動不能になります。
W4では、この図形の認識プログラムの作成をずいぶんやりました。
結局たいした成果は得られなかったのですが、W6に反映させてゆこうと思っています。
2003.07.20
露出調整ルーチンの改善
露出が多い時はシャッター速度を半分、少ない時は倍という方法でやっていましたが、
いつまでも目標の前後で振動して止まらない様な状態がしばし起きていました。
これを改善するため、目標を行き過ぎたとき、多くなった時は75%、少なくなった時は
150%のシャッター速度にする様に改善しました。目標値の幅との組み合わせが
前よりよくなった様で、今のところ振動現象は収まっています。
装備したい機能
W6には腕があって、首があるので、マンガのロボットによくある「自分の首を外してみせる」
というギミックを是非装備したいと考えています。(うけるかな?)
覆帯
今のところW6は1320gの重さがあります。移動ユニットだけで走らせていた頃は
そうでもなかったのですが、信地旋回に近い旋回半径で旋回させると覆帯が外れそうです。
そんなわけで、500mm程度の旋回半径で、そーっと旋回させています。
突き当りを曲がる
壁沿いに廊下を走ってゆき、突き当りで曲がり、また壁沿いに走るという動作を試し
うまくいきました。
コマンドの与え方は以下のようなものです。
- 左の壁伝いに最高90秒前進。分かれ道(壁が途切れるところ)は無視して進路保持、90秒たっても突き当たりに出会わなければ処理中断
- 突き当たりにあたったら半径約500mmで後進しながら約80度旋回
- 左の壁伝いに最高30秒前進。分かれ道は無視。
ボールに接近してから持ち上げる
2003.07.27
画像処理ルーチンのVCへの移植
画像を使ったライントレース
2値化と画像の重心計算の一部をH8/3069用に移植し、ライントレースを試してみました。
2値化したデータから「ライン」だけを取り出す部分が入っていないため、家具の下に出来る陰など
、「黒っぽいもの」がフレーム内でラインを探している範囲に入ってきた時にラインから
それてしまいますが、今回のプログラムでも周囲の条件次第ではラインをトレースできることが確認できました。
2003.08.03
画像処理ルーチン
明るさ変化があった方向に頭を向ける
「動いている物がある」と思われる方向へ頭を向けるサブルーチンを、PCからロボット内臓の
CPUへ移植しました。以前「カップ麺追跡」としてムービーを公開したプログラムと
同じ物です。PCへ画像を送る部分が無くなるので、処理が早くなることを期待しましたが
思ったほどではありませんでした。
ロボット本体で処理が完結するので、棚の上に置いて30分ほど様子を見ました。
自室の中では、私が動くだけなので、私のほうをずっと向くかと思っていたのですが、
関係ない方向を向くケースも多く発生しました。追従の能力も低く、あまり「追っている」様に
は見えなかったので、もうひと工夫が必要だと思いました。
このサブルーチンは「追跡」には向かないけれども、とくに追跡中の物体が無い時、
「初めに注意を向ける」目的にはある程度使えそうだと思いました。
2003.08.17
腕の設計・製作
ここしばらくソフトを書いてきましたが、飽きてきたので腕を作り始めました。
仕様は大体以下のような感じで考えています。
- 可搬質量50g以上
- 片腕辺りの自由度4(グリッパ含む)
- 地面に手が届く程度の手先の到達範囲
- 両腕で8時間程度の製作時間
- 今ついている肩に付けられる
- RCサーボは両面テープで固定、機種はSX−101Zを使用
- RCサーボのギアの強度、バックラッシュ、不感帯広さおよび可搬能力に見合った腕全体の剛性
- センサーは後日追加
腰の設計
地面が傾いている時も上半身を水平に保つ等、重心のコントロールのため、自由度2〜3の
腰を設計中です。自由度についてはかなり迷いましたが、1個めは自由度2で作ってみようと
思っています。
2003.08.24
腕の製作
左腕の肘から先を作りました。「自作ロボット入門―アニマトロニクス編」を読んだり、
ROBO−ONE会場でいろいろな造りのロボットを見て、今までも「簡単に済ませている」
つもりでしたが、「もっと簡単で良いかも・・・」という思いが浮かんできていました。
そういった訳でこの腕は、RCサーボの固定には両面テープを使い、2枚の板の間に挟むだけ
としました。また、サーボホーンの反対側の軸も、3mmのボルトがついた板をRCサーボの
裏蓋に両面テープで貼り付けるだけにしました。
この形ですと、多分RCサーボを外す時には部品を壊して外すことになると思いますが、
いままでに作ったロボットでは、「簡単に交換できるような構造」にしてあったにもかかわらず、
飽きて部品取りをする時や、大きな改造をする時以外にRCサーボを外すことが無く、
機構的な配慮が無駄になっていたので「まあいいか」と思っています。
2003.08.31
左腕の製作
腕のソフト製作
各関節を個別に動かす、テスト用のプログラムで少し動かしてみたところ、No.2サブCPU
で軌道生成を行ったり、通信で待ったりと、RCサーボの制御信号を止めている時間が
少々長すぎるようで、腕が自重で動いてしまい、ごく軽いものも保持できませんでした。
ときどき考え込んで動きが止まることは、W6に関しては許容するつもりなので、
止まるタイミングを動きに差し支えないところにするため、ソフトを改善しようと
思いました。
左右の腕の構造を変えようかと考えています。腕用の制御ソフトが2種類になってしまいますが
・・・まあいいでしょう。
2003.09.07
右腕の製作
モニタのビルド
2L1v6〜2L2v1までは、動作パターンデータ等は絶対番地でストア先を管理
しながら外付けRAMに格納し、通常の変数はプログラムの実行速度が多少なりとも
上がるようにと内蔵RAMにスタックをとって格納していました。
同じ要領でW6のメインCPUの画像データもストアしていましたが、
管理が煩雑なので、スタックを外付けRAMにとり、配列変数にストアする様に
変えていました。この変更で多少プログラミングの快適さが増しました。
メインCPUの方が快適になったので、No.2サブCPU用のモニタ(日立のモニタ)の
スタックエリアも外付けRAMに取るようビルドしなおしました。
で・・・プログラムを直して実行してみると・・・動かない(スタックが正常に機能していない)
・・・・あれ?
というわけで、この変更はまた今度にしました。
2003.09.14
腕の動作確認
2003.09.21
移動ユニットのプログラム変更
左手へのタッチセンサー埋め込み
左手にタッチセンサー用のマイクロスイッチを埋め込み中です。ものをつかんだ時や、
手が物に当たったときに分かるような配置で付けています。
2003.09.28
磁気コンパスによる進路保持
腕に関する工作が一段落したので、気分を変えてW6を外で走らせてきました。
頭の中に積んでいる磁気コンパス(秋月で購入のRDCM-802)がどの程度のものか、
出力が「北」のときは進路を右に、「北東」のときは進路を左にというようにして、
北北東に向けて蛇行するプログラムを試してみました。
まあパッと見た感じでは、目的の方向に走って行ったので、
野外で長距離を走らせるとき「同じところを回ってしまう」ことを防ぐやくに立ちそうだ
と思いました。(RDCM-802は360度を3ビットで出力してくるので、大雑把な方向が分かります。)
関節がたくさんあるロボットは、全身モーターの磁石だらけなのでロボットに載せて
使えるのか不安に思っていましたが、役に立ちそうで良かったです。
今回は、その昔W4で何の気なしにモーターのそばにコンパスを積んでしまい、ぜんぜん
ダメだった経験を生かして、頭のてっぺんにセンサーを配置したのが良かったのかもしれません。
超音波距離センサーの搭載
外を走るときに、距離センサーとして「シャープGP2D12」だけではレンジが短すぎて寂しいので、
超音波距離センサーをまた搭載しました。今回搭載したのは秋月の「超音波デジタル距離計キット」
でセンサーとしては日本セラミック社製のR40-16, T40-16が使われています。
測定レンジは10cmから3.5mくらいまでとなるように調整しました。
調整と読み取り方法がいい加減なので、誤差は3%程度でした。
キットはW4用として10年以上前に組んだものですが、動作するので使ってしまいました。
キットはそのままに組むと、電源電圧が9から12Vで動くようになります。W6は制御系電源も
動力系電源も5Vに統一してあるので、このユニットも5Vで動くように直そうかとも思ったのですが、
受動部品のストックが足りなかった一方、5V−>12VのDC-DCコンバータIC(MAX662A)のストックがあったので、
12Vで使うこととしました。
2003.10.05
ソフトの機能追加
超音波距離センサのインターフェイス部分と、腕関係でCPU間の通信コマンドが増えた分を
メインCPUのソフトに足しました。
どうやってボールを見つけよう・・・
カメラで撮影した映像から、ボールを探し出すアルゴリズムを考えています。一つ思いついたのは、
先日作った、ライントレース用の、黒線分離サブルーチンにボールが写っている映像を通して
見たところ、ボールの下に出来る楕円形の影が2値化で残っていました。自分の部屋は天井に
蛍光灯が1本あるだけの照明なので、この条件ならばライントレース用のプログラムを少し直すと
ボールを見つけられることが分かりました。
その他、順光、逆光etc.条件ごとに、ボール用だけでも幾種類かのサブルーチンを用意
することになりそうです。
こう考えてゆくと、適したサブルーチンを呼ぶためには、周囲の照明状態を認識する機能が
必要に思えます。
こんなふうに、組み立て式に考えて、ロボットの機能を拡張して行くのは楽しいですね。
2003.11.16
移動ユニットType2
2003.11.23
移動ユニットType2の製作
いつもの調子で作っています。ギアボックスのバックラッシュが大きいので、このままだと
上半身を旋回させた反動で、5度程度は向きが変わってしまいそうです。
5度も向きが不確定になってしまうと、制御がしにくいと思います。
落ちている物を拾う時は、アバウト(プラスマイナス10mmくらいの精度)に移動し、
最終段階では腰と腕の自由度を利用する(mm単位の精度)つもりでいるので、
タイヤにブレーキを装備する等して、向きが変わらないようにしようと思いました。
2003.11.30
移動ユニットType2の製作
腰の部分が出来ました。なるべく簡単に・・・とは思っていましたが、RCサーボを
一度分解して取り付けるような、面倒な形になってしまいました。
左の写真は上半身を載せて見たところ、右の写真は腰の裏側です。
(こちらの写真は大きく表示できます)
RCサーボを囲むようにジュラコンのローラー付いていて、RCサーボの軸を曲げるような
力がかからないようにしています。機構と工作精度の都合上、4つのローラーがのうちどれかが
浮いていることが多いようですが、役に立っている様です。
(このへんは動かしてみないと分かりません)うまく出来るかちょっと心配でしたが、
ここまでは成功と思いました。
こんなのもあり
電源ユニットとPCからの通信ケーブル接続口が背中にあるので、今すぐこの形で動ける
わけではないのですが、腕が必要ないときは、こんな形で動かしても面白いかと思いました。
2003.12.07
移動ユニットType2の製作
一応出来上がったので動かしてみました。走行速度は・・・ちょっと遅すぎの様な気も
しますが、しばらくこのまま使います。腰の関節も動かしてみましたが、まあ異常なく
動きました。周辺の構造強度が不足ぎみで、グラグラしてます。そーっと動かせば
(動きの最大加速度を適当にすれば)まあ当面のソフトのテストには使えるでしょう。
今後、改良型の腰関節を設計しようかと思いました。
DCモーター駆動用ICの型式
今後の予定
2003.12.14
No.2サブCPU用ソフトの変更
腰の関節も、メインCPU からのコマンドによって動かせるようにソフトを拡張しました。
また、No.1サブCPUに赤外線距離センサが増えてやり取りするデータのフォーマットが少し
変わったので、そのあたりも対応させました。(メインCPUからNo.1サブCPUへコマンドを
出す時は、No.2CPUが中継するためです。)
現在の全備重量
けっきょく手元の2足ロボットと同じような部品で、同じような「造り」で構成したので、
同じような全備重量になりました。はじめは「簡単なロボット」と思って作り始めましたが
・・・ある意味2L2よりもさらに凝ったロボットになってきました。
v3へのバージョンアップ
ハードが結構変わったので、ロボットの名称のバージョンを変える事にしました。
W6のトップページの要目表を変えるので、古いほうはここに残しておきます。
W6v2の仕様
全高 |
330mm |
全長 |
201mm |
全幅 |
294mm |
重量 |
1660g |
モーター |
腕(8)、首(2)RC用サーボモーター 計10個
走行用モーター 2個
(メーカー:マブチ 機種:FA-130 個数:2)
|
電源 |
リチウムイオン電池 (7.2V 19.4Wh)
|
センサー |
- 画像取込用イメージセンサーユニット 2セット
- 距離センサーユニット(超音波1/赤外線2セット)
- 走行距離センサーユニット(フォトインタラプタ2セット)
- タッチセンサー(移動ユニット&左手)
|
CPU |
Win98 PC(Duron 1GHz / 256MByteRAM)
H8/3069F(25MHz / 2 MbyteRAM)
H8/3067F(20MHz / 32 kbyteRAM)
H8/3664F(16MHz / 2 kbyteRAM)
|
2003.12.21
走行サブルーチンの作成と電池の変更
車輪を回す時間をメインCPUで計り、移動距離や旋回の量を制御するプログラムを書いてみました。
4秒、8秒、12秒の間、一定のPWMディユーティー比でモーターを駆動して
何mm走るか計測し、時間と移動距離の関係の補間式をつくり、メインCPUに持たせました。
しばらく動かしてみると、動力系のNi-MH電池の残量によって、ちょっと許容できない誤差が
でる事が分かりました。プラスマイナス10%程度までならそのまま使おうかと思っていましたが
20%に近かったので、以前のように動力系も安定化するため、2L2のほうへ行っていた
DC−DCコンバータをW6に戻しました。
2003.12.28
磁気コンパスのデータの補間
現在「頭」の中に積んでいる磁気コンパス(RDCM-802)は、方位を8方向(3bit)で出力
してくるため、そのままでは最大±45度の誤差が生じます。そこで、頭を回転させながら
約2度刻みで測定を行い、出力データの変わり目の方向が、ロボットから見てどちらの方向か
を調べ、
その情報から現在の方位を計算するという、補間計算ルーチンを作りました。
普通の針のコンパスと比べてみたところでは、だいたいあっているようです。これで、
測定に1秒程度はかかるものの、±3度程度の誤差で測定出来るようになりました。
(あまりきちんとした校正が出来ないので、感じですが・・・)
センサーの出力が信用できるとすれば、
測定の細かさや、測定データの統計処理を変えることによって、
もう少し補間結果の精度を上げられそうな気がしています。
2004.01.11
輪郭の抽出
ただ単に「画像の縦方向もしくは横方向に隣接するピクセルの明るさの差が一定以上の場所に
印を付ける」というプログラムを作り、閾値や撮影方法(光の当たり方)を変えて試してみました。
どうやってボールを画像から切り出すか模索しているところです。
−>
ボールの輪郭が半分くらい出ていますが、床の模様も出ています。家具の隙間は
「ライン認識」プログラムによって、「1オブジェクト」として切り出され、四角で
囲まれています。
複数のフィルタプログラムの処理結果をつき合わせ、評価関数
(チェスとかオセロのヒューリスティックに作った戦略アルゴリズムみたいなやつ)
を通してボールの存在に
見当をつけ、最終的にはレンジファインダを使ったレーダーチャートの形の認識から
「模様ではなく、立体物であること」を確認するという流れが良さそうだと思いました。
2004.01.18
画像処理関連サブルーチンの仕様検討
ボールを拾えるようになるためには、どんなサブルーチンが必要で何から作ろうか、といった
ことを考えていました。そして、以下2つの機能あたりから取り掛かろうかと思いました。
- PCの画面に表示したイメージ内のある場所をクリックしたら、そこがロボットがいる
平面上にあると仮定した場合の、ロボットからの相対座標を返すプログラム
- PCの画面に表示したイメージ内のある場所をクリックしたら、そこがカメラの視野の
中心に来るように頭を動かすプログラム。
ある場所を視野の中心に持ってくるプログラムのことを考えていて思い出したのですが、
以前試した「動いたものを視野の真ん中に捕らえる」アルゴリズムがあまりうまくいかなかった
理由を、ロボット搭載用のプログラムをPCに移植してじっくり調べてみようかと思いました。
あと、どちらのプログラムにしても、カメラの光学モデルを何かしら用意しなければならないので、
これまた、どの程度のものを持たせるか考えています。
と、ここまで考えて、毎回ロボットを起動して、テスト用の画像を取得するのが面倒なので、
W6のテストプログラムに、表示中の画像を、自動的にファイル名を変えながら、ハードディスク
に残してゆく機能を加えました。これまでは、最後に表示したファイルが1つ残るだけ
だったので、多少便利になります。
2004.01.25
画像処理関連サブルーチンの作成
目標を視野の中心に捕らえる
「PCの画面に表示したイメージ内のある場所をクリックしたら、そこがカメラの視野の
中心に来るように頭を動かす」というプログラムを作りました。はじめはロボット
内臓のプログラムは触らずに、VBの部分にこの機能を持たせ、考えた
アルゴリズムで動くか、PCで画像を見ながら確認しました。
そして、確認の後、メインCPUのプログラムに移植しました。
視野の中心から、対象の点までのピクセル数から方向を求める時に、一次式
(y=ax+bの形の式)で近似したので精度はそれなりですが、とりあえず動きました。
光学系の性質から来る、画像の歪みは、ひとまず無いものとしてプログラムを書きました。
知能ロボコンのボールを、ロボットから70cmくらいの場所、視野の端のほうに置き、
ボールの中心あたりをクリックしたところ、ボールの境界線あたりが、画面の中心に来ました。
RCサーボの制御ルーチンの方が、あまり良く調整されていないことを考慮に入れても、
まあまあだと思いました。
動いているものに頭を向ける
以下の手順で「動いているものに頭を向ける」動作をするプログラムを作りました。
- 画像を2枚撮影する
- 2枚の画像をピクセルごとに比較し、一定以上の明るさの差があったらそのピクセルに
フラグを立てる
- フラグがたったピクセルを(離れていても)1エリアとみなし、重心を求める。
- 重心のあるピクセルの方向へ頭を向ける。(上で作ったサブルーチン使用)
撮影と画像処理のサイクルが長いので、ゆっくり動くものしか追えないという問題はありますが、
以前の動体追跡ルーチンに比べると、だいぶ確実性が増したような気がしました。
棚の上にしばらく置いておいたところでは、前のバージョンでは、あらぬ方向へ頭が向いてしまう
ことが多々ありましたが、今バージョンでは、大体いつも私のほうを向いていました。
「ピッ」と言う音が撮影の合図になっています。部屋がもっと明るければ、今のハードでも、
もう少しシャッター速度を上げられます。でも、そもそも、H8の内臓A/Dコンバータの変換時間
が長いので、露出オーバーになってしまい、直射日光が使えません。そのうち、A/Dコンバータ
を外付けしようかと思っています。
2004.02.02
画像を使った位置測定
PCの画面に表示したイメージ内のある場所をクリックしたら、そこがロボットがいる
平面上にあると仮定した場合の、ロボットからの相対座標を返すプログラムを作ってみました。
出来は・・・画像のどこをクリックするかによっても違いますが、だいたい1m先で1.2mと
表示されるといった具合でした。像のゆがみの補正や、首をある方向に向ける時の精度等を
プログラムに盛り込んでゆけば、ある程度使えるかと思いました。
1m先を測定した場合、頭の仰角が1度違っても、目の位置が地面から312mmの高さなので、
測定結果は約50mm違ってくる計算になります。
首のガタだけでも、既に1度以上はあると思うので、これを使おうと思ったら、首の構造を
少し考えなければいけないと思いました。
「いいかげんフィルタ」によるカラー撮影
プラカラーのクリアブルー、クリアレッド、クリアイエロー+クリアブルーを混ぜて作った
クリアグリーンを、0.2mm厚の透明プラ板に塗って作ったフィルタで、同じシーンを3回に
分けて撮影してみました。結果が下の画像です。もうちょっとましなフィルタを用意したほうが
よさそうですが、まあ、ボールの色の違いは分かりました。。
ロボットで撮影した画像と「いいかげんフィルタ」を付けたW6v3
2004.03.21
ハードの追加の工作
しばらく時間がたって、ソフトに関して何をやっていたのか忘れたので、
ハード関係の工作から再開することにしました。
2004.03.27
頭を水平に保つ
先週積んだADXL202を使ってみるプログラムとして、ピッチ軸1軸だけに対して、
ADXL202から取得したロボットの傾斜データを使って、頭を水平に保つプログラムを
書いてみました。頭を動かすと、体が少し揺れ、この揺れをセンサーが拾いまた頭が動く
といったような仕組みで振動が発生しますので、センサーからのデータを、ローパスフィルタ
の計算を通して首のRCサーボにフィードバックしました。
通信プログラムの変更
2004.04.03
360度スキャン
腰と首を動かして、10刻みで周囲360度の超音波センサと赤外線センサ(PSD)による
距離測定、Cdsによる明るさ測定をするプログラムを作りました。測定に何秒かけている
かを計ってみたところ22秒強でした。頭を止めて測定しないと超音波の方の測定データが
不正確になってくるので、こんな感じになっています。しかし、時間がかかりますね・・・
首と腰が動いているところを見ていると、入力した角度と、実際の角度が数パーセントずれている
様です。やはり、SX−101Zを180度の範囲で使う時は、直線1本の近似式で、角度入力から
パルス幅を計算しないで、もう少しSX−101Zの特性を入れた近似式を使った方が良さそうだと
思いました。
通信プログラムの変更
先週から引き続き、PCのVC++のプログラムからW6をコントロールするための変更作業を
続けています。
画像取り込み、一定距離の走行、360度スキャンの結果の取り込み等の部分が出来ました。
あと少し作ると、以前VC++で書いた、画像認識プログラム(ごく限られた条件で、ライン
トレース用のラインが認識できるだけのプログラムに、こう書くと誇大広告みたいですが・・・)
と接続出来そうです。
2004.04.11
一番明るい方に向く
角度指定の旋回動作と、360度スキャンで取り込んだCdsの値がどの程度使えるかを
組み合わせた確認として、360度スキャンした結果、一番明るかった方に向くプログラム
を試してみました。自分の部屋(窓が1面にある)で昼間、5回くらい試したところ、毎回
窓に正対する向きになりました。部屋の中を勝手に動くようなプログラムで、今向いている方向
を知る一つの手がかりに使えると思いました。
露出調整プログラム
- バグフィックス
試し撮りを繰り返しながら、画面全体のピクセルの明るさの平均値が128近辺になるように、
露出時間を調整するプログラムで、露出調整を行っていましたが、時々いつまでもループから
抜けなくなることがありました。久しぶりにプログラムを見直すと、unsigned charで戻している
つもりが、charで戻していました。このバグフィックスで露出調整範囲外の判定が正しく戻るように
なり、バグが一つ減りました。
- Cds測定値で露出調整
何回も試し撮りをしながら露出時間を決める方法は時間がかかるので、Cdsで測定した明るさから
露出時間を決めるサブルーチンを作りました。露出の合い具合は今ひとつな感じですが、ライントレース
等に使える範囲にはなっていると思うので、ひとまず良しとしました。
2004.04.18
線の上に乗る
ライントレースプログラムのパーツとして、ライントレース用の線(床に張ってある黒の
ビニールテープ)の上まで移動するプログラムを書きました。
ライントレースの途中でラインから外れてしまった時に、ラインを探して復帰したり、
ライントレースのスタート位置を「ラインがロボットの視野に入るところ」といった感じで、
ライントレース処理が成功するための条件を緩めるためのものです。処理の流れは
およそ以下のとおりです。
- 撮影した映像の中から、ライントレース用の線を認識する。
- ロボットからそのラインまでの相対的な位置関係を計算する。
- そこまで移動する。
(移動の具体的な目標地点は、抽出したラインの、そのフレーム内での重心位置です。)
この日誌の"2004.02.02", "2004.01.25", "2004.01.18", "2003.08.03"に言及しているプログラム
などを統合したことになります。W6に考えていたマイルストーンを一つクリアしたと思いました。
さて、次はスポンジボールを拾うプログラムを書こうと思っています。ここで問題は、
ボールの認識です。形(線画)の認識も難しいですが、その前に、線の取出しがうまく行きません。
というわけで、輪郭を使おうかと思っていましたが、背景とボールを切り分けて、
輪郭抽出を行うための閾値の自動決定するアルゴリズムのめどが立たないので、照明条件を「夜間、天井灯のみに
よって照明されている自分の部屋」に限定して、ボールが床に落とす影を使ってボールを
画像の中から探す事からはじめようか等と考えています。
ロボットとボールで遊ぶにあたっては、カラーカメラと原色のボール。そして
照明の状態に制限をつけるというのが、妥当なところなのかなーと思いました。
その3へつづく
戻る