自動走行する車じゃなくて、ロボットが自動で運転する。ラピロの歩く速さは、亀よりちょっとだけ速い程度なので、遠くまで速く移動するために自動車の運転を教え込む。ロボットを運ぶ自動車といえば、思いつくのはGファイターとかドダイとか...。ド、ドダイなら作れるかも。早速、ラピロのガンタンク化を諦めて「ド・ダイYS型プロジェクト」をスタート!
百聞は一見に如かず。こちらの動画でラピロの雄姿をどうぞ。仮免許ですけど。
タミヤのトラック&ホイールやリモコンボックスを組み合わせたら、ちょうどラピロにピッタリな大きさだった。ダブルギヤボックスは、ラピロの重量と加速時のバランス取りを考えて、一番低いギヤ(タイプD)を選択した。加速時にラピロが転げ落ちないようにスピードを遅くしたのは正解かも。これでも時々、キャタピラ部分が外れることもある。リモコンボックスには、乾電池2個を搭載し、キャタピラ駆動の電力となる。リモコンボックスには、2つのレバーがあって、レバーを両方(↑)(↑)上に倒すと前に進み、両方(↓)(↓)下へ倒すと後ろに進む。レバーは左右独立しており、左(↑)・右(↓)に移動した場合、右回転し、その逆なら左回転。これだけでも操作させる楽しみは十分だが、これをロボット(Rapiro)に運転させる。
ロボットに運転させるための位置合わせをする。前進、後進、右回転、左回転、静止の5パターン。今回は、走行ルートもスクリプトで書いちゃうけれど、次回は音波センサーとか赤外線モーションセンサーとか、あとカメラの画像を使って、AI風な完全自動運転にもチャレンジしてみようと思う。
#!/usr/bin/env python # -*- coding: utf-8 -*- import serial import time import sys glbCom = serial.Serial('/dev/ttyAMA0', 57600, timeout = 10) # connect to RAPIRO # ------------------------------- # ラピロが「ド・ダイ」を運転する。 # ------------------------------- def autodrive(): time.sleep(10) drive_front( 5 ) drive_right( 3 ) drive_back( 5 ) drive_left( 3 ) drive_front( 3 ) drive_back( 2 ) drive_stop() # ------------------------------- # 前進 # ------------------------------- def drive_front( intTime ): # 安全ポジ(下) glbCom.write( "#PS00A090S01A090S02A040S03A090S04A090S05A100S06A090S07A090S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # 前進 準備 glbCom.write( "#PS00A090S01A090S02A055S03A130S04A080S05A088S06A050S07A100S08A090S09A090S10A090S11A090R000G102B255T001" ) time.sleep(0.2) # 前進 ゴー glbCom.write( "#PS00A090S01A090S02A068S03A130S04A080S05A073S06A050S07A100S08A090S09A090S10A090S11A090R000G000B255T001" ) time.sleep( intTime ) # 前進 ストップ glbCom.write( "#PS00A090S01A090S02A055S03A130S04A080S05A088S06A050S07A100S08A090S09A090S10A090S11A090R000G102B255T001" ) time.sleep(0.2) # 安全ポジ(下) glbCom.write( "#PS00A090S01A090S02A040S03A090S04A090S05A100S06A090S07A090S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # ------------------------------- # 後進(バック) # ------------------------------- def drive_back( intTime ): # 安全ポジ(上) glbCom.write( "#PS00A090S01A090S02A110S03A090S04A090S05A030S06A090S07A090S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # バック 準備 glbCom.write( "#PS00A090S01A090S02A095S03A130S04A075S05A043S06A050S07A105S08A090S09A090S10A090S11A090R204G102B255T001" ) time.sleep(0.2) # バック ゴー glbCom.write( "#PS00A090S01A090S02A082S03A130S04A075S05A054S06A050S07A105S08A090S09A090S10A090S11A090R204G102B255T001" ) time.sleep( intTime ) # バック ストップ glbCom.write( "#PS00A090S01A090S02A095S03A130S04A075S05A043S06A050S07A105S08A090S09A090S10A090S11A090R204G102B255T001" ) time.sleep(0.2) # 安全ポジ(上) glbCom.write( "#PS00A090S01A090S02A110S03A090S04A090S05A030S06A090S07A090S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # ------------------------------- # 左回転 # ------------------------------- def drive_left( intTime ): # 安全ポジ glbCom.write( "#PS00A120S01A090S02A040S03A090S04A120S05A030S06A090S07A070S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # 左回転 準備 glbCom.write( "#PS00A140S01A090S02A055S03A130S04A080S05A043S06A050S07A100S08A090S09A090S10A090S11A090R000G102B255T001" ) time.sleep(0.2) # 左回転 ゴー glbCom.write( "#PS00A140S01A090S02A068S03A130S04A080S05A054S06A050S07A100S08A090S09A090S10A090S11A090R000G000B255T001" ) time.sleep( intTime ) # 左回転 ストップ glbCom.write( "#PS00A140S01A090S02A055S03A130S04A080S05A043S06A050S07A100S08A090S09A090S10A090S11A090R000G102B255T001" ) time.sleep(0.2) # 安全ポジ glbCom.write( "#PS00A120S01A090S02A040S03A090S04A120S05A030S06A090S07A070S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # ------------------------------- # 右回転 # ------------------------------- def drive_right( intTime ): # 安全ポジ glbCom.write( "#PS00A070S01A090S02A110S03A090S04A120S05A100S06A090S07A070S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # 右回転 準備 glbCom.write( "#PS00A050S01A090S02A095S03A130S04A080S05A088S06A050S07A100S08A090S09A090S10A090S11A090R000G102B255T001" ) time.sleep(0.2) # 右回転 ゴー glbCom.write( "#PS00A050S01A090S02A082S03A130S04A080S05A073S06A050S07A100S08A090S09A090S10A090S11A090R000G000B255T001" ) time.sleep( intTime ) # 右回転 ストップ glbCom.write( "#PS00A050S01A090S02A095S03A130S04A080S05A088S06A050S07A100S08A090S09A090S10A090S11A090R000G102B255T001" ) time.sleep(0.2) # 安全ポジ glbCom.write( "#PS00A070S01A090S02A110S03A090S04A120S05A100S06A090S07A070S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) # ------------------------------- # 静止ポジション # ------------------------------- def drive_stop(): # 安全ポジ glbCom.write( "#PS00A090S01A090S02A040S03A090S04A120S05A100S06A090S07A070S08A090S09A090S10A090S11A090R102G000B153T001" ) time.sleep(0.5) glbCom.write( "#X" ) # ====================================== # コマンドラインモードで実行する場合 # ====================================== if __name__ == '__main__': autodrive()
自動走行する車よりも難しい「運転するロボット」の原型ができた。あとはカメラ画像を分析したり、音波で距離を測ったりすれば、自動運転CAR並みの走行実験ができる。かも。