ナウでホットな話題を記事にしてみました。
>>>AIに関する取り組みはAIにやらせてみることにしました<<<
休日にやるにはビールを片手に「まあどうせうまく行かないだろう」くらいの期待値感で進めるのがちょうどいい内容でした。読み手もその程度の期待値感でいてください。所要時間は確か、30分程度で、どちらかというと、雰囲気を伝える記事作成のほうが時間かかりましたw
AIにはcursorを使ってます。
AIコードエディタとは指示を(雑に)投げてAIがそれっぽく実装してくれるエディタのことです。
学生は無料で使えるみたいですし、社会人でもモデルの精度にこだわり過ぎなければ無料である程度つかえます。
本件の開発ではとりあえずパッケージ名はvibe_coding_kitにしています。
設計をガチることもできますが、やりすぎると業務との境目がなくなり、興が乗ってこないので、「そこそこでええやん」のマインドでいきます!!
↓↓↓↓筆者のvibe codingのイメージ↓↓↓↓
※Vibe Coding(バイブコーディング)とは、AI(人工知能)を活用して、自然言語による指示だけでコードを生成し、ソフトウェア開発を行う新しい手法です。開発者は詳細なプログラミング知識がなくても、AIに「こうしたい」というイメージを伝えるだけで、コードの生成、改良、デバッグを任せることができます。2025年初頭にAI研究者のAndrej Karpathy氏が提唱しました。
自然言語での対話といいつつ、途中めんどくさくなって下記のような感じの指示になっています。。。
- OK
- いいね
- よろしく
- 全部よろ
取り組みはこちらに載せておきました。(あと少し工夫すればちゃんと走行できるかもねくらいのところまで行ってます)
とりあえず
筆者
「このREADMEを読んで、新しいROS2パッケージ『Vibe Coding Kit』を設計してください。要件は、カメラ画像を入力として車両の制御指令を生成することです。」
AI
「承知しました。READMEを拝見しました。既存のsample
パッケージをベースに、カメラ画像(/sensing/camera/image_raw
)を入力とし、制御指令(/control/command/control_cmd
)を出力するシステムとして『Vibe Coding Kit』を設計しますね。」
# Vibe Coding Kit
カメラ画像を使用した自動運転制御システム
## 概要
Vibe Coding Kitは、AWSIMのカメラ画像を入力として受け取り、画像処理によるレーン検出と障害物検出を行い、自動車の制御指令を生成するシステムです。
## 機能
- **カメラ画像処理**: AWSIMのカメラ画像(1920×1080 Full HD)をリアルタイムで処理
- **レーン検出**: 画像から道路のレーンを検出し、ステアリング角を計算
- **障害物検出**: 画像から障害物を検出し、加速度制御を行う
- **制御指令出力**: 検出結果に基づいて制御指令を生成
- **リアルタイム可視化**: 処理結果を複数の方法で可視化
## 入力
### カメラ画像
- **トピック**: `/sensing/camera/image_raw`
- **型**: `sensor_msgs/msg/Image`
- **解像度**: 1920×1080 (Full HD)
- **エンコーディング**: BGR8
- **フレームID**: camera_link
### カメラ情報
- **トピック**: `/sensing/camera/camera_info`
- **型**: `sensor_msgs/msg/CameraInfo`
- **歪み補正モデル**: plumb_bob
## 出力
### 制御指令
- **トピック**: `/control/command/control_cmd`
- **型**: `autoware_auto_control_msgs/msg/AckermannControlCommand`
- **内容**: ステアリング角と加速度制御指令
### デバッグ画像
- **トピック**: `/vibe_coding_kit/debug_image`
- **型**: `sensor_msgs/msg/Image`
- **内容**: 元画像と処理画像を並べて表示
## 可視化機能
### 1. OpenCVウィンドウ表示
- リアルタイムで処理結果を表示
- リサイズ可能なウィンドウ(初期サイズ: 960×540)
- 元画像とエッジ検出画像を並べて表示
### 2. ROSトピック配信
- `/vibe_coding_kit/debug_image` トピックで可視化画像を配信
- `rqt_image_view` で確認可能
### 3. CSVログ保存
- `/tmp/vibe_coding_kit_log.csv` に制御指令の履歴を保存
- フレーム番号、ステアリング角、加速度を記録
### 4. リアルタイムグラフ表示
- matplotlibによる制御指令値のリアルタイムグラフ
- ステアリング角と加速度の履歴を表示
## 使用方法
### 1. AWSIMでカメラ画像を有効化
AWSIMで「use image」ボタンを押してカメラ画像を有効にします。
### 2. システムの起動
#### Dockerコンテナ内での起動
```bash
# Dockerコンテナに入る
cd ~/aichallenge-2025
./docker_exec.sh
# 環境変数を設定
source /aichallenge/workspace/install/setup.bash
# ビルド
bash build_autoware.sh
# 直接実行
source /aichallenge/workspace/install/setup.bash
python3
/aichallenge/workspace/src/aichallenge_submit/vibe_coding_kit/scripts/vibe_coding_node.py
初期実装:まずは動くものを
AI
「まず、ROS2パッケージの基本的なファイル群(package.xml
, CMakeLists.txt
, launch
ファイル)を準備しました。 次に、システムの核となる2つのPythonファイルを作成します。」
-
vibe_coding_node.py
: ROS2のノードとして、カメラ画像の受信と制御指令の送信を担当するメインプログラムです。 -
camera_controller.py
: 画像処理のロジックを専門に扱うクラスです。レーン検出や障害物検出のアルゴリズムはここに集約します。
筆者
「いいですね。まずはOpenCVの基本的な機能、例えばCannyエッジ検出とHough変換を使ったシンプルなレーン検出と、輪郭検出による障害物検知ロジックを実装してください。」
AI
「実装しました。camera_controller.py
に、画像の前処理(グレースケール化、ぼかし、エッジ検出)、Hough変換によるレーン検出、輪郭の面積による障害物検出ロジックを組み込みました。ステアリングと加速度は、検出結果に基づいて計算されます。」
可視化機能の実装:AIのdebug
開発者
「このままだと、システムがどう判断しているのか全くわかりません。vibe_coding_node.py
の結果を可視化したいのですが、どんな方法がありますか?」
AI
「良いご質問ですね。方法はいくつか考えられます。」
- 1. OpenCVウィンドウ表示: 処理中や処理後の画像をPC画面に直接表示します。
-
2. ROSトピック配信: デバッグ用の画像をROSトピックとして配信し、
rqt_image_view
などのツールで確認します。 - 3. CSVログ保存: ステアリング角などの制御値をファイルに記録し、後でグラフ化して分析します。
-
4. リアルタイムグラフ:
matplotlib
を使い、制御値をリアルタイムでグラフ描画します。
筆者
「なるほど。開発効率が格段に上がりそうですね。全部実装してください。」
AI
「承知しました!4つの可視化機能をすべてvive_coding_node.py
に実装します。OpenCVウィンドウはリサイズ可能にしておきますね。」
最初の壁:「壁にぶつかる」問題
筆者
「実装ありがとうございます。早速動かしてみたのですが…**壁にぶつかってしまいます。**どうしてでしょうか?どうすれば改善できますか?」
AI
「それは開発でよくある問題です。原因はいくつか考えられます。レーン検出の精度が低い、障害物として壁を認識できていない、あるいは制御パラメータが不適切などです。 まずは、先ほど実装した可視化機能でAIが『何を見ているか』を確認し、パラメータを調整することから始めましょう。例えば、レーン検出のしきい値を調整したり、ステアリングの反応を穏やかにしたりします。」
筆者
「なるほど。では、考えられる改善策をすべて試したいです。レーン検出の精度を上げるために、ROI(関心領域)の最適化や色フィルターの追加はどうでしょう?」
AI
「素晴らしいアイデアです。それらも実装しましょう。」
むりぽ
方向転換:深層学習への挑戦
筆者
「色々試しましたが、OpenCVベースの手法だけでは限界を感じます。セマンティックセグメンテーションで、もっと根本的に壁やレーンを検出できませんか?」
AI
「良いアプローチです。セマンティックセグメンテーションを使えば、ピクセル単位で物体を識別できるため、精度が大幅に向上します。軽量なモデルとして、YOLOv8-segやENet、DeepLabV3などがありますね。」
筆者
「重みファイルのダウンロードが不要で、一番手軽なものがいいです。」
AI
「それでしたら、PyTorchのtorchvision
に含まれるDeepLabV3が最適です。初回実行時に学習済みモデルが自動でダウンロードされます。」
筆者
「では、それでお願いします。」
新たな壁:深層学習の”沼”
筆者
「DeepLabV3を組み込んで動かしてみました。ModuleNotFoundError: No module named 'torch'
というエラーが出たのでpip install torch
しましたが、今度は別のエラーが…。」
AI
「エラーメッセージを拝見しました。いくつか修正が必要です。preprocess_image
が不要になっている点の修正や、モデルの出力と画像のサイズが違うのでリサイズ処理を追加します。」
筆者
「修正ありがとうございます。動かしてみましたが、今度は画面全体が緑色になってしまいます。」
AI
「ご報告ありがとうございます。それは、モデルが画像内のほぼ全てを『背景(クラスID: 0)』と認識している状態ですね。デバッグとして、モデルが実際にどのクラスIDを出力しているか確認しましょう。」
筆者
「わかりました。デバッグコードを追加して実行します。」
再びの方向転換
筆者
「デバッグ結果が出ました。Unique class IDs in segmentation: [0 7]
と表示されています。」
AI
「なるほど、重要なことがわかりました。このモデルは**『背景(0)』と『車(7)』しか検出できていません。**我々が必要としている『道路』や『レーン』を、この学習済みモデルはそもそも認識できないのです。これが深層学習の難しいところで、モデルの学習データが目的に合っていないとこういうことが起こります。」
筆者
「そうだったんですね…。では、どうすれば?レーン検出専用のモデルを使うしかないでしょうか?」
AI
「それも一つの手です。UltraFast Lane Detectionなどが有名ですね。 …ですが、その前に試せる手があります。一旦、原点に戻りませんか?OpenCVベースの手法でも、画像をBEV(鳥瞰図)に変換するだけで精度が劇的に向上することがあります。」
筆者
「BEV変換ですか、面白そうですね。それでやってみましょう。」
視点を変える
AI
「camera_controller.py
にBEV変換処理を実装しました。ドライバー視点の画像を、真上から見下ろした視点に変換することで、歪んだレーンが平行な直線になり、格段に検出しやすくなります。」
筆者
「これはいいですね!これなら、Hough変換でも安定してレーンを検出できそうです。」
AI
「はい。BEV画像上で、改めて色フィルターとHough変換を組み合わせることで、これまで悩まされてきた多くの問題を解決できる可能性があります。」
筆者
「素晴らしい。この方向で最終的な実装をお願いします。」
AI
「承知しました。手動設定のBEV変換と、その画像上でのレーン検出ロジックを実装します。」
まあ、そこそこできそうな予感
vibe codingが向いていること
自動運転のプログラミングがどのようなものか、実際に手を動かして感触を掴むことには向いています。
- 「とりあえず画像処理で車を動かしてみたい」というアイデアを、すぐに試せます。
- プログラムがうまく動かなかった時に、「なぜ失敗したのか」をデバッグ用の表示(可視化)機能を使って調べる、という開発の一連の流れを体験できます。
- 自動運転技術の基本を学ぶための、最初の教材として非常に役立ちます。
vibe codingで向いてないこと
一方で、シンプルな指示だけでは、ある程度物理学や、ルールを理解する必要のある自動運転は難しいです。
- 開発の過程で試したように、単純な画像処理だけでは、環境の変化に対応しきれない場面がありました。
- また、汎用的なAI(DeepLabV3)を導入しようとしても、目的(レーン検出)に合っていなければ、うまくいかないことも体験しました。
より高いレベルの自動運転を実現するには、vive codingでの学び(おふざけ)を基礎として、BEV(鳥瞰図)変換を精密に調整したり、レーン検出専用のAIモデルを導入するなど、工夫する必要があります。ただ、この取り組みは、本格的な開発への良い出発点となると思います。(多分ね!)
Views: 0