This repository will be deprecated. For the next version, see LazyFym.
FymEnvs.jl is a Julia version of the original fym,
developed by FDCL in SNU.
You can perform numerical (flight) simulations including deep reinforcement learning with this package.
This package is also highly inspired by Gym, OpenAI.
The usage of FymEnvs.jl is very similar to fym,
but there is a significant difference: does not inherit BaseEnv like class in Python.
It may be awkward to the users from the original fym.
NOTICE: To create your own FymEnv,
it is highly recommended to see
the contents about custom environments in directory test.
Here is the simplest example of FymEnvs.jl:
using FymEnvs
using LinearAlgebra
function set_dyn(env, t)
# corresponding to `set_dot` of the original fym
# you can use any names in this package
sys = env.systems["sys"]
x = sys.state
A = Matrix(I, 3, 3)
sys.dot = -A * x
end
function step(env)
t = time(env.clock)
sys = env.systems["sys"]
x = sys.state
update!(env)
next_obs = sys.state
reward = zeros(1)
done = time_over(env.clock)
info = Dict(
"time" => t,
"state" => x,
)
return next_obs, reward, done, info
end
x0 = collect(1:3)
systems = Dict("sys" => BaseSystem(initial_state=x0, name="3d_sys"))
log_dir = "data/test"
file_name = "fym.h5"
logger = Logger(log_dir=log_dir, file_name=file_name)
env = BaseEnv(max_t=100.00, logger=logger, name="test_env",)
systems!(env, systems) # set systems; required
dyn!(env, set_dyn) # set dynamics; required
step!(env, step) # set step; required
reset!(env) # reset env; required before propagation
obs = observe_flat(env)
i = 0
@time while true
render(env) # not mendatory; would make simulator slow
next_obs, reward, done, info = env.step()
obs = next_obs
i += 1
if done
break
end
end
close!(env)
data = load(env.logger.path)
show(env)
show(size(data["state"]["sys"]))Result:
# time and progressbar
99%|████████████████████████████████████████████████████████████████████████████████████▎| ETA: 0:00:00 0.706294 seconds (2.98 M allocations: 1.675 GiB, 11.48% gc time)
# representation, i.e., show (nested env supported)
name: test_env
max_t: 100.0
dt: 0.01
+---name: 3d_sys
| state: [3.7200760072278747e-44, 7.440152014455749e-44, 1.1160228021683672e-43]
| dot: [-3.7200756925403154e-44, -7.440151385080631e-44, -1.1160227077620995e-43]
| initial_state: [1.0, 2.0, 3.0]
| state_size: (3,)
| flat_index: 1:3
# saved data
(10000, 3)For more examples, see directory test.
- Note that this does not inherit
Gym's features, whilefymdoes.
The following features are supported in FymEnvs.jl:
- Nested environments
- An environment can contain other environments as its systems.
- Backward integration
- Can perform backward integration with keyword argument
dt (< 0.0).
- Can perform backward integration with keyword argument
- Log data
- Can log simulation data and configuration using
Logger. - It is compatible with JLD2.jl.
- Can log simulation data and configuration using
There are some features of fym, not realised yet. Here's the list:
- eager stop
- logger callback
- delayed system