ミリ波レーダー「T68PE2」をPythonでサクッと動かそう
目次
T68PE2のご紹介
60GHz帯ミリ波レーダーモジュール評価キットT68PE2_0412L0108_2Dは、遠近両用の点群出力対応モデルです。アンテナ構成を従来モデルから変更し、2種類の送信アンテナを実装することで、近距離から遠距離(最大300m)までの測定が可能です。センサー近傍では広FoV、遠方では狭いFoVを実現しており、用途に応じて動作モードを使い分けて使用することが可能です。
準備するもの
必要な機材は以下の通りです。
- ハードウェア: T68PE2 評価キット一式
- ソフトウェア: Python 3.xがインストールされたPC(3.11.0で動作確認済み)
ミリ波レーダーの開発と聞くと、複雑なSDKやC言語のビルド環境が必要に思えるかもしれませんが、T68PE2はUSB接続すると2つの仮想COMポート(コマンド送受信用 / データ受信用)として認識されます。そのため、Pythonのシリアル通信ライブラリさえあれば簡単に制御することが可能で、Windowsはもちろん、Raspberry PiのようなLinuxを搭載したSingle Board Computerでも動作可能です。
まずは以下のコマンドで必要なライブラリをインストールします。
pip install pyserial
(後述するGUIツールを使用する場合は PyQt5, pyqtgraph, numpy, opencv-python も追加でインストールします。)
たったこれだけ!CUIで生データを取得する最小コード
まずは複雑な処理を省き、レーダーから出力される3次元座標(X, Y, Z)と速度(V)、そして信号強度(SNR)をコンソールに垂れ流すシンプルなCUIプログラムを動かしてみましょう。
(T68PE2は2次元レーダーのため、Zは常に0になります。)
以下のコードは、設定ファイル(.cfg)に記述されているコマンド群をコマンドポートから送信し、データポートから流れてくるバイナリデータを非同期で待ち受ける最小構成のサンプルコードです。
import time
import logging
from radar_receiver import RadarReceiver
# ログ出力の設定
logging.basicConfig(
level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s"
)
def on_status_change(status_msg):
"""
ステータス変更時のコールバック
"""
print(f"\n[STATUS] {status_msg}")
def on_data_received(points, sub_frame):
"""
データ受信時のコールバック
T68PE2対応: sub_frame (0, 1, 2) と 検出データを受け取る
"""
num_points = len(points)
print(f"[DATA] SubFrame: {sub_frame} | Detected Objects: {num_points}")
# 受信したすべてのオブジェクトの詳細を表示
for i, p in enumerate(points):
print(
f" Obj {i}: X={p['x']:.2f}m, Y={p['y']:.2f}m, Z={p['z']:.2f}m, "
f"V={p['v']:.2f}m/s, SNR={p['snr']}, SubFrame={p['sub_frame']}"
)
def main():
CFG_FILE = "./Config/prof_T68PE2_short_max8m.cfg"
CMD_PORT = "COM9"
DATA_PORT = "COM10"
print("=== T68PE2 Radar Test Start ===")
receiver = RadarReceiver(cfg_filepath=CFG_FILE, cmd_port=CMD_PORT, data_port=DATA_PORT)
is_started = receiver.start(on_data_received=on_data_received, on_status_change=on_status_change)
if not is_started:
print("[ERROR] レーダーの起動に失敗しました。ポート番号やCFGファイルのパスを確認してください。")
return
try:
print("\nRunning... (Press Ctrl+C to stop)\n")
while True:
time.sleep(1)
except KeyboardInterrupt:
print("\n[INFO] 停止要求 (Ctrl+C) を受け付けました。シャットダウンします...")
finally:
receiver.stop()
print("=== T68PE2 Radar Test End ===")
if __name__ == "__main__":
main()
(通信やTLVパケットのバイナリ解析を担うバックエンド radar_receiver.py の全容は、後述の提供コードに含まれます。)
上記を実行すると、以下のように取得した点群情報を確認することができます。
ターミナル画面:
実運用を見据えたGUI 化
点群データを取得できることは確認できましたが、数字の羅列だけでは空間的な動きを把握するのは困難です。そこで、PyQt5とPyQtGraphを用いて構築したGUIビューアも用意しました。Pythonの強力な演算ライブラリを活用すれば、様々な認識処理をユーザー側で作り込み、結果を見える化することも可能です。
GUI版の主な機能:
- リアルタイム点群可視化: X-Yのトップダウン俯瞰ビューと、Distance-Velocity(距離–速度)の2画面分割プロット。
- マルチサブフレームの色分け: Subframes 0(シアン)、1(マゼンタ)、2(イエロー)で自動色分け。
- 動的パラメータ調整: レーダーを再起動することなく、動作中にCFAR閾値(距離・速度)や静止物除去のON/OFFを変更可能。
- 残像処理: 指定したフレーム数分の過去データを同時に表示。
- Webカメラ連動&ログ再生: 点群データとWebカメラの映像を同期して録画 (.log & .avi) し、後からオフラインでシーク再生する機能を搭載。
GUI画面:
コード一式を無償提供
本記事でご紹介したT68PE2評価キットをご購入いただいた皆様には、今回デモで使用したCUI/GUIアプリケーションのソースコード一式(Python)をサンプルとして無償でご提供いたします。ユーザー様は、複雑なバイナリパーサーの実装に囚われることなく、本来フォーカスすべき点群の認識処理の開発にすぐ着手していただけます。ご購入に関するお問い合わせは、以下のリンクよりお問い合わせください。