Skip to content

アーキテクチャ

このリポジトリは、配置先ではなく責務の境界を基準に分けています。依存はadapterからapplication、applicationからdomainの内向きだけです。domainはKSP、Unity、ROS2、デモへ依存しません。

Bounded context

ディレクトリ責務
Source/PyLoN/DomainRCS配分、制御所有権、安全制限などの純粋なルール
Source/PyLoN/ApplicationKSP内で制御ユースケースを組み立てる層
Source/PyLoN/Api/KspKSP/Unity、UDP、PartModuleのadapter
Ros2/pylon_interfacesKSPとROS2アプリ間の明示的な契約
Ros2/pylon_bridge/pylon_bridge/domainUDP packet検証とKSP時刻整合
Ros2/pylon_bridge/pylon_bridge/services単一ノードへ合成する通信・セッション・センサー・モデル・制御サービス
Ros2/pylon_vehicle_control再利用可能な6DoF制御domainとlease workflow
Demo公開APIだけを使う実行例。共通制御は置かない
build.sh / build.ps1 / sync.sh公開ソースだけで完結する本番ビルド・同期
Development(ローカル専用・Git対象外)デバッグ補助、検証コード、記録、モデル編集元

本番C#プロジェクトはコンパイル対象を明示します。./sync.shで公開ソースをビルド・同期します。作業手順とローカルファイルの扱いは本体開発ガイドを参照してください。

制御の境界

機体制御の整合性を決めるauthority aggregateはKSP process内にあります。controllerは/ksp_vessel/lifecycleから現在のvessel_idを取得し、その機体に対する期限付きleaseを獲得してから指令します。すべての正式なWrench・アクチュエータ指令は次を持ちます。

  • KSP機体を特定するvessel_id
  • 指令元を特定するcontroller_id
  • 所有権を特定するlease_id
  • replayや並び替わりを拒否するsequence

KSP側はSAS排他、timeout、角速度上限、Wrench変化率、連続噴射時間、emergency stopを最終安全境界として適用します。ROS nodeが停止してもこの制約は残ります。

RCSは「総最大推力で割る」方式ではなく、現在有効な各ノズルについて、KSPが実際に使う噴射軸、重心までのモーメントアーム、並進・回転axis enableを評価して12個の正負操作channelへ配分します。ただし、KSPのnormalized flight inputを経由するため厳密なforce sourceではありません。WrenchFeedbackrequested / allocated / achieved / residualを分け、この差を観測可能にします。

TFと機体ライフサイクル

TF / Topic扱い
pylon_ground_truth_enu -> base_linkKSP universal time基準のdynamic TF
base_link -> pylon_<vessel-id>_link_0000重心変化を含むdynamic TF
proxyの固定joint/tf_static
part link -> sensor frameSensor ID由来の安定名を持つ/tf_static
/ksp_vessel/lifecycleUNAVAILABLE / ACTIVE / CHANGED / STALEと実vessel_id

点群や画像のtimestampでは、同じKSP universal timeへGround Truth poseを外挿してdynamic TFを補います。固定取付姿勢をセンサー周期で再送しないため、TFのfuture extrapolationと不要なproxy再生成を避けます。

速度はworld frameの/ground_truth/twistとbody frameの/ground_truth/twist_bodyを別Topicで公開します。高レベルcontrollerはworld-frame setpointを受け、座標変換を共通実装内で一度だけ行います。

PyLoNを使ったROS2アプリケーション開発のためのガイドとAPIリファレンス