PaddlePaddle / PARL

A high-performance distributed training framework for Reinforcement Learning
https://parl.readthedocs.io/
Apache License 2.0
3.22k stars 817 forks source link

有关rlschool无人机环境中无人机电机控制的问题 #1097

Closed xuejun7777 closed 8 months ago

xuejun7777 commented 1 year ago

我阅读quadrotorsim.py文件的源码想要了解无人机电机具体的怎么控制的,step里的控制函数应该是这个 def _run_internal(self, act):

Update propeller state

    prop_force = np.zeros(3).astype(np.float32)
    prop_torque = np.zeros(3).astype(np.float32)
    prop_powers = np.zeros(4).astype(np.float32)
    me = np.zeros(4).astype(np.float32)

    for i in range(4):
        eff_act = act[i]
        if eff_act > self._max_voltage:
            eff_act = self._max_voltage
        elif eff_act < self._min_voltage:
            eff_act = self._min_voltage

        phi_w = self._thrust_coeff_phi * self.propeller_angular_velocity[i]
        me[i] = self._thrust_coeff_phi / self._thrust_coeff_ra * \
            (eff_act - phi_w)
        prop_powers[i] = abs(me[i] / self._thrust_coeff_phi * eff_act)

        d_prop_w = 1.0 / self._thrust_coeff_jm * \
            (me[i] - self._thrust_coeff_mm)

        w_m = self.propeller_angular_velocity[i] + \
            self._precision * d_prop_w
        l_m = np.linalg.norm(self._propeller_coord[i])
        body_velocity = np.matmul(self._coordination_converter_to_body,
                                  self.global_velocity)
        bw_to_v = np.cross(
            self.body_angular_velocity, self._propeller_coord[i]) * l_m
        v_1 = body_velocity[2] + bw_to_v[2]
        sign = 1.0 if v_1 > 0 else -1.0

        thrust = self._thrust_coeff_ct_0 * w_m * w_m + \
            self._thrust_coeff_ct_1 * w_m * v_1 + \
            self._thrust_coeff_ct_2 * v_1 * v_1 * sign

        self.propeller_angular_velocity[i] = w_m
        prop_force[2] += thrust
        prop_torque += np.cross(
            -np.array([0.0, 0.0, thrust], dtype=np.float32),
            self._propeller_coord[i])

    prop_torque[2] += -me[0] + me[1] - me[2] + me[3]

    f_drag = -np.linalg.norm(self.global_velocity) * \
        np.matmul(
            np.matmul(self._drag_coeff_force,
                      self._coordination_converter_to_body),
            self.global_velocity)
    t_drag = -np.linalg.norm(self.body_angular_velocity) * \
        np.matmul(self._drag_coeff_momentum, self.body_angular_velocity)

    gravity_acc = np.array([0.0, 0.0, -GRAVITY_ACCELERATION],
                           dtype=np.float32)
    f_grav = np.matmul(self._coordination_converter_to_body,
                       gravity_acc) * self._quality
    t_grav = -np.cross(f_grav, self._gravity_center)

    f_all = prop_force + f_grav + f_drag
    t_all = prop_torque + t_grav + t_drag

    body_acc = f_all / self._quality
    acc = np.matmul(self._coordination_converter_to_world, body_acc)
    self.global_position += self.global_velocity * self._precision + \
        0.5 * self._precision * self._precision * acc
    self.global_velocity += self._precision * acc
    self.power = np.sum(prop_powers)

    tmp_w = self.body_angular_velocity + 0.5 * self._precision * \
        np.matmul(self._inverse_inertia, t_all)

    skew_sym_w = np.zeros((3, 3)).astype(np.float32)
    skew_sym_w[0, 1] = -tmp_w[2]
    skew_sym_w[0, 2] = tmp_w[1]
    skew_sym_w[1, 0] = tmp_w[2]
    skew_sym_w[1, 2] = -tmp_w[0]
    skew_sym_w[2, 0] = -tmp_w[1]
    skew_sym_w[2, 1] = tmp_w[0]

    self.rotation_matrix += self._precision * \
        np.matmul(self.rotation_matrix, skew_sym_w)
    self.body_angular_velocity += self._precision * \
        np.matmul(self._inverse_inertia, t_all)

    self._coordination_converter_to_world = self.rotation_matrix
    self._coordination_converter_to_body = np.linalg.inv(
        self.rotation_matrix)

    self._check_failure()

结合其他的脚本我没有看到四维的电机action最后是怎么实际控制到无人机的电机的,控制的方法是开源的吗?这个问题是否方便回答一下呢?或者是我粗心没有找到控制的代码?