changed the vertical axis from y to z

This commit is contained in:
franchioping 2026-03-02 18:40:33 +00:00
parent 55fbc7830a
commit 3790a7c337
19 changed files with 215 additions and 60 deletions

View File

@ -1,11 +1,14 @@
import os import os
import subprocess import subprocess
subprocess.run("rm -rf final && mkdir final", shell=True) FOLDER_PREFIX = "configurations/"
MOT_FOLDER = FOLDER_PREFIX + "mot/"
SIM_FOLDER = FOLDER_PREFIX + "sim/"
PID_FOLDER = FOLDER_PREFIX + "pid_cont/"
FINAL_FOLDER = FOLDER_PREFIX + "final/"
subprocess.run(f"rm -rf {FINAL_FOLDER} && mkdir {FINAL_FOLDER}", shell=True)
MOT_FOLDER = "mot/"
SIM_FOLDER = "sim/"
PID_FOLDER = "pid_cont/"
mot_files = os.listdir(MOT_FOLDER) mot_files = os.listdir(MOT_FOLDER)
sim_files = os.listdir(SIM_FOLDER) sim_files = os.listdir(SIM_FOLDER)
@ -22,7 +25,7 @@ for case in prod:
with open(PID_FOLDER + case[2], "r") as f3: with open(PID_FOLDER + case[2], "r") as f3:
settings = f1.read() + "\n" + f2.read() + "\n" + f3.read() settings = f1.read() + "\n" + f2.read() + "\n" + f3.read()
with open( with open(
"final/" + "".join(case).replace(".toml", "_").removesuffix("_") + ".toml", FINAL_FOLDER + "".join(case).replace(".toml", "_").removesuffix("_") + ".toml",
"w", "w",
) as f: ) as f:
f.write(settings) f.write(settings)

View File

@ -5,9 +5,10 @@ mass = 0.350
time_constant = 0.00 time_constant = 0.00
# roll, pitch, yaw
motor_map = [ motor_map = [
[-1.0, 1.0, 1.0], # Front Right [1.0, -1.0, 1.0], # Front Right
[1.0, -1.0, 1.0], # Front Left [-1.0, -1.0, -1.0], # Front Left
[1.0, 1.0, -1.0], # Rear Left [-1.0, 1.0, 1.0], # Rear Left
[-1.0, -1.0, -1.0], # Rear Right [1.0, 1.0, -1.0], # Rear Right
] ]

View File

@ -1,12 +0,0 @@
max_thrust = 2.6
max_torque = 0.5
mass = 0.350
time_constant = 0.01
motor_map = [
[-1.0, 1.0, 1.0], # Front Right
[1.0, -1.0, 1.0], # Front Left
[1.0, 1.0, -1.0], # Rear Left
[-1.0, -1.0, -1.0], # Rear Right
]

View File

@ -12,9 +12,9 @@ stack = { max_rate = 3.14, rotation_pid = { kp = [
0.0, 0.0,
0.0, 0.0,
], frequency = 50.0 }, rate_pid = { kp = [ ], frequency = 50.0 }, rate_pid = { kp = [
0.03, 0.1,
0.3, 0.1,
0.03, 1.0,
], ki = [ ], ki = [
0.0, 0.0,
0.0, 0.0,

View File

@ -0,0 +1,26 @@
stack = { max_rate = 3.14, rotation_pid = { kp = [
1.5,
1.5,
1.5,
], ki = [
0.0,
0.0,
0.0,
], kd = [
0.0,
0.0,
0.0,
], frequency = 50.0 }, rate_pid = { kp = [
0.2,
0.2,
2.0,
], ki = [
0.0,
0.0,
0.0,
], kd = [
0.0,
0.0,
0.0,
], frequency = 600.0 } }

View File

@ -13,8 +13,8 @@ stack = { max_rate = 3.14, rotation_pid = { kp = [
0.0, 0.0,
], frequency = 50.0 }, rate_pid = { kp = [ ], frequency = 50.0 }, rate_pid = { kp = [
0.03, 0.03,
0.3, 0.0,
0.03, 0.0,
], ki = [ ], ki = [
0.0, 0.0,
0.0, 0.0,

View File

@ -1,8 +1,8 @@
stack = { max_rate = 3.14, rotation_pid = { kp = [ stack = { max_rate = 3.14, rotation_pid = { kp = [
0.5, 1.0,
0.5, 1.0,
0.5, 1.0,
], ki = [ ], ki = [
0.0, 0.0,
0.0, 0.0,
@ -11,10 +11,10 @@ stack = { max_rate = 3.14, rotation_pid = { kp = [
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
], frequency = 100.0 }, rate_pid = { kp = [ ], frequency = 50.0 }, rate_pid = { kp = [
0.03, 0.0,
0.3,
0.03, 0.03,
0.0,
], ki = [ ], ki = [
0.0, 0.0,
0.0, 0.0,

View File

@ -0,0 +1,26 @@
stack = { max_rate = 3.14, rotation_pid = { kp = [
1.0,
1.0,
1.0,
], ki = [
0.0,
0.0,
0.0,
], kd = [
0.0,
0.0,
0.0,
], frequency = 50.0 }, rate_pid = { kp = [
0.0,
0.0,
0.3,
], ki = [
0.0,
0.0,
0.0,
], kd = [
0.0,
0.0,
0.0,
], frequency = 600.0 } }

92
inputs/not/rot_all.json Normal file
View File

@ -0,0 +1,92 @@
{
"records": [
{
"input": {
"joystick": {
"throttle_input": 0,
"roll_input": 0,
"yaw_input": 0,
"pitch_input": 0
},
"position": {
"lat": 0,
"long": 0,
"alt": 0
},
"rotation": {
"roll": 0,
"yaw": 0,
"pitch": 0
},
"mode": "Rotation"
},
"time": 0
},
{
"input": {
"joystick": {
"throttle_input": 0,
"roll_input": 0,
"yaw_input": 0,
"pitch_input": 0
},
"position": {
"lat": 0,
"long": 0,
"alt": 0
},
"rotation": {
"roll": 3.14,
"yaw": 3.1,
"pitch": 1.5
},
"mode": "Rotation"
},
"time": 3
},
{
"input": {
"joystick": {
"throttle_input": 0,
"roll_input": 0,
"yaw_input": 0,
"pitch_input": 0
},
"position": {
"lat": 0,
"long": 0,
"alt": 0
},
"rotation": {
"roll": -1.5,
"yaw": 0.8,
"pitch": 0.4
},
"mode": "Rotation"
},
"time": 10
},
{
"input": {
"joystick": {
"throttle_input": 0,
"roll_input": 0,
"yaw_input": 0,
"pitch_input": 0
},
"position": {
"lat": 0,
"long": 0,
"alt": 0
},
"rotation": {
"roll": 1.5,
"yaw": 0.1,
"pitch": 2
},
"mode": "Rotation"
},
"time": 20
}
]
}

View File

@ -2,7 +2,7 @@ use nalgebra::{vector, Vector3};
use rapier3d::prelude::*; use rapier3d::prelude::*;
use serde::Deserialize; use serde::Deserialize;
#[derive(Debug, Deserialize, Clone)] #[derive(Default, Debug, Deserialize, Clone)]
pub struct PidConfig { pub struct PidConfig {
pub kp: [f32; 3], pub kp: [f32; 3],
pub ki: [f32; 3], pub ki: [f32; 3],
@ -26,8 +26,10 @@ impl PidConfig {
#[derive(Debug, Deserialize, Clone)] #[derive(Debug, Deserialize, Clone)]
pub struct ControllerStackConfig { pub struct ControllerStackConfig {
/// PID for the rotation (angle → angular rate) layer /// PID for the rotation (angle → angular rate) layer
#[serde(default)]
pub rotation_pid: PidConfig, pub rotation_pid: PidConfig,
#[serde(default)]
pub acceleration_pid: PidConfig, pub acceleration_pid: PidConfig,
/// PID for the angular rate (angular rate → torque) layer /// PID for the angular rate (angular rate → torque) layer

View File

@ -34,10 +34,10 @@ impl Default for MotorCharacteristics {
* 2 --- 3 * 2 --- 3
*/ */
relative_motor_positions: [ relative_motor_positions: [
rp::point![5.0, 0.0, 5.0], rp::point![5.0, 5.0, 0.0],
rp::point![5.0, 0.0, -5.0], rp::point![5.0, -5.0, 0.0],
rp::point![-5.0, 0.0, -5.0], rp::point![-5.0, -5.0, 0.0],
rp::point![-5.0, 0.0, 5.0], rp::point![-5.0, 5.0, 0.0],
], ],
max_thrust: 2.6, max_thrust: 2.6,
max_torque: 0.5, max_torque: 0.5,
@ -70,7 +70,7 @@ impl Drone {
) -> Drone { ) -> Drone {
let drone_rb_handle = world.register_body( let drone_rb_handle = world.register_body(
rp::RigidBodyBuilder::dynamic() rp::RigidBodyBuilder::dynamic()
.translation(rp::vector![0.0, 10.0, 0.0]) .translation(rp::vector![0.0, 0.0, 10.0])
.rotation(rp::vector![0.0, 0.0, 0.0]) .rotation(rp::vector![0.0, 0.0, 0.0])
/* /*
* These damping values keep the simulation more realistic, * These damping values keep the simulation more realistic,
@ -164,7 +164,7 @@ impl Drone {
// Apply RB's rotation to point at RB's Up // Apply RB's rotation to point at RB's Up
// //
// motor_position is relative, transform it by the RB's position first // motor_position is relative, transform it by the RB's position first
let mut thrust_force = nalgebra::Vector3::new(0.0, thrust, 0.0); let mut thrust_force = nalgebra::Vector3::new(0.0, 0.0, thrust);
thrust_force = drone_rb.rotation().transform_vector(&thrust_force); thrust_force = drone_rb.rotation().transform_vector(&thrust_force);
drone_rb.add_force_at_point( drone_rb.add_force_at_point(
thrust_force, thrust_force,
@ -173,9 +173,9 @@ impl Drone {
); );
let torque = if i % 2 == 0 { let torque = if i % 2 == 0 {
rp::vector![0.0, torque, 0.0] rp::vector![0.0, 0.0, torque]
} else { } else {
rp::vector![0.0, -torque, 0.0] rp::vector![0.0, 0.0, -torque]
}; };
drone_rb.add_torque(drone_rb.rotation().transform_vector(&torque), true); drone_rb.add_torque(drone_rb.rotation().transform_vector(&torque), true);
} }

View File

@ -44,9 +44,13 @@ pub enum ModeInput {
#[derive(Default, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[derive(Default, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct Input { pub struct Input {
#[serde(default)]
pub joystick: JoystickInput, pub joystick: JoystickInput,
#[serde(default)]
pub acceleration: AccelerationInput, pub acceleration: AccelerationInput,
#[serde(default)]
pub rotation: RotationInput, pub rotation: RotationInput,
#[serde(default)]
pub position: PositionInput, pub position: PositionInput,
pub mode: ModeInput, pub mode: ModeInput,
} }

View File

@ -86,8 +86,8 @@ impl DroneController for StackedController {
// println!("Rotation!"); // println!("Rotation!");
Rotation(na::vector![ Rotation(na::vector![
self.input.rotation.roll, self.input.rotation.roll,
self.input.rotation.yaw,
self.input.rotation.pitch, self.input.rotation.pitch,
self.input.rotation.yaw,
]) ])
}; };
self.rotation_rt self.rotation_rt
@ -96,8 +96,8 @@ impl DroneController for StackedController {
AngularRate( AngularRate(
na::vector![ na::vector![
self.input.joystick.roll_input, self.input.joystick.roll_input,
self.input.joystick.yaw_input,
self.input.joystick.pitch_input, self.input.joystick.pitch_input,
self.input.joystick.yaw_input,
] * self.config.stack.max_rate, ] * self.config.stack.max_rate,
) )
}; };

View File

@ -12,7 +12,7 @@ impl Default for MotorMixingMode {
} }
pub struct MotorMixer { pub struct MotorMixer {
pub motor_map: [[f32; 3]; 4], // roll, yaw, pitch pub motor_map: [[f32; 3]; 4], // roll, pitch, yaw
pub min_throttle: f32, pub min_throttle: f32,
pub max_throttle: f32, pub max_throttle: f32,
pub mixing_mode: MotorMixingMode, pub mixing_mode: MotorMixingMode,
@ -77,12 +77,14 @@ impl MotorMixer {
scale = scale.clamp(min_scale, 1.0); scale = scale.clamp(min_scale, 1.0);
let max_delta = scale * delta.into_iter().reduce(f32::max).unwrap_or(0.0); let mut max_delta = scale * delta.into_iter().reduce(f32::max).unwrap_or(0.0);
let min_delta = scale * delta.into_iter().reduce(f32::min).unwrap_or(0.0); let mut min_delta = scale * delta.into_iter().reduce(f32::min).unwrap_or(0.0);
let delta_dif = max_delta - min_delta; let delta_dif = max_delta - min_delta;
if delta_dif > throttle_range_len { if delta_dif > throttle_range_len {
scale *= throttle_range_len / delta_dif; scale *= throttle_range_len / delta_dif * 0.9;
max_delta *= throttle_range_len / delta_dif * 0.9;
min_delta *= throttle_range_len / delta_dif * 0.9;
} }
let lim_throttle = throttle.clamp( let lim_throttle = throttle.clamp(

View File

@ -38,7 +38,7 @@ pub struct ColliderExtraData {
impl World { impl World {
pub fn new(dt: f32) -> Self { pub fn new(dt: f32) -> Self {
let gravity: na::Vector3<f32> = rp::vector![0.0, -9.81, 0.0]; let gravity: na::Vector3<f32> = rp::vector![0.0, 0.0, -9.81];
let mut integration_parameters = rp::IntegrationParameters::default(); let mut integration_parameters = rp::IntegrationParameters::default();
integration_parameters.set_inv_dt(dt); integration_parameters.set_inv_dt(dt);
let physics_pipeline = rp::PhysicsPipeline::new(); let physics_pipeline = rp::PhysicsPipeline::new();
@ -153,7 +153,7 @@ impl World {
impl Default for World { impl Default for World {
fn default() -> Self { fn default() -> Self {
let gravity: na::Vector3<f32> = rp::vector![0.0, -9.81, 0.0]; let gravity: na::Vector3<f32> = rp::vector![0.0, 0.0, -9.81];
let mut integration_parameters = rp::IntegrationParameters::default(); let mut integration_parameters = rp::IntegrationParameters::default();
integration_parameters.set_inv_dt(600.0); integration_parameters.set_inv_dt(600.0);
let physics_pipeline = rp::PhysicsPipeline::new(); let physics_pipeline = rp::PhysicsPipeline::new();

View File

@ -6,7 +6,7 @@ use std::error::Error;
use crate::{ use crate::{
drone::{ drone::{
controller::DroneController, controller::DroneController,
input::{Input, InputRecording}, input::{Input, InputRecording, ModeInput},
Drone, Drone,
}, },
engine::World, engine::World,
@ -161,8 +161,8 @@ impl Simulation {
let mut target_angular_vel: na::Vector3<f32> = na::vector![ let mut target_angular_vel: na::Vector3<f32> = na::vector![
current_input.joystick.roll_input, current_input.joystick.roll_input,
current_input.joystick.yaw_input,
current_input.joystick.pitch_input, current_input.joystick.pitch_input,
current_input.joystick.yaw_input,
] * 3.14; ] * 3.14;
let mut target_mot: na::Vector3<f32> = Default::default(); let mut target_mot: na::Vector3<f32> = Default::default();
@ -172,19 +172,30 @@ impl Simulation {
.as_mut_any() .as_mut_any()
.downcast_mut::<crate::drone::stacked::StackedController>() .downcast_mut::<crate::drone::stacked::StackedController>()
{ {
target_angular_vel = cont.rotation_rt.last_output.unwrap_or_default().0; if current_input.mode != ModeInput::Acro {
target_angular_vel = cont.rotation_rt.last_output.unwrap_or_default().0;
}
target_mot = cont.rate_rt.last_output.unwrap_or_default().0; target_mot = cont.rate_rt.last_output.unwrap_or_default().0;
} }
/*
# roll, pitch, yaw
motor_map = [
[1.0, -1.0, 1.0], # Front Right
[-1.0, -1.0, -1.0], # Front Left
[-1.0, 1.0, 1.0], # Rear Left
[1.0, 1.0, -1.0], # Rear Right
]
*/
let applied_motor_diff: na::Vector3<f32> = na::vector![ let applied_motor_diff: na::Vector3<f32> = na::vector![
(self.drone.current_throttles[1] + self.drone.current_throttles[2] (self.drone.current_throttles[0] + self.drone.current_throttles[3]
- self.drone.current_throttles[0]
- self.drone.current_throttles[3]),
(self.drone.current_throttles[0] + self.drone.current_throttles[2]
- self.drone.current_throttles[1] - self.drone.current_throttles[1]
- self.drone.current_throttles[3]), - self.drone.current_throttles[2]),
(self.drone.current_throttles[2] + self.drone.current_throttles[3] (self.drone.current_throttles[2] + self.drone.current_throttles[3]
- self.drone.current_throttles[0] - self.drone.current_throttles[0]
- self.drone.current_throttles[1]) - self.drone.current_throttles[1]),
(self.drone.current_throttles[0] + self.drone.current_throttles[2]
- self.drone.current_throttles[1]
- self.drone.current_throttles[3])
] / 2.0; ] / 2.0;
if let Some(logger) = &mut self.logger { if let Some(logger) = &mut self.logger {
@ -201,8 +212,8 @@ impl Simulation {
rot_current: self.drone.get_rot(&self.world).scaled_axis().into(), rot_current: self.drone.get_rot(&self.world).scaled_axis().into(),
rot_target: na::UnitQuaternion::from_scaled_axis(vector![ rot_target: na::UnitQuaternion::from_scaled_axis(vector![
current_input.rotation.roll, current_input.rotation.roll,
current_input.rotation.yaw, current_input.rotation.pitch,
current_input.rotation.pitch current_input.rotation.yaw
]) ])
.scaled_axis() .scaled_axis()
.into(), .into(),