Das Projektziel ist es, einen einfachen Wrapper für ein gym-Environment (openAI) zu implementieren.
Bestehende Projekte zur Umsetzung dieses Projektziels sind zwar vorhanden, aber zum Teil zu komplex für einfache Prototypen.
Grundlage der Implementierung ist das flugdynamische Modell aus folgendem Repository: gym-jsbsim
Description: Working-Paper
Folgendes Beispiel zeigt eine einfache Implementierung eines Random-Agent
import gym
import numpy as np
from gym_wrapper.jsbsimgymenvironmentwrapper import JsbsimGymEnvironmentWrapper
configuration_path="../config/default_configuration.toml"
env = JsbsimGymEnvironmentWrapper(configuration_path=configuration_path)
throttle = 0
time_step_sec = 0
while time_step_sec <= 30:
print("time_step_sec: ", time_step_sec)
#env.render() # comment render() for faster training
action = env.action_space.sample()
state, rewards, dones, _ = env.step([np.array([action])],)
time_step_sec = env.sim.get_properties('simulation/sim-time-sec')
print("state", state)
Beschreibungen für verschiedene Rechnersystem (Windows, Mac, Linux) sind unter:
jsbsim: quickstart-building-the-program
pip install jsbsim
git clone https://github.com/JSBSim-Team/jsbsim
import jsbsim
path_jsbsim = '/PFAD_ZU_JSBSIM_ORDNER/jsbsim' #an System anpassen.
sim = jsbsim.FGFDMExec(path_jsbsim)
sim.load_model('c172p')
print(sim.print_property_catalog())
result = sim.run()
while result and sim.get_sim_time() <= 3:
print(sim.get_property_value('velocities/u-fps'))
Klonen des JSBSim_gym_wrapper repos:
git clone https://github.com/rtatze/JSBSim_gym_wrapper
Installation des Paketes: (-e steht für editor mode)
cd JSBSIM_gym_wrapper
python3 -m pip install -e .
a) die Schnittstelle zur Anbindung an JSBSim wird durch die Datei simulation bzw. die Klasse Simulation realisiert. Die folgenden Methoden sind implementiert:
-
run(): das FDM (JSBSim) macht einen Zeitschritt.
-
get_state() die 12 Zustandswerte des FDM werden zurück gegeben
-
set_properties() der jeweilige Parameter des FDM wird gesetzt
-
get_properties() der jeweilige Parameter des FDM wird gelesen
b) die Klasse/Datei Jsbsim_gym_environment_wrapper ummantelt (Wrapper) die Simulation des FDM
im Sinne der Struktur von openAI sind u. a. die Methoden:
- reset
- step
implementiert
Gute Referenzen:
(nach afaehnrich) es werden 2 Dockerfiles vorgestellt. Mit dem ersten Dockerfile wird die Basis für ein Image des JSBSim_gym_wrapper erstellt. Das zweite Dockerfile zeigt eine Beipsielausführung eines Tests.
- Dockerfile für die Basis
# aufbauend auf einem Linux-Image mit Python
FROM python:latest
# JSBSim wird in ein zusätzliches Verzeichnis kopiert
RUN mkdir -p ${CODE_DIR}/JSBSim_gym_wrapper/jsbsim
WORKDIR ${CODE_DIR}/JSBSim_gym_wrapper/jsbsim
RUN git clone https://github.com/JSBSim-Team/jsbsim.git
# das gesamte Verzeichnis und Abhängigkeiten werden in das Image kopiert
ADD . ${CODE_DIR}/JSBSim_gym_wrapper
RUN pip install -e ./JSBSim_gym_wrapper
# das Arbeitsverzeichnis ist root
WORKDIR ${CODE_DIR}/JSBSim_gym_wrapper
RUN echo "$PWD"
erstellt wird das Image: JSBSim_Basis
- Dockerfile für eine Beispielanwendung auf Basis des oben (unter 1) erstellten Images:
# aufbauend auf dem Basis-Image
FROM jsbsim_basis:latest
# wechsel in das Verzeichnis mit dem Beipsiel:
WORKDIR ${CODE_DIR}/JSBSim_gym_wrapper/example
# Ausführung der Beipsielanwendung
CMD [ "python", "random_actions.py" ]
ACHTUNG: da nun der JSBSim-Code im Image innerhalb des Verzeichnisses jsbsim liegt, muss die Configuration geändert werden:
#path_jsbsim = '~/Programme/jsbsim-code' ### path to jsbsim folder
path_jsbsim = '../jsbsim' # Für Dockercontainer
Cite as: @misc{Titze2021, author = {Titze, Rene}, title = {JSBSim_wrapper}, year = {2021}, publisher = {GitHub}, journal = {GitHub repository}, howpublished = {\url{https://github.com/rtatze/JSBSim_gym_wrapper}} }