Skip to content

GT-karny/esmini-rmx

Repository files navigation

esmini_rmx

RoadManager eXtension - esminiのRoadManagerライブラリを拡張し、Pythonから簡単に使えるようにしたラッパーライブラリ

License: MPL 2.0

概要

esmini_rmxは、esminiのRoadManagerライブラリを拡張し、以下の機能を提供します:

  • RoadNetwork API - トポロジー解析、ジャンクション接続情報、座標変換
  • Python Wrapper - RoadManagerとRoadNetworkの両方をPythonから簡単に利用
  • 拡張機能 - ジャンクション角度計算、レーン情報取得など

主な機能

RoadNetwork (esminiRMXLib)

  • 🗺️ 道路ネットワークのトポロジー解析
  • 🔄 座標変換(世界座標 ↔ 道路座標)
  • 🚦 ジャンクション接続情報と角度計算
  • 📏 レーンサンプリングと情報取得

RoadManager (esminiRMLib)

  • 📍 Position Object管理(作成/削除/コピー)
  • 🚗 道路上での位置設定と移動
  • 📊 レーン情報(幅、タイプ、速度制限)
  • 🛣️ ジャンクションナビゲーション

クイックスタート

インストール

# リポジトリをクローン
git clone https://github.com/yourusername/esmini_rmx.git
cd esmini_rmx

# ビルド
powershell -ExecutionPolicy Bypass -File .\build_rmx.ps1

基本的な使用例

from esmini_rmx import RoadNetwork
from esmini_rmx.rmlib import RoadManager
import math

# RoadNetwork - 高水準API
with RoadNetwork("map.xodr") as net:
    road_ids = net.get_road_ids()
    conns = net.get_junction_connecting_roads(junction_id=1)
    for road_id, angle in conns:
        print(f"Road {road_id}: {angle * 180 / math.pi:.1f}°")

# RoadManager - 低水準API
rm = RoadManager()
rm.init("map.xodr")
pos = rm.create_position()
rm.set_road_position(pos, road_id=1, s=10.0, t=0.0)

# 重要: 負の距離で前進!
rm.position_move_forward(pos, -20.0, math.pi)  # 20m直進

rm.close()

ドキュメント

ビルド要件

  • CMake 3.15以上
  • Visual Studio 2019以上(Windows)
  • Python 3.7以上(Pythonラッパー使用時)

プロジェクト構成

esmini_rmx/
├── src/                    # C++ソースコード
│   └── esminiRMXLib.cpp   # RoadNetwork実装
├── include/                # ヘッダーファイル
│   └── esminiRMXLib.hpp   # RoadNetwork API
├── pywrapper/              # Pythonラッパー
│   ├── esmini_rmx/        # Pythonパッケージ
│   └── examples/          # サンプルコード
├── test/                   # C++ユニットテスト
├── script/                 # 検証スクリプト
├── docs/                   # ドキュメント
└── dist/                   # リリースパッケージ

重要な注意事項

⚠️ RM_PositionMoveForwardの距離パラメータ

距離パラメータの符号はレーンの向きと交通規則によって異なります:

右側通行の道路の場合:

  • 負のレーン(Lane -1など、右側): 正の距離でs座標が増加(道路の進行方向)
  • 正のレーン(Lane +1など、左側): 正の距離でs座標が減少(道路の逆方向)

左側通行の道路の場合:

  • 負のレーン(Lane -1など、左側): 正の距離でs座標が増加(道路の進行方向)
  • 正のレーン(Lane +1など、右側): 正の距離でs座標が減少(道路の逆方向)

これは、OpenDRIVEでは正のレーンが道路のs座標とは逆方向に進むためです(対向車線を表現)。

推奨: レーンの向きに関わらず一貫した動作を得るには、現在のレーンIDと移動したい方向を考慮してください。

🧭 ジャンクション角度規約

  • π/2 (90°) = 右折
  • π (180°) = 直進
  • 3π/2 (270°) = 左折
  • -1 = ランダム選択

最新の機能 (v1.0)

  • ✅ 10個の新規API関数を追加
    • Position管理: delete_position, copy_position, get_number_of_positions
    • Position設定: set_lane_position, set_s
    • 情報取得: get_speed_limit, get_lane_width, get_lane_type, get_road_number_of_lanes, get_id_of_road_from_index
  • ✅ 包括的なドキュメント
  • ✅ 角度規約の明確化
  • ✅ 距離パラメータの警告

テスト

# C++ユニットテスト
cd build/Release
.\unit_tests.exe

# Pythonテスト
python script/test_rmlib_extensions.py

リリース

リリース用パッケージはdist/ディレクトリに含まれています:

  • DLLファイル(bin/
  • Pythonパッケージ(python/
  • ドキュメント(docs/
  • サンプルコード(examples/

詳細はdist/README.mdを参照してください。

ライセンス

TBD

謝辞

このプロジェクトはesminiをベースにしています。

貢献

Issue報告やPull Requestを歓迎します。

関連リンク

  • esmini - Environment Simulator Minimalistic
  • OpenDRIVE - Road network description format

About

esminiのRoadManager拡張

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published