Diff of /arm_model/main.py [000000] .. [794894]

Switch to unified view

a b/arm_model/main.py
1
import sympy as sp
2
import numpy as np
3
import pylab as plt
4
from model import ArmModel
5
from simulation import Simulation
6
from projection import TaskSpace, MuscleSpace
7
from controller import JointSpaceController, TaskSpaceController,\
8
    MuscleSpaceControllerJS, PosturalMuscleSpaceController
9
from analysis import FeasibleMuscleSetAnalysis, StiffnessAnalysis
10
from util import calculate_feasible_muscle_set,\
11
    calculate_stiffness_properties
12
from sympy import init_printing
13
from IPython.display import display
14
15
import logging
16
logging.basicConfig(level=logging.DEBUG)
17
18
# basic configuration
19
init_printing(use_unicode=True, wrap_line=False,
20
              no_global=True, use_latex=True)  # 'mathjax'
21
# np.set_printoptions(precision=3)
22
plt.ioff()
23
# plt.ion()
24
plt.rcParams['font.size'] = 15
25
26
# ------------------------------------------------------------------------
27
# utilities
28
# ------------------------------------------------------------------------
29
30
31
def joint_space_control(model, fig_name='results/js_control', format='pdf'):
32
    """Make use of the joint space controller to simulate a movement.
33
34
    """
35
    # b = 0.05 produces smooth profiles
36
    t_end = 5.0
37
    fig, ax = plt.subplots(2, 3, figsize=(15, 10))
38
39
    # controller
40
    controller = JointSpaceController(model)
41
42
    # numerical integration
43
    simulation = Simulation(model, controller)
44
    simulation.integrate(t_end)
45
    simulation.plot_simulation(ax[0])
46
    controller.reporter.plot_joint_space_data(ax[1])
47
48
    fig.tight_layout()
49
    fig.savefig(fig_name + '.' + format, format=format, dpi=300)
50
    fig.savefig(fig_name + '.' + 'eps', format='eps', dpi=300)
51
    fig.show()
52
53
    return controller, t_end
54
55
56
def task_space_control(model, angle, evaluate_muscle_forces,
57
                       fig_name='results/ts_control', format='pdf'):
58
    """Make use of the task space controller to simulate a movement.
59
60
    """
61
    t_end = 2.0
62
    fig, ax = plt.subplots(2, 3, figsize=(15, 10))
63
64
    # define the end effector position in terms of q's
65
    end_effector = sp.Matrix(model.ee)
66
    display('x_t = ', end_effector)
67
68
    # task space
69
    task = TaskSpace(model, end_effector)
70
    controller = TaskSpaceController(
71
        model, task, angle, evaluate_muscle_forces)
72
73
    # numerical integration
74
    simulation = Simulation(model, controller)
75
    simulation.integrate(t_end)
76
    simulation.plot_simulation(ax[0])
77
    controller.reporter.plot_task_space_data(ax[1])
78
79
    fig.tight_layout()
80
    fig.savefig(fig_name + '.' + format, format=format, dpi=300)
81
    fig.savefig(fig_name + '.' + 'eps', format='eps', dpi=300)
82
    fig.show()
83
84
    return controller, t_end, task
85
86
87
def muscle_space_control(model, use_optimization,
88
                         fig_name='results/ms_control', format='pdf'):
89
    """Make use of the muscle space controller to simulate a movement.
90
91
    """
92
    # requires small b = 0.01 or 0
93
    t_end = 3.0
94
    fig, ax = plt.subplots(2, 3, figsize=(15, 10))
95
96
    # muscle space
97
    muscle_space = MuscleSpace(model, use_optimization)
98
    controller = MuscleSpaceControllerJS(model, muscle_space)
99
100
    # numerical integration
101
    simulation = Simulation(model, controller)
102
    simulation.integrate(t_end)
103
    simulation.plot_simulation(ax[0])
104
    controller.reporter.plot_muscle_space_data_js(ax[1])
105
106
    fig.tight_layout()
107
    fig.savefig(fig_name + '.' + format, format=format, dpi=300)
108
    fig.savefig(fig_name + '.' + 'eps', format='eps', dpi=300)
109
    fig.show()
110
111
112
def postural_muscle_space_control(model, kp, use_optimization,
113
                                  fig_name='results/pc_control', format='pdf'):
114
    """Make use of the muscle space controller for posture control.
115
116
    """
117
    t_end = 3.0
118
    kd = 10
119
    delay = 0.02
120
    a = 15.0
121
    t0 = 0.1
122
    sigma = 0.01
123
    gamma = np.pi
124
    fig, ax = plt.subplots(2, 3, figsize=(15, 10))
125
126
    # muscle space
127
    muscle_space = MuscleSpace(model, use_optimization=use_optimization)
128
    controller = PosturalMuscleSpaceController(model, muscle_space, kp, kd,
129
                                               delay, a, t0, sigma, gamma)
130
131
    # numerical integration
132
    simulation = Simulation(model, controller)
133
    simulation.integrate(t_end)
134
    simulation.plot_simulation(ax[0])
135
    controller.reporter.plot_postural_muscle_space_data(ax[1])
136
137
    fig.tight_layout()
138
    fig.savefig(fig_name + '.' + format, format=format, dpi=300)
139
    fig.savefig(fig_name + '.' + 'eps', format='eps', dpi=300)
140
    fig.show()
141
142
143
def export_eom(model):
144
    """Exports equations of motion of the model in a latex format.
145
146
    """
147
    M = model.M
148
    f = model.f
149
    R = model.R
150
    for i in range(0, M.shape[0]):
151
        for j in range(0, M.shape[1]):
152
            print('\\begin{dmath}')
153
            print('M_{' + str(i + 1) + ',' + str(j + 1) + '} = ' +
154
                  sp.latex(M[i, j], mode='plain'))
155
            print('\\end{dmath}')
156
157
    for i in range(0, f.shape[0]):
158
        print('\\begin{dmath}')
159
        print('f_' + str(i + 1) + ' = ' + sp.latex(f[i], mode='plain'))
160
        print('\\end{dmath}')
161
162
    for i in range(0, R.shape[0]):
163
        for j in range(0, R.shape[1]):
164
            print('\\begin{dmath}')
165
            print('R_{' + str(i + 1) + ',' + str(j + 1) + '} = ' +
166
                  sp.latex(R[i, j], mode='plain'))
167
            print('\\end{dmath}')
168
169
170
def draw_model(model):
171
    """Draw a model in a pre-defined pose.
172
173
    """
174
    fig, ax = plt.subplots(1, 1, figsize=(10, 10), frameon=False)
175
    model.draw_model([60, 70, 50], True, ax, 1, False)
176
    fig.tight_layout()
177
    fig.savefig('results/arm_model.pdf', dpi=600, format='pdf',
178
                transparent=True, pad_inches=0, bbox_inches='tight')
179
    fig.savefig('results/arm_model.eps', dpi=600, format='eps',
180
                transparent=True, pad_inches=0, bbox_inches='tight')
181
    plt.show()
182
183
184
# ------------------------------------------------------------------------
185
# main
186
# ------------------------------------------------------------------------
187
188
plt.close('all')
189
case_study = 5
190
if case_study == 0:  # joint space
191
    model = ArmModel(use_gravity=0, use_coordinate_limits=0, use_viscosity=0)
192
    model.pre_substitute_parameters()
193
    base_name = 'results/joint_space_control/joint_space'
194
    controller, t_end = joint_space_control(model, fig_name=base_name)
195
elif case_study == 1:  # task space and feasible muscle forces
196
    model = ArmModel(use_gravity=0, use_coordinate_limits=1, use_viscosity=1)
197
    model.pre_substitute_parameters()
198
    base_name = 'results/task_space_control/task_space'
199
    controller, t_end, task = task_space_control(model, np.pi, False,
200
                                                 fig_name=base_name)
201
    feasible_muscle_set = FeasibleMuscleSetAnalysis(model, controller.reporter)
202
    base_name = 'results/feasible_muscle_forces/feasible_forces_ts180_'
203
    calculate_feasible_muscle_set(feasible_muscle_set,
204
                                  base_name, 0.0, t_end,
205
                                  0.1, 500)
206
elif case_study == 2:  # posture
207
    model = ArmModel(use_gravity=0, use_coordinate_limits=0, use_viscosity=0)
208
    model.pre_substitute_parameters()
209
    base_name = 'results/posture_control/posture_full'
210
    postural_muscle_space_control(model, 10, True, fig_name=base_name)
211
    base_name = 'results/posture_control/posture_reflex'
212
    postural_muscle_space_control(model, 0, True, fig_name=base_name)
213
elif case_study == 3:  # muscle space
214
    model = ArmModel(use_gravity=0, use_coordinate_limits=0, use_viscosity=0)
215
    model.pre_substitute_parameters()
216
    base_name = 'results/muscle_space_control/muscle_space'
217
    muscle_space_control(model, False, fig_name=base_name)
218
elif case_study == 4:  # model export
219
    model = ArmModel(use_gravity=1, use_coordinate_limits=0, use_viscosity=0)
220
    draw_model(model)
221
    export_eom(model)
222
elif case_study == 5:  # static stiffness
223
    model = ArmModel(use_gravity=0, use_coordinate_limits=1, use_viscosity=1)
224
    model.pre_substitute_parameters()
225
    base_name = 'results/feasible_stiffness/feasible_forces_ts180'
226
    controller, t_end, task = task_space_control(model, np.pi, True,
227
                                                 fig_name=base_name)
228
    feasible_muscle_set = FeasibleMuscleSetAnalysis(model, controller.reporter)
229
    stiffness_analysis = StiffnessAnalysis(model, task, controller.reporter,
230
                                           feasible_muscle_set)
231
    base_name = 'results/feasible_stiffness/feasible_stiffness_ts180_'
232
    calculate_stiffness_properties(stiffness_analysis, base_name,
233
                                   0, t_end, 0.2, 500)
234
else:
235
    print('Undefined case')