Funny Snowman

FunnySnowman > Geek<ギーク>なコトをやってみよっと

【ラピロ】ロボット運転手が、自動車を運転する。

ゴール設定(自動車を運転するロボットを作る)

自動走行する車じゃなくて、ロボットが自動で運転する。ラピロの歩く速さは、亀よりちょっとだけ速い程度なので、遠くまで速く移動するために自動車の運転を教え込む。ロボットを運ぶ自動車といえば、思いつくのはGファイターとかドダイとか...。ド、ドダイなら作れるかも。早速、ラピロのガンタンク化を諦めて「ド・ダイYS型プロジェクト」をスタート!

ロボットが自動車を運転する

事前準備(ロボットが搭乗できる「ド・ダイYS型」自動車を作る)

タミヤのトラック&ホイールやリモコンボックスを組み合わせたら、ちょうどラピロにピッタリな大きさだった。ダブルギヤボックスは、ラピロの重量と加速時のバランス取りを考えて、一番低いギヤ(タイプD)を選択した。加速時にラピロが転げ落ちないようにスピードを遅くしたのは正解かも。これでも時々、キャタピラ部分が外れることもある。リモコンボックスには、乾電池2個を搭載し、キャタピラ駆動の電力となる。リモコンボックスには、2つのレバーがあって、レバーを両方(↑)(↑)上に倒すと前に進み、両方(↓)(↓)下へ倒すと後ろに進む。レバーは左右独立しており、左(↑)・右(↓)に移動した場合、右回転し、その逆なら左回転。これだけでも操作させる楽しみは十分だが、これをロボット(Rapiro)に運転させる。

「ド・ダイYS型自動車」タミヤのトラック&ホイールセット、2ch リモコンボックス、ユニバーサルプレート、ダブルギヤボックス左右独立4速タイプ

事前準備(ラピロのプログラミング)

ロボットに運転させるための位置合わせをする。前進、後進、右回転、左回転、静止の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)

自動走行する車よりも難しい「運転するロボット」の原型ができた。あとはカメラ画像を分析したり、音波で距離を測ったりすれば、自動運転CAR並みの走行実験ができる。かも。

▲上に戻る