【後編】プラレールを量子シミュレーションで自動運転!
- 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: 電車を動かして座標を記録
次に、プラレール車両の座標を実際に記録してみます。
🚂 実行手順:
座標.csvを作る。
電車を レール1 の上に置く。
プログラムを実行し、rキーを押して現在の座標を記録。
次に、電車を レール15 に移動させる。
もう一度 rキー を押して座標を記録。
終了したら、qキーでプログラムを終了。
座標.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活用術」として振り返っていきます。
Commentaires