こんにちはkayanuma.です。
3Dスキャナがなんだか欲しい・・
そんなSFな、とか思ってたらふと気づけば普及し始めていました。
もう普通に売ってる時代なのか・・
しかし”なんだか欲しい”にかける金額としてはやや高額。
飽きるかもしれないし。
これなんかずいぶんと安いですが、PCのプロセッサがi5以上必須なのでいまだにCore2Quad派の自分にはどうも使えないようです。
モノづくりにこだわるなら
<ATLAS 3D Scanner>
こういったDIYやキットで行くという手もあって
キットは2~3万前後だったりしてそれなりにお手軽に試せるのですが、
ネットを徘徊しているうちに<1000円で立体スキャナ作ってみた>
を見つけてしまったのでこれは試してみなければいけません(使命感)
というわけで
今回は<今江科学>さんの<Tri-Coder>を試してみました。
サイトを読むとわかりますが10年以上前から公開されているもので(すごい)
白熱電球を利用した光源とかWindows95対応なんかが時代を感じさせる気がします。
(なお自分の環境ではWindows10でもXP互換モードで動作可能でした)
Tri-Coder自体はソフトウエアなので、撮影装置などは自分で用意しなければなりませんが
デジカメやWebカメラが使えそうなので概ね家にあるもので何とかなりそうです。
しかしちょっと面倒なのが撮影台で、被写体を一回転させて200枚の写真を取り込むのですがワンステップずつ1.8度正確に回転させる仕組みが必要で
マニュアルによるとギアを組み合わせて1.8度ずつ動く回転台を作るか、目盛りを印刷してちょっとづつ動かす・・
とあるのですがどちらも自信ない。。なので家にあるものが利用できないかと見回すと
10年ぐらい前に買って文鎮として活躍していた
ステッピングモーター
そういえばこれがワンステップ1.8度だったはず・・。
ステッピングモーターとはパルスを与えると決められた角度だけ動くモーターの一種です。
コンピューターと相性が良くてロボットなんかにもよく使われています。
ああこれが使えるね。手動のスイッチでワンステップずつ動かそうかな・・と漠然と考えていたら良いものを見つけました。
<USB-IO2.0>http://km2net.com/usb-io2.0/
パソコンから手軽に外部機器を制御できるUSB機器。
ほほう。もしかしてこれをモーターに繋いでWebカメラと連携すれば自動で・・。でもライブラリがVisualBasicでプログラム作るの面倒だな・・。
するとまた良い情報が。
<UWSCで汎用USB-IO2.0を利用する方法>
UWSCとはWindowsでマクロを使えるようにするプログラムで、
アプリケーションの操作を記録するマクロ機能に加えスクリプトで細かな制御もおこなえ、
さらにVBのDLLも利用できるという優れものです。
・・というわけで急遽USB-IO2を取り寄せ、モーターの駆動回路をつなげて組んでみました。
追試する人もあまりいないと思いますが一応回路図とサンプルスクリプトを書いときます。
ちなみに購入したのは秋月電子通商版のUSB-IO2.0(AKI)です。
(DLLの初期化方法などは上のサイトに説明がありましたので割愛)
現在見られないようですので一番最後に掲載
for i=1 to 200 Step() next //ステッピングモーターの駆動 procedure Step DIM ptn[4]=$8,$4,$2,$1 public cnt=0 uio2_out(1,ptn[cnt],0,0,0,0,0,0) sleep(0.02) uio2_out(1,0,0,0,0,0,0,0) sleep(0.02) cnt=(cnt+1) and $03 fend
ああ、うまい具合に動きました。
これにWebカメラで写真を撮るマクロを使い自動取り込みのルーチンを挟みます。
この部分は各自変わってくるかと思いますので注意してください
//MyCamera のマクロ procedure Cam sleep(1.5) id = GETID("MyCamera", "#32770", -1) sleep(0.5) clkitem(id, "スナップ", CLK_BTN) sleep(0.5) clkitem(id, "OK", CLK_BTN) fend
こんな感じでモーター駆動の前に呼び出します。
for i=1 to 200 print "("+200+"/"+i+")" Cam() Step() next
ウエイト時間が多めなのは撮影台が動いた後に被写体の揺れが収まるのを待っています。
上の例では画像取り込みとして<MyCamera>というフリーソフト(vector)
を利用しました。
これで自動的に写真取り込み→1.8度回転、を200回繰り返すシステムが出来ました。やった。
光源はマニュアルでは白熱電球をスリットで遮って筋状の光線を作るのですが
ラインレーザーのモジュールを持っていたのでこれを使いました。
一般的な黒猫のぬいぐるみ
これをスキャンしてVRMLで吐き出し3D-COATで取り込みました。
データの取り込みに3D-COATが直に使えることもわかったのでリトポロジして綺麗なポリゴンデータに整形するフローに期待が持てそうです。
しかしVRMLとか懐かしすぎるフォーマット・・
次は一般的な人形
取り込み風景
レーザー光が強すぎて乱反射してしまうのでサングラスで光量を抑えてます(ひどい)
むむ縦長!
どうもキャリブレーションが良くないのか変なスケールになってしまいます。
でも良く見ると筋彫りの部分もちゃんと取り込めていて、それなりに表面を捉えてそうです。テスト一発目としては上々ですかね。
しっかりと固定されたセットを作って真面目にキャリブレーションを行えばもっと良くなるはず。
あと使用したWebカメラの露出が自動設定しかなく絞りがピョコピョコ動くのでこれもエラーのもとなのでなんとかしなければ。
次回、飽きてなければもうちょっと突っ込みたいと思いますがはたして。
//メッセージウインドウ等 const PHOTOLOOP=200 stopform(1) logprint(1) //id=exec("C:\\Program Files (x86)\\MyCamera\\MyCamera.exe")//64bitでは機能しない? // USB-IO DLLの定義 DEF_DLL uio_find():int:vbausbio.dll DEF_DLL uio2_out({byte,byte,byte,byte,byte,byte,byte,byte}):int:vbausbio.dll DEF_DLL uio2_inp({byte,byte,byte,byte,byte,byte,byte,byte}):int:vbausbio.dll DEF_DLL uio_out({byte,byte,byte}):int:vbausbio.dll DEF_DLL uio_inp({byte,byte,byte}):int:vbausbio.dll DEF_DLL uio_free():int:vbausbio.dll DEF_DLL uio_getDevs():int:vbausbio.dll OpenD = uio_find() if OpenD=0 then PRINT "USB-IO 初期化" else print "USB-IO がありません" sleep(1) logprint(0) stopform(0) exitexit endif print "デバイス"+uio_getDevs() for i=1 to PHOTOLOOP print "("+PHOTOLOOP+"/"+i+")" Cam() Step() next //USB-IOの終了 uio_free() logprint(0) stopform(0) exitexit //ステッピングモーターの駆動 procedure Step DIM ptn[4]=$8,$4,$2,$1 public cnt=0 uio2_out(1,ptn[cnt],0,0,0,0,0,0) sleep(0.02) uio2_out(1,0,0,0,0,0,0,0) sleep(0.02) cnt=(cnt+1) and $03 fend //MyCamera のマクロ procedure Cam sleep(1.5) //uio2_out(1,$80,0,0,0,0,0,0) //Pin7にLEDインジケータを付ける場合 id = GETID("MyCamera", "#32770", -1) sleep(0.5) //uio2_out(1,0,0,0,0,0,0,0) clkitem(id, "スナップ", CLK_BTN) sleep(0.5) clkitem(id, "OK", CLK_BTN) fend