Closed xuejun7777 closed 8 months ago
我阅读quadrotorsim.py文件的源码想要了解无人机电机具体的怎么控制的,step里的控制函数应该是这个 def _run_internal(self, act):
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最后是怎么实际控制到无人机的电机的,控制的方法是开源的吗?这个问题是否方便回答一下呢?或者是我粗心没有找到控制的代码?
我阅读quadrotorsim.py文件的源码想要了解无人机电机具体的怎么控制的,step里的控制函数应该是这个 def _run_internal(self, act):
Update propeller state
结合其他的脚本我没有看到四维的电机action最后是怎么实际控制到无人机的电机的,控制的方法是开源的吗?这个问题是否方便回答一下呢?或者是我粗心没有找到控制的代码?