Now with steering arms at approximately correct ackerman angle.
This commit is contained in:
parent
01d92421cf
commit
d20ecb005a
3 changed files with 29 additions and 15 deletions
|
|
@ -9,12 +9,16 @@ include <BOSL2/std.scad>
|
||||||
include <suspension.scad>
|
include <suspension.scad>
|
||||||
include <tub.scad>
|
include <tub.scad>
|
||||||
|
|
||||||
|
wheelbase = 2000;
|
||||||
|
track = 1400;
|
||||||
|
|
||||||
|
ackerman = 90 + atan( wheelbase/( track / 2) );
|
||||||
|
|
||||||
tub(fl=1100);
|
tub(fl=1100);
|
||||||
|
|
||||||
translate([-900,0,130])
|
translate([-900,0,130])
|
||||||
suspension();
|
suspension(aa = ackerman);
|
||||||
|
|
||||||
translate([1100,0,130])
|
translate([1100,0,130])
|
||||||
suspension(cst=0);
|
suspension(aa = 0, cst=0);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ caster_angle = 7;
|
||||||
// TODO: should be calculated from hub width and wheel radius?
|
// TODO: should be calculated from hub width and wheel radius?
|
||||||
camber_angle = 10;
|
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,
|
cmb = camber_angle, cst = caster_angle,
|
||||||
al = 100) {
|
al = 100) {
|
||||||
kl = h * (1/cos(90 - cmb)) * (1/cos(90 - cst));
|
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);
|
camber_offset = aof/tan(90-cmb);
|
||||||
caster_offset = 0 - aof/tan(90-cst);
|
caster_offset = 0 - aof/tan(90-cst);
|
||||||
|
|
||||||
|
// axle itself
|
||||||
translate([caster_offset, al + camber_offset, 0-aof])
|
translate([caster_offset, al + camber_offset, 0-aof])
|
||||||
rotate([ 90, 0, 0])
|
rotate([ 90, 0, 0])
|
||||||
cylinder( h=al, r=r);
|
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])
|
translate([caster_offset, al, 0-aof])
|
||||||
wheel();
|
wheel();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// kingpin();
|
||||||
|
// TODO: still need steering rack and track rods.
|
||||||
|
|
||||||
module lug() {
|
module lug() {
|
||||||
difference() {
|
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,
|
track = 1400, hub_width = 135, wheel_diameter=600,
|
||||||
cmb=camber_angle, cst=caster_angle) {
|
cmb=camber_angle, cst=caster_angle) {
|
||||||
subframe(l,w,h);
|
subframe(l,w,h);
|
||||||
|
|
@ -187,11 +192,11 @@ module suspension( l = 300, w = 300, h = 300,
|
||||||
|
|
||||||
translate([caster_offset/2,
|
translate([caster_offset/2,
|
||||||
wishbone_length + (stock_section * 4), 0])
|
wishbone_length + (stock_section * 4), 0])
|
||||||
kingpin(cst=cst);
|
kingpin(aa=aa, cst=cst);
|
||||||
mirror([0,1, 0])
|
mirror([0,1, 0])
|
||||||
translate([caster_offset/2,
|
translate([caster_offset/2,
|
||||||
wishbone_length + (stock_section * 4), 0])
|
wishbone_length + (stock_section * 4), 0])
|
||||||
kingpin(cst=cst);
|
kingpin(aa=aa, cst=cst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// suspesion()
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ a_pillar_y = -400; // y location of face of 'A' pillar
|
||||||
bb_height = 274; // internal height of battery box
|
bb_height = 274; // internal height of battery box
|
||||||
bb_width = 260; // internal width of battery box
|
bb_width = 260; // internal width of battery box
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* the 'cowl' is the near-horizontal panel which the
|
* the 'cowl' is the near-horizontal panel which the
|
||||||
* bottom of the windscreen is mounted to. In practice
|
* bottom of the windscreen is mounted to. In practice
|
||||||
|
|
@ -20,8 +21,8 @@ bb_width = 260; // internal width of battery box
|
||||||
* is horizontal.
|
* is horizontal.
|
||||||
****************************************************/
|
****************************************************/
|
||||||
|
|
||||||
// slope of the cowl
|
// slope of the cowl to horizontal
|
||||||
cowl_angle = -70;
|
cowl_angle = 20;
|
||||||
// maximum height of the cowl (at the A pillar)
|
// maximum height of the cowl (at the A pillar)
|
||||||
cowl_height = 450;
|
cowl_height = 450;
|
||||||
|
|
||||||
|
|
@ -43,6 +44,10 @@ sill_max_height = bb_height;
|
||||||
sill_min_height = 125;
|
sill_min_height = 125;
|
||||||
sill_width = 150;
|
sill_width = 150;
|
||||||
|
|
||||||
|
// As nearly as I can measure it, the windscreen angle
|
||||||
|
// of the Citroen C1 is 23.8° to horizontal.
|
||||||
|
windscreen_angle = 24;
|
||||||
|
|
||||||
module battery_box_side( floor_length = 1100) {
|
module battery_box_side( floor_length = 1100) {
|
||||||
fhl = (floor_length/2);
|
fhl = (floor_length/2);
|
||||||
top_hlf = (bb_height * tan(layback_angle_f)) + fhl;
|
top_hlf = (bb_height * tan(layback_angle_f)) + fhl;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue