top of page

【後編】プラレールを量子シミュレーションで自動運転!

  • 執筆者の写真: Tomohiro Mochida
    Tomohiro Mochida
  • 6月23日
  • 読了時間: 3分


前回は環境構築やカメラ映像の確認までを紹介しました。今回は、カメラ映像から取得した座標の記録と、Arduinoを使った電車の制御について書いていきます。



🧭 Step 1: 座標ファイルの確認と前処理

マーカー検出のコードを実行すると、マーカー位置のデータが 座標.csv に保存されます。

📌 ポイント:

  • ファイルを開くと、ID・X座標・Y座標などが並んでいます。

  • IDが「0」や「1」のデータは初期値や誤検出である可能性があるので、削除してください。


ExcelやGoogleスプレッドシートで直接編集OKです。


#マーカー検出のコード

import cv2, os

import numpy as np

# import matplotlib.pyplot as plt

import time

import csv





"""

2点記録すること

rで記録

qで終了

"""





csv_file = '座標.csv'





#カメラ

cap = cv2.VideoCapture(0)



#カメラ設定

cap.set(cv2.CAP_PROP_FPS, 60)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)

cap.set(cv2.CAP_PROP_EXPOSURE, -4)

cap.set(cv2.CAP_PROP_BRIGHTNESS, 0.25)



#ArUco

aruco = cv2.aruco

#4x4マーカーの辞書

dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)





current_id = 0

print(f'current_id = {current_id}')



while 1:

    # print(f'current_id = {current_id}')

    

    #カメラキャプチャ

    ret, frame = cap.read()

    

    #表示

    # cv2.imshow('frame', frame)

    

    #マーカー検出

    corners, ids, rejectedImgPoints = aruco.detectMarkers(frame, dictionary)

    # print(corners[0][0][0])

    

    #写真に書き込み

    aruco.drawDetectedMarkers(frame, corners, ids, borderColor=(0, 0, 255)) #BGR

    

    #表示

    cv2.imshow('frame', frame)

    

    

    key = cv2.waitKey(10) & 0xFF

    

    #qで終了

    if key == ord('q'):

        break

    

    #rで記録

    if key == ord('r') and len(corners) > 0:

        

        

        # 新規作成時のみヘッダーを書き込む

        if not os.path.isfile(csv_file):

            with open(csv_file, 'a', newline='', encoding='utf-8') as f:

                writer = csv.writer(f)

                writer.writerow(['ID', 'x', 'y'])

        

        with open(csv_file, 'a', newline='', encoding='utf-8') as f:

            writer = csv.writer(f)

            

            # データを追記

            writer.writerow([current_id, int(corners[0][0][0][0]), int(corners[0][0][0][1])])

        

        print(f'記録しました {current_id}, {int(corners[0][0][0][0])} {int(corners[0][0][0][1])}')

        current_id += 1

        

        time.sleep(0.1)

        print(f'current_id = {current_id}')

    



#カメラ解放

cap.release()

cv2.destroyAllWindows()

🎯 Step 2: 電車を動かして座標を記録

次に、プラレール車両の座標を実際に記録してみます。

🚂 実行手順:


  1. 座標.csvを作る。



  2. 電車を レール1 の上に置く。

  3. プログラムを実行し、rキーを押して現在の座標を記録。

  4. 次に、電車を レール15 に移動させる。

  5. もう一度 rキー を押して座標を記録。

  6. 終了したら、qキーでプログラムを終了。

  7. 座標.csv を開き、正しく2つの座標が追加されているか確認。

これで、決まった位置に電車が来たことを認識するための基礎データが取れました。



🔧 Step 3: Arduinoと接続して制御

いよいよ、PythonからArduinoを操作して、物理的に電車を動かす部分に入ります。

1. Arduinoスケッチの準備

  • servo.ino をArduino IDEで開きます。

  • サーボモーターなどを制御するコードが記載されています。


2. ポートの設定

  • 3_小メインコース.py の中にある以下のコードを探し、自分のArduinoポートに書き換えます。

ser = serial.Serial('COM3', 9600) # Macなら '/dev/cu.usbmodemXXXX'

ポート名はArduino IDEの「ツール > ポート」から確認できます。






🧠 Step 4: PyTorchを使いたい場合(オプション)

もし将来的に、座標の予測や行動学習などを行いたい場合、PyTorchを使うと便利です。

import torch

このように読み込めれば、インストール成功です。今回の基本制御では必須ではありませんが、今後の応用で使います。



🚦 Step 5: メインコードを実行して一連の流れを確認

最後に、3_小メインコース.py をSpyder上で実行すると、

  • カメラでマーカーの座標を取得

  • 対応する座標に達したときにArduinoから信号を送信

  • サーボやLED、他のパーツを動作させる

という一連の動作が行われます。



✅ 今回のまとめ

この後編では、

  • 実際の座標の記録方法

  • CSVデータの整理

  • Arduinoとの連携方法

について紹介しました。


次回のブログでは、この一連の流れを通してまとめ直し、「初心者でもできる!プラレール×Python×Arduino活用術」として振り返っていきます。

 
 
 

最新記事

すべて表示
【完全版まとめ】量子アニーリングxプラレールで動かす!プラレール制御プロジェクト入門(Windows編)

このブログでは、 カメラ映像から座標を取得して、Arduinoでプラレールを動かす という一連のプロジェクトをステップごとに解説します。Python初心者や電子工作に不慣れな方でも再現できるよう、必要な環境構築からハードウェア制御まで丁寧にまとめています。 🛠...

 
 
 

Commentaires


bottom of page