Now with steering arms at approximately correct ackerman angle.

This commit is contained in:
Simon Brooke 2026-09-14 16:46:59 +01:00
parent 01d92421cf
commit d20ecb005a
3 changed files with 29 additions and 15 deletions

View file

@ -9,12 +9,16 @@ include <BOSL2/std.scad>
include <suspension.scad>
include <tub.scad>
wheelbase = 2000;
track = 1400;
ackerman = 90 + atan( wheelbase/( track / 2) );
tub(fl=1100);
translate([-900,0,130])
suspension();
suspension(aa = ackerman);
translate([1100,0,130])
suspension(cst=0);
suspension(aa = 0, cst=0);

View file

@ -30,7 +30,7 @@ caster_angle = 7;
// TODO: should be calculated from hub width and wheel radius?
camber_angle = 10;
module kingpin( h = 300, r = 12.5,
module kingpin( aa=0, h = 300, r = 12.5,
cmb = camber_angle, cst = caster_angle,
al = 100) {
kl = h * (1/cos(90 - cmb)) * (1/cos(90 - cst));
@ -44,17 +44,22 @@ module kingpin( h = 300, r = 12.5,
camber_offset = aof/tan(90-cmb);
caster_offset = 0 - aof/tan(90-cst);
// axle itself
translate([caster_offset, al + camber_offset, 0-aof])
rotate([ 90, 0, 0])
cylinder( h=al, r=r);
rotate([ 90, 0, 0])
cylinder( h=al, r=r);
// steering arm
translate([caster_offset, camber_offset, 0-aof])
rotate([ aa, -90, 0])
cylinder( h=al, d=r);
translate([caster_offset, al, 0-aof])
wheel();
wheel();
}
// kingpin();
// TODO: still need steering rack and track rods.
module lug() {
difference() {
@ -145,7 +150,7 @@ module wishbone(l, w, skew = 0, is_upper = true) {
}
}
module suspension( l = 300, w = 300, h = 300,
module suspension( aa = 7, l = 300, w = 300, h = 300,
track = 1400, hub_width = 135, wheel_diameter=600,
cmb=camber_angle, cst=caster_angle) {
subframe(l,w,h);
@ -187,11 +192,11 @@ module suspension( l = 300, w = 300, h = 300,
translate([caster_offset/2,
wishbone_length + (stock_section * 4), 0])
kingpin(cst=cst);
kingpin(aa=aa, cst=cst);
mirror([0,1, 0])
translate([caster_offset/2,
wishbone_length + (stock_section * 4), 0])
kingpin(cst=cst);
kingpin(aa=aa, cst=cst);
}
// suspesion()

View file

@ -12,6 +12,7 @@ a_pillar_y = -400; // y location of face of 'A' pillar
bb_height = 274; // internal height of battery box
bb_width = 260; // internal width of battery box
/*****************************************************
* the 'cowl' is the near-horizontal panel which the
* bottom of the windscreen is mounted to. In practice
@ -20,8 +21,8 @@ bb_width = 260; // internal width of battery box
* is horizontal.
****************************************************/
// slope of the cowl
cowl_angle = -70;
// slope of the cowl to horizontal
cowl_angle = 20;
// maximum height of the cowl (at the A pillar)
cowl_height = 450;
@ -43,6 +44,10 @@ sill_max_height = bb_height;
sill_min_height = 125;
sill_width = 150;
// As nearly as I can measure it, the windscreen angle
// of the Citroen C1 is 23.8&deg; to horizontal.
windscreen_angle = 24;
module battery_box_side( floor_length = 1100) {
fhl = (floor_length/2);
top_hlf = (bb_height * tan(layback_angle_f)) + fhl;