예제 #1
0
def test_basic_code_gen():
    # create a new system
    system = dy.enter_system()

    # define system inputs
    input1 = dy.system_input(dy.DataTypeFloat64(1),
                             name='input1',
                             default_value=5.0,
                             value_range=[0, 25],
                             title="input #1")

    # the diagram
    tmp = input1 * dy.float64(2.0)
    tmp.set_name("some_name")
    output = dy.delay(tmp)

    # define output(s)
    dy.append_output(output, 'outputs')

    # generate code
    code_gen_results = dy.generate_code(template=dy.TargetWasm(),
                                        folder="generated/",
                                        build=False)
    sourcecode, manifest = code_gen_results['sourcecode'], code_gen_results[
        'manifest']

    # clear workspace
    dy.clear()
import os

from vehicle_lib.vehicle_lib import *

# load track data
with open("track_data/simple_track.json", "r") as read_file:
    track_data = json.load(read_file)

#
# Demo: a vehicle controlled to follow a given path
#
#       Implemented using the code generator openrtdynamics 2 - https://pypi.org/project/openrtdynamics2/ .
#       This generates c++ code for Web Assembly to be run within the browser.
#

system = dy.enter_system()

velocity = dy.system_input(dy.DataTypeFloat64(1),
                           name='velocity',
                           default_value=23.75,
                           value_range=[0, 25],
                           title="vehicle velocity")
k_p = dy.system_input(dy.DataTypeFloat64(1),
                      name='k_p',
                      default_value=2.0,
                      value_range=[0, 10.0],
                      title="controller gain")
disturbance_amplitude = dy.system_input(
    dy.DataTypeFloat64(1),
    name='disturbance_amplitude',
    default_value=20.0,
import os
import json
import numpy as np

from colorama import init,  Fore, Back, Style
init(autoreset=True)

#
# python3 -m http.server
#

#
# Enter a new system (simulation)
#
system = dy.enter_system('simulation')

# list to collect systems imported from libraries
library_entries = []



def firstOrder( u, z_inf, name : str = ''):

    yFb = dy.signal()

    i = dy.add( [ yFb, u ], [ z_inf, 1 ] ).set_name(name + '_i')
    y = dy.delay( i).set_name(name + '_y')

    yFb << y
예제 #4
0
def compile_path_tracker(par={},
                         target_template=None,
                         folder=None,
                         samples_in_buffer=10000):
    """
    Build OpenRTDynamics code for the path tracker

    par               - optional parameters for the model (unused so far)
    target_template   - the openrtdynamics code generation terget template to use
    folder            - the folder to which the generated files are written 
    samples_in_buffer - the size of the buffer storing the samples for the input path    
    """

    dy.clear()
    system = dy.enter_system()

    # time-series for velocity, position, orientation, ...
    input_signals = {}
    input_signals['Ts'] = dy.system_input(dy.DataTypeFloat64(1),
                                          name='Ts',
                                          default_value=0.01,
                                          title="sampling time [s]")
    input_signals['velocity'] = dy.system_input(dy.DataTypeFloat64(1),
                                                name='velocity_',
                                                default_value=1,
                                                title="vehicle velocity [m/s]")
    input_signals['velocity_dot'] = dy.system_input(
        dy.DataTypeFloat64(1),
        name='velocity_dot',
        default_value=1,
        title="vehicle acceleration [m/s^2] (optional)")
    input_signals['x'] = dy.system_input(dy.DataTypeFloat64(1),
                                         name='x',
                                         default_value=0,
                                         title="state x [m]")
    input_signals['y'] = dy.system_input(dy.DataTypeFloat64(1),
                                         name='y',
                                         default_value=0,
                                         title="state y [m]")
    input_signals['x_dot'] = dy.system_input(
        dy.DataTypeFloat64(1),
        name='x_dot',
        default_value=0,
        title="state d/dt x [m/s] (optional)")
    input_signals['y_dot'] = dy.system_input(
        dy.DataTypeFloat64(1),
        name='y_dot',
        default_value=0,
        title="state d/dt y [m/s] (optional)")
    input_signals['Delta_u'] = dy.system_input(
        dy.DataTypeFloat64(1),
        name='Delta_u',
        default_value=0,
        title="Delta_u [rad] (optional)")
    input_signals['Delta_u_dot'] = dy.system_input(
        dy.DataTypeFloat64(1),
        name='Delta_u_dot',
        default_value=0,
        title="Delta_u_dot[rad/s] (optional)")

    # control inputs
    async_input_data_valid = dy.system_input(dy.DataTypeBoolean(1),
                                             name='async_input_data_valid')
    input_sample_valid = dy.system_input(dy.DataTypeBoolean(1),
                                         name='input_sample_valid')

    # inputs for asynchronously arriving path samples
    path_sample = {}
    path_sample['d'] = dy.system_input(dy.DataTypeFloat64(1), name='d_sample')
    path_sample['x'] = dy.system_input(dy.DataTypeFloat64(1), name='x_sample')
    path_sample['y'] = dy.system_input(dy.DataTypeFloat64(1), name='y_sample')
    path_sample['psi'] = dy.system_input(dy.DataTypeFloat64(1),
                                         name='psi_sample')
    path_sample['K'] = dy.system_input(dy.DataTypeFloat64(1), name='K_sample')

    #
    # combine all input signals in a structure that serve as parameters to the
    # callback function (the embedded system) vl.path_lateral_modification2
    #

    output_signals = async_path_data_handler(input_sample_valid,
                                             async_input_data_valid,
                                             path_sample, path_tracking,
                                             input_signals, par,
                                             samples_in_buffer)

    #
    # outputs
    #

    dy.append_output(output_signals['output_valid'], 'output_valid')
    dy.append_output(output_signals['need_more_path_input_data'],
                     'need_more_path_input_data')
    dy.append_output(output_signals['distance_at_the_end_of_horizon'],
                     'distance_at_the_end_of_horizon')
    dy.append_output(output_signals['distance_ahead'], 'distance_ahead')
    dy.append_output(output_signals['head_index'], 'head_index')
    dy.append_output(output_signals['read_position'], 'read_position')
    dy.append_output(output_signals['elements_free_to_write'],
                     'elements_free_to_write')

    # data sampled at the closest point on path
    dy.append_output(output_signals['tracked_index'], 'tracked_index')
    dy.append_output(output_signals['d_star'], 'd_star')
    dy.append_output(output_signals['v_star'], 'v_star')

    dy.append_output(output_signals['x_r'], 'x_r')
    dy.append_output(output_signals['y_r'], 'y_r')
    dy.append_output(output_signals['psi_r'], 'psi_r')
    dy.append_output(output_signals['K_r'], 'K_r')

    dy.append_output(output_signals['psi_r_dot'], 'psi_r_dot')

    dy.append_output(output_signals['Delta_l'], 'Delta_l')
    dy.append_output(output_signals['Delta_l_dot'], 'Delta_l_dot')

    # generate code
    if target_template is None:
        target_template = tg.TargetCppMinimal()

    code_gen_results = dy.generate_code(template=target_template,
                                        folder=folder)

    compiled_system = dyexe.CompiledCode(code_gen_results)

    return code_gen_results, compiled_system
예제 #5
0
def compile_lateral_path_transformer(wheelbase=3.0, Ts=0.01):
    """
    Build OpenRTDynamics code for the lateral path transformation
    """

    dy.clear()
    system = dy.enter_system()

    velocity = dy.system_input(dy.DataTypeFloat64(1),
                               name='velocity_',
                               default_value=1,
                               value_range=[0, 25],
                               title="vehicle velocity")
    Delta_l_r = dy.system_input(dy.DataTypeFloat64(1),
                                name='Delta_l_r',
                                default_value=0.0,
                                value_range=[-10, 10],
                                title="lateral deviation to the path")
    Delta_l_r_dot = dy.system_input(
        dy.DataTypeFloat64(1),
        name='Delta_l_r_dot',
        default_value=0.0,
        value_range=[-10, 10],
        title="1st-order time derivative of lateral deviation to the path")
    Delta_l_r_dotdot = dy.system_input(
        dy.DataTypeFloat64(1),
        name='Delta_l_r_dotdot',
        default_value=0.0,
        value_range=[-10, 10],
        title="2nd-order time derivative of lateral deviation to the path")

    async_input_data_valid = dy.system_input(dy.DataTypeBoolean(1),
                                             name='async_input_data_valid')
    input_sample_valid = dy.system_input(dy.DataTypeBoolean(1),
                                         name='input_sample_valid')

    path_sample = {}
    path_sample['d'] = dy.system_input(dy.DataTypeFloat64(1), name='d_sample')
    path_sample['x'] = dy.system_input(dy.DataTypeFloat64(1), name='x_sample')
    path_sample['y'] = dy.system_input(dy.DataTypeFloat64(1), name='y_sample')
    path_sample['psi'] = dy.system_input(dy.DataTypeFloat64(1),
                                         name='psi_sample')
    path_sample['K'] = dy.system_input(dy.DataTypeFloat64(1), name='K_sample')

    input_signals = Ts, wheelbase, velocity, Delta_l_r, Delta_l_r_dot, Delta_l_r_dotdot

    output_signals = async_path_data_handler(input_sample_valid,
                                             async_input_data_valid,
                                             path_sample, input_signals)

    #
    # outputs: these are available for visualization in the html set-up
    #

    dy.append_output(output_signals['output_valid'], 'output_valid')
    dy.append_output(output_signals['need_more_path_input_data'],
                     'need_more_path_input_data')
    dy.append_output(output_signals['distance_at_the_end_of_horizon'],
                     'distance_at_the_end_of_horizon')
    dy.append_output(output_signals['distance_ahead'], 'distance_ahead')
    dy.append_output(output_signals['head_index'], 'head_index')
    dy.append_output(output_signals['read_position'], 'read_position')
    dy.append_output(output_signals['elements_free_to_write'],
                     'elements_free_to_write')

    dy.append_output(output_signals['tracked_index'], 'tracked_index')
    dy.append_output(output_signals['d_star'], 'path_d_star')

    dy.append_output(output_signals['d'], 'path_d')
    dy.append_output(output_signals['x'], 'path_x')
    dy.append_output(output_signals['y'], 'path_y')
    dy.append_output(output_signals['psi_r'], 'path_psi')
    dy.append_output(output_signals['K'], 'path_K')

    dy.append_output(output_signals['delta'], 'vehicle_delta')
    dy.append_output(output_signals['delta_dot'], 'vehicle_delta_dot')

    dy.append_output(output_signals['psi'], 'vehicle_psi')
    dy.append_output(output_signals['psi_dot'], 'vehicle_psi_dot')

    dy.append_output(velocity * dy.float64(1.0), 'velocity')

    # generate code for Web Assembly (wasm), requires emcc (emscripten) to build
    code_gen_results = dy.generate_code(
        template=dy.TargetWasm(enable_tracing=False),
        folder="generated/tmp1",
        build=False)

    compiled_system = dyexe.CompiledCode(code_gen_results)

    return code_gen_results, compiled_system
def compile_lateral_path_transformer(par={},
                                     target_template=None,
                                     folder=None,
                                     samples_in_buffer=10000):
    """
    Build OpenRTDynamics code for the lateral path transformation

    par               - optional parameters for the model (unused so far)
    target_template   - the openrtdynamics code generation terget template to use
    folder            - the folder to which the generated files are written 
    samples_in_buffer - the size of the buffer storing the samples for the input path    
    """

    dy.clear()
    system = dy.enter_system()

    # parameters
    Ts = dy.system_input(dy.DataTypeFloat64(1),
                         name='Ts',
                         default_value=0.01,
                         title="sampling time [s]")
    wheelbase = dy.system_input(dy.DataTypeFloat64(1),
                                name='wheelbase',
                                default_value=3.0,
                                title="wheelbase (l_r) [m]")

    # time-series for velocity, lateral distance, ...
    velocity = dy.system_input(dy.DataTypeFloat64(1),
                               name='velocity_',
                               default_value=1,
                               value_range=[0, 25],
                               title="vehicle velocity [m/s]")
    Delta_l_r = dy.system_input(dy.DataTypeFloat64(1),
                                name='Delta_l_r',
                                default_value=0.0,
                                value_range=[-10, 10],
                                title="lateral deviation to the path [m]")
    Delta_l_r_dot = dy.system_input(
        dy.DataTypeFloat64(1),
        name='Delta_l_r_dot',
        default_value=0.0,
        value_range=[-10, 10],
        title="1st-order time derivative of lateral deviation to the path [m/s]"
    )
    Delta_l_r_dotdot = dy.system_input(
        dy.DataTypeFloat64(1),
        name='Delta_l_r_dotdot',
        default_value=0.0,
        value_range=[-10, 10],
        title=
        "2nd-order time derivative of lateral deviation to the path [m/s^2]")

    # initial states of the vehicle
    d0 = dy.system_input(dy.DataTypeFloat64(1),
                         name='d0',
                         default_value=0,
                         title="initial state d0 [m]")
    x0 = dy.system_input(dy.DataTypeFloat64(1),
                         name='x0',
                         default_value=0,
                         title="initial state x0 [m]")
    y0 = dy.system_input(dy.DataTypeFloat64(1),
                         name='y0',
                         default_value=0,
                         title="initial state y0 [m]")
    psi0 = dy.system_input(dy.DataTypeFloat64(1),
                           name='psi0',
                           default_value=0,
                           title="initial state psi0 [rad]")
    delta0 = dy.system_input(dy.DataTypeFloat64(1),
                             name='delta0',
                             default_value=0,
                             title="initial state delta0 [rad]")
    delta_dot0 = dy.system_input(dy.DataTypeFloat64(1),
                                 name='delta_dot0',
                                 default_value=0,
                                 title="initial state delta_dot0 [rad/s]")

    # control inputs
    async_input_data_valid = dy.system_input(dy.DataTypeBoolean(1),
                                             name='async_input_data_valid')
    input_sample_valid = dy.system_input(dy.DataTypeBoolean(1),
                                         name='input_sample_valid')

    # inputs for asynchronously arriving path samples
    path_sample = {}
    path_sample['d'] = dy.system_input(dy.DataTypeFloat64(1), name='d_sample')
    path_sample['x'] = dy.system_input(dy.DataTypeFloat64(1), name='x_sample')
    path_sample['y'] = dy.system_input(dy.DataTypeFloat64(1), name='y_sample')
    path_sample['psi'] = dy.system_input(dy.DataTypeFloat64(1),
                                         name='psi_sample')
    path_sample['K'] = dy.system_input(dy.DataTypeFloat64(1), name='K_sample')

    #
    # combine all input signals in a structure that serve as parameters to the
    # callback function (the embedded system) vl.path_lateral_modification2
    #
    input_signals = {
        'Ts': Ts,
        'wheelbase': wheelbase,
        'velocity': velocity,
        'Delta_l_r': Delta_l_r,
        'Delta_l_r_dot': Delta_l_r_dot,
        'Delta_l_r_dotdot': Delta_l_r_dotdot,
        'd0': d0,
        'x0': x0,
        'y0': y0,
        'psi0': psi0,
        'delta0': delta0,
        'delta_dot0': delta_dot0
    }

    output_signals = async_path_data_handler(
        input_sample_valid, async_input_data_valid, path_sample,
        vl.path_lateral_modification2, input_signals, par, samples_in_buffer)

    #
    # outputs
    #

    dy.append_output(output_signals['output_valid'], 'output_valid')
    dy.append_output(output_signals['need_more_path_input_data'],
                     'need_more_path_input_data')
    dy.append_output(output_signals['distance_at_the_end_of_horizon'],
                     'distance_at_the_end_of_horizon')
    dy.append_output(output_signals['distance_ahead'], 'distance_ahead')
    dy.append_output(output_signals['head_index'], 'head_index')
    dy.append_output(output_signals['read_position'], 'read_position')
    dy.append_output(output_signals['elements_free_to_write'],
                     'elements_free_to_write')

    dy.append_output(output_signals['tracked_index'], 'tracked_index')

    dy.append_output(output_signals['d_star'], 'path_d_star')
    dy.append_output(output_signals['d'], 'path_d')
    dy.append_output(output_signals['x'], 'path_x')
    dy.append_output(output_signals['y'], 'path_y')
    dy.append_output(output_signals['psi_r'], 'path_psi')
    dy.append_output(output_signals['K'], 'path_K')

    dy.append_output(output_signals['delta'], 'vehicle_delta')
    dy.append_output(output_signals['delta_dot'], 'vehicle_delta_dot')

    dy.append_output(output_signals['psi'], 'vehicle_psi')
    dy.append_output(output_signals['psi_dot'], 'vehicle_psi_dot')

    dy.append_output(velocity * dy.float64(1.0), 'velocity')

    # generate code
    if target_template is None:
        target_template = tg.TargetCppMinimal()

    code_gen_results = dy.generate_code(template=target_template,
                                        folder=folder)

    compiled_system = dyexe.CompiledCode(code_gen_results)

    return code_gen_results, compiled_system