Skip to content
Snippets Groups Projects
ProblemData.py 4.85 KiB
Newer Older
Ale's avatar
Ale committed
import numpy as np
import example_robot_data as erd
import pinocchio as pin

Fanny Risbourg's avatar
Fanny Risbourg committed

Ale's avatar
Ale committed
class problemDataAbstract:
Fanny Risbourg's avatar
Fanny Risbourg committed
    def __init__(self, param, frozen_names=[]):
        self.dt = param.dt_mpc  # OCP dt
Your Name's avatar
Your Name committed
        self.dt_wbc = param.dt_wbc
Fanny Risbourg's avatar
Fanny Risbourg committed
        self.mpc_wbc_ratio = int(self.dt / self.dt_wbc)
Ale's avatar
Ale committed
        # self.init_steps = 10
        # self.target_steps = param.gait.shape[0]
Fanny Risbourg's avatar
Fanny Risbourg committed
        self.T = param.gait.shape[0] - 1
Ale's avatar
Ale committed

        self.robot = erd.load("solo12")
        self.q0 = self.robot.q0
Ale's avatar
Ale committed
        self.q0[:7] = np.array([0.0,
                               0.0,
                               0.2607495,
                               0,
                               0,
                               0,
                               1])
Ale's avatar
Ale committed
        self.q0[7:] = param.q_init

        self.model = self.robot.model
        self.rdata = self.model.createData()
        self.collision_model = self.robot.collision_model
        self.visual_model = self.robot.visual_model

        self.robot_weight = -sum([Y.mass for Y in self.model.inertias]) * self.model.gravity.linear[2]

Ale's avatar
Ale committed
        self.frozen_names = frozen_names
Ale's avatar
Ale committed
        if frozen_names != []:
Ale's avatar
Ale committed
            self.frozen_idxs = [self.model.getJointId(
                id) for id in frozen_names]
Ale's avatar
Ale committed
            self.freeze()

        self.nq = self.model.nq
        self.nv = self.model.nv
        self.nx = self.nq + self.nv
Fanny Risbourg's avatar
Fanny Risbourg committed
        self.ndx = 2 * self.nv
        self.nu = (
            12 - len(frozen_names) + 1 if len(frozen_names) != 0 else 12
        )  # -1 to take into account the freeflyer
Ale's avatar
Ale committed
        self.ntau = self.nv

Ale's avatar
Ale committed
        self.effort_limit = np.ones(self.nu) * 2.5
Ale's avatar
Ale committed

        self.v0 = np.zeros(18)
        self.x0 = np.concatenate([self.q0, self.v0])
        self.u0 = np.zeros(self.nu)

        self.baumgarte_gains = np.array([0, 50])
Ale's avatar
Ale committed

Ale's avatar
Ale committed
        self.xref = self.x0
        self.uref = self.u0
Fanny Risbourg's avatar
Fanny Risbourg committed

        self.lfFoot, self.rfFoot, self.lhFoot, self.rhFoot = (
            "FL_FOOT",
            "FR_FOOT",
            "HL_FOOT",
            "HR_FOOT",
        )
Ale's avatar
Ale committed
        self.cnames = [self.lfFoot, self.rfFoot, self.lhFoot, self.rhFoot]
Fanny Risbourg's avatar
Fanny Risbourg committed
        self.allContactIds = [self.model.getFrameId(f) for f in self.cnames]
Ale's avatar
Ale committed
        self.lfFootId = self.model.getFrameId(self.lfFoot)
        self.rfFootId = self.model.getFrameId(self.rfFoot)
        self.lhFootId = self.model.getFrameId(self.lhFoot)
        self.rhFootId = self.model.getFrameId(self.rhFoot)
        self.Rsurf = np.eye(3)

    def freeze(self):
        geom_models = [self.visual_model, self.collision_model]
        self.model, geometric_models_reduced = pin.buildReducedModel(
Fanny Risbourg's avatar
Fanny Risbourg committed
            self.model,
            list_of_geom_models=geom_models,
            list_of_joints_to_lock=self.frozen_idxs,
            reference_configuration=self.q0,
        )
Ale's avatar
Ale committed
        self.rdata = self.model.createData()
        self.visual_model = geometric_models_reduced[0]
        self.collision_model = geometric_models_reduced[1]

Fanny Risbourg's avatar
Fanny Risbourg committed

Ale's avatar
Ale committed
class ProblemData(problemDataAbstract):
    def __init__(self, param):
        super().__init__(param)
Fanny Risbourg's avatar
Fanny Risbourg committed

Ale's avatar
Ale committed
        self.useFixedBase = 0
Ale's avatar
Ale committed

Ale's avatar
Ale committed
        self.baseId = self.model.getFrameId("base_link")

Ale's avatar
Ale committed
        # Cost function weights
Ale's avatar
Ale committed
        # Cost function weights
Ale's avatar
Ale committed
        ref_foot_flying_altitude = 7e-2
Ale's avatar
Ale committed
        self.fly_high_slope = 3 / ref_foot_flying_altitude
Ale's avatar
Ale committed

Ale's avatar
Ale committed
        self.mu = 0.7
Ale's avatar
Ale committed
        self.base_velocity_tracking_w = 1e2
Ale's avatar
Ale committed
        self.ground_collision_w = 1e3
        self.fly_high_w = 1e3
Ale's avatar
Ale committed

Ale's avatar
Ale committed
        self.friction_cone_w = 1e4
Ale's avatar
Ale committed
        self.impact_altitude_w= 1e3
        self.impact_velocity_w = 1e3
Ale's avatar
Ale committed

Ale's avatar
Ale committed
        self.control_bound_w = 1e3 * 0
Ale's avatar
Ale committed
        self.control_reg_w = 1e0
Ale's avatar
Ale committed
        self.state_reg_w = np.array([0] * 3
                                    + [1e1] * 3
Ale's avatar
Ale committed
                                    + [1e1] * 12
Ale's avatar
Ale committed
                                    + [0] * 6
                                    + [1e1] * 3
Ale's avatar
Ale committed
                                    + [1e1] * 3
Ale's avatar
Ale committed
                                    + [1e1] * 6
                                    )
Ale's avatar
Ale committed
        self.terminal_velocity_w = np.array(
Ale's avatar
Ale committed
            [0] * self.nv + [1e4] * self.nv)
Ale's avatar
Ale committed
        self.force_reg_w = 1e0

Ale's avatar
Ale committed
        self.xref = self.x0
Ale's avatar
Ale committed
        self.uref =self.u0
Ale's avatar
Ale committed


class ProblemDataFull(problemDataAbstract):
    def __init__(self, param):
Fanny Risbourg's avatar
Fanny Risbourg committed
        frozen_names = ["root_joint"]
Ale's avatar
Ale committed

        super().__init__(param, frozen_names)
Fanny Risbourg's avatar
Fanny Risbourg committed

Ale's avatar
Ale committed
        self.useFixedBase = 1

        # Cost function weights
        self.mu = 0.7
Ale's avatar
Ale committed
        self.foot_tracking_w = 1e4
Ale's avatar
Ale committed
        self.friction_cone_w = 1e3
Ale's avatar
Ale committed
        self.control_bound_w = 1e3
Ale's avatar
Ale committed
        self.control_reg_w = 1e0
Ale's avatar
Ale committed
        self.state_reg_w = np.array(
odri's avatar
odri committed
            [1e2] * 3 + [1e-2] * 3 + [1e2] * 6 +
Ale's avatar
Ale committed
            [1e1] * 3 + [1e0] * 3 + [1e1] * 6
Fanny Risbourg's avatar
Fanny Risbourg committed
        )
Ale's avatar
Ale committed
        self.terminal_velocity_w = np.array([0] * 12 + [1e3] * 12)

        self.q0_reduced = self.q0[7:]
        self.v0_reduced = np.zeros(self.nv)
Ale's avatar
Ale committed
        self.x0_reduced = np.concatenate([self.q0_reduced, self.v0_reduced])
Ale's avatar
Ale committed

Ale's avatar
Ale committed
        self.xref = self.x0_reduced
Ale's avatar
Ale committed
        self.uref = self.u0