From 78f5db1a9e19bda93cca0d06468e271c05c602f1 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 12 Aug 2026 20:16:48 -0400 Subject: [PATCH] Add propeller spin direction --- src/constants.zig | 5 +++++ src/drone.zig | 2 ++ src/forces.zig | 3 ++- src/integration.zig | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/constants.zig b/src/constants.zig index e574c41..043b397 100644 --- a/src/constants.zig +++ b/src/constants.zig @@ -1 +1,6 @@ pub const g: f64 = 9.80665; + +pub const PropSpinDirection = enum(i8) { + cw = 1, + ccw = -1, +}; diff --git a/src/drone.zig b/src/drone.zig index 10e8002..039cb79 100644 --- a/src/drone.zig +++ b/src/drone.zig @@ -1,5 +1,6 @@ const vec3 = @import("./vec3.zig"); const std = @import("std"); +const constants = @import("./constants.zig"); pub const Drone = struct { mass_kg: f64, @@ -19,6 +20,7 @@ pub const Propeller = struct { angular_velocity: f64, thrust_coefficient: f64, moment_coefficient: f64, + direction: constants.PropSpinDirection, }; pub const QuadCopterSim = struct { diff --git a/src/forces.zig b/src/forces.zig index 247d020..86171ea 100644 --- a/src/forces.zig +++ b/src/forces.zig @@ -23,7 +23,7 @@ pub fn propThrust(attitude: vec3.QuatF64, p: drone.Propeller) struct { vec3.Vec3 const drag_moment = vec3.Vec3F64.init( 0, 0, - p.moment_coefficient * p.angular_velocity * p.angular_velocity, + @intFromEnum(p.direction) * p.moment_coefficient * p.angular_velocity * p.angular_velocity, ); return .{ force, vec3.vec3Add(force_moment, drag_moment) }; @@ -55,6 +55,7 @@ test "thrust is correct" { .angular_velocity = 100, .thrust_coefficient = 1, .moment_coefficient = 2, + .direction = constants.PropSpinDirection.cw, }; const expected_thrust_mag = -100 * 100; diff --git a/src/integration.zig b/src/integration.zig index 7bd4804..7e5cf65 100644 --- a/src/integration.zig +++ b/src/integration.zig @@ -1,6 +1,7 @@ const drone = @import("./drone.zig"); const vec3 = @import("./vec3.zig"); const forces = @import("./forces.zig"); +const constants = @import("constants.zig"); const std = @import("std"); pub fn timestep(dt: f64, d: drone.Drone, props: []const drone.Propeller, s: *drone.State) void { @@ -62,6 +63,7 @@ test "Validate timesteps" { .cg_to_prop = .init(1, 0, 0), .moment_coefficient = 0.1, .thrust_coefficient = 0.5, + .direction = constants.PropSpinDirection.cw, }; const props: [1]drone.Propeller = .{prop};