Read this model as text
A printable wheeled bipedal balancer with two straight legs and six bus servos: per leg a roll joint in the body, a pitch joint below it, and a wheel drive. Two-shell chassis with hip pods, a wrap-around hip yoke per leg, hourglass leg plates, and spoked hubs with click-on TPU tyres.
The image shows the solid OpenSCAD renders at part assembly · hip_actuator STS3250 · wheel_actuator STS3215 · leg_length 140 · wheel_diameter 140 · wheel_width 26 · body_length 150 · body_width 80 · body_height 72 · mass_g 1200 · leg_pitch 0 · leg_roll 0 · sensor lidar.
Wheeled bipedal balancer
mick/wheeled-biped-balancer@0.4.0
Report
For a legal or policy problem: a license violation, personal data, somebody else’s work republished as their own. A model that prints badly is a comment, not a report.
Parameters
from sourceDescription
What is this
A printable wheeled bipedal balancer with two straight legs and six bus servos: per leg a roll joint in the body, a pitch joint below it, and a wheel drive. Two-shell chassis with hip pods, a wrap-around hip yoke per leg, hourglass leg plates, and spoked hubs with click-on TPU tyres.
`part` gives the assembly or one printable part in its print orientation: body_tray, body_lid, hip_yoke, leg, wheel_hub, tire. Print two of everything except the body.
What you use it for
Building it, and checking it first. Pose the legs with leg_pitch and leg_roll; the console reports stance height, track width, the torque on each hip joint against the servo's rated torque, and a bed check.
Design notes
Every joint is built the same way: the servo case sits in a printed pocket with 0.3 mm clearance and is retained by the servo's own M2 screws, the horn seats in a 1 mm recess in the driven part so the screws are not carrying shear, and where the servo has a rear shaft it is supported in a printed boss so no joint hangs on one horn.
The hip: the tray has a pod on each side that takes the roll servo, dropped in from the top before the lid goes on, shaft pointing forward and bolted through the tray wall from inside. The hip yoke is a U that straddles the pod: a rounded front arm on the horn, a rounded rear arm on the rear shaft, and a bucket underneath that holds the pitch servo, dropped in from the top before the yoke goes on, screwed from below, shaft pointing out. The leg plate bolts to that horn. At the ankle, the leg carries a two-wall channel on its inboard face that takes the wheel servo lying along the leg, shaft through the plate, hub on the horn.
Print orientation, no supports anywhere: tray upright, lid upside down, yoke standing on the bucket floor, leg flat with the outboard face down so layer lines run in the bending plane, hub flat, tyre flat in TPU. The pod and pocket openings all face up in print orientation.
Character is kept to what the geometry already wants: a visor band with the camera window across the chassis front, the lidar in a cap on top, hips that read as hips, shoulder-shaped yoke arms, and legs that narrow at the shin.
Measure before printing structural parts: servo case dimensions and shaft offset, servo mounting-hole positions, and the horn bolt circle. All are named constants at the top of the hidden section.
Parameters
part picks what to render. hip_actuator and wheel_actuator pick the servo. leg_length, wheel_diameter and wheel_width size the leg and wheel. body_length, body_width and body_height size the chassis, mass_g feeds the torque check. leg_pitch and leg_roll pose the legs. sensor picks none, lidar, camera or both.
Use with your agent
{
"mcpServers": {
"remixcad": {
"type": "http",
"url": "https://remix-cad.vercel.app/api/mcp"
}
}
}get_model("mick/wheeled-biped-balancer@0.4.0")Returns the manifest, the source, the import closure and the license obligations. Full MCP setup.
Parameter table
Parsed from the Customizer annotations in main.scad| Name | Default | Range | Unit | Description |
|---|---|---|---|---|
| part | "assembly" | assembly, body_tray, body_lid, hip_yoke, leg, wheel_hub, tire | ||
| hip_actuator | "STS3250" | STS3215, STS3250 | ||
| wheel_actuator | "STS3215" | STS3215, STS3250 | ||
| leg_length | 140 | 80 to 260 step 1 | ||
| wheel_diameter | 140 | 60 to 240 step 5 | ||
| wheel_width | 26 | 14 to 60 step 1 | ||
| body_length | 150 | 130 to 200 step 1 | ||
| body_width | 80 | 70 to 140 step 1 | ||
| body_height | 72 | 64 to 120 step 1 | ||
| mass_g | 1200 | 400 to 3000 step 50 | ||
| leg_pitch | 0 | -60 to 60 step 1 | ||
| leg_roll | 0 | -8 to 45 step 1 | ||
| sensor | "lidar" | none, lidar, camera, both |
Lineage
0 models depend on this oneOnly what this model came from and what came from it.
License
Whoever downloads this takes these obligations along- mick/wheeled-biped-balancer@0.4.0 is MIT
Source
main.scad is the entrypointmain.scad
// Wheeled bipedal balancer, printable parts.
// Two straight legs, each: roll servo in a body pod, hip yoke on that servo,
// pitch servo in the yoke bucket, leg plate on that horn, wheel servo in an
// ankle channel, hub on its horn, TPU tyre clicked onto the hub.
/* [Part] */
// What to render: the assembly, or one printable part in print orientation.
part = "assembly"; // [assembly, body_tray, body_lid, hip_yoke, leg, wheel_hub, tire]
/* [Actuators] */
// Hip actuator, used for both the roll and the pitch joint.
hip_actuator = "STS3250"; // [STS3215, STS3250]
// Wheel drive actuator, one per wheel.
wheel_actuator = "STS3215"; // [STS3215, STS3250]
/* [Leg] */
// Pitch pivot to wheel axle.
leg_length = 140; // [80:1:260]
// Diameter measured over the tyre tread.
wheel_diameter = 140; // [60:5:240]
// Width across the tyre.
wheel_width = 26; // [14:1:60]
/* [Body] */
// Fore-aft length of the chassis.
body_length = 150; // [130:1:200]
// Width of the chassis between the hip pods.
body_width = 80; // [70:1:140]
// Height of the chassis, tray plus lid.
body_height = 72; // [64:1:120]
// All-up mass for the torque check. Changes no geometry.
mass_g = 1200; // [400:50:3000]
/* [Pose] */
// Leg swung forward from vertical, degrees. Negative is back.
leg_pitch = 0; // [-60:1:60]
// Leg swung outward from vertical, degrees.
leg_roll = 0; // [-8:1:45]
/* [Sensor] */
// What sits on the body.
sensor = "lidar"; // [none, lidar, camera, both]
/* [Hidden] */
$fn = 36;
wall = 2.4;
corner_r = 12;
corner_in = 10;
split_z = 50; // tray height; lid takes the rest
hip_z = 38; // roll axis above the tray floor
cl = 0.3; // clearance around servo cases
sp = 2.5; // pocket wall thickness
insert_d = 4.0; // M3 heat-set insert hole
m3_clear = 3.4;
m3_head = 6.4;
m2_hole = 2.2;
horn_circle = 14; // horn bolt circle, 4 holes -- measure your horn
horn_hole = 2.2;
horn_boss = 21; // horn boss diameter for the seating recess -- measure
shaft_off = 10; // shaft centre from the near end of the case -- check
shi = 6; // mounting holes inset from case ends and faces -- measure
lt = 6; // leg plate thickness
tire_t = 12;
tread_n = 28;
// Servo case [L, W, H]; shaft on the L x W face, shaft_off from one L end.
function act_size(n) = n == "STS3250" ? [45.2, 24.7, 35.0] : [44.8, 24.0, 35.5];
function act_stall(n) = n == "STS3250" ? 50 : 30;
hip_size = act_size(hip_actuator);
whl_size = act_size(wheel_actuator);
hip_stall = act_stall(hip_actuator);
whl_stall = act_stall(wheel_actuator);
hip_rated = hip_stall * 0.25;
rL = hip_size[0]; rW = hip_size[1]; rH = hip_size[2];
wL = whl_size[0]; wW = whl_size[1]; wH = whl_size[2];
wheel_r = wheel_diameter / 2;
mass_kg = mass_g / 1000;
lid_h = body_height - split_z;
lidar_x = body_length / 4;
// Hip pod on the tray side. Roll servo: L along z, W along y, H along x,
// shaft forward. Frame origin on the roll axis, right side; left mirrors.
pod_x0 = -rH - cl - 1.6;
pod_x1 = cl + 1.6;
pod_yo = rW + 2 * cl + 1.6; // pod protrusion beyond the tray wall
roll_y = body_width / 2 + cl + rW / 2;
// Yoke arms straddle the pod.
arm_f0 = pod_x1 + cl; arm_f1 = arm_f0 + 3;
arm_r1 = pod_x0 - cl; arm_r0 = arm_r1 - 3;
// Bucket under the roll servo holds the pitch servo, shaft outboard.
bk_x1 = arm_f1;
pitch_x = bk_x1 - sp - cl - shaft_off;
bk_x0 = pitch_x - (rL - shaft_off) - cl - sp;
pitch_in_y = -rW / 2 + 4;
pitch_face_y = pitch_in_y + rH;
bk_y0 = pitch_in_y - cl - sp;
bk_y1 = pitch_face_y + cl + sp;
bk_z1 = -(rL - shaft_off) - 4;
pitch_z = bk_z1 - cl - rW / 2;
bk_z0 = pitch_z - rW / 2 - cl - sp;
leg_y_in = bk_y1 + 0.5;
hub_y = leg_y_in + lt + 3.3;
wheel_yl = hub_y + wheel_width / 2;
// Wheel centre, right leg, world coordinates.
zz = pitch_z - leg_length * cos(leg_pitch);
wy_r = wheel_yl * cos(leg_roll) - zz * sin(leg_roll);
wz_r = wheel_yl * sin(leg_roll) + zz * cos(leg_roll);
wc_y = roll_y + wy_r;
wc_z = hip_z + wz_r;
ground_z = wc_z - wheel_r * cos(leg_roll);
stance_h = -ground_z;
track_w = 2 * wc_y + wheel_width * cos(leg_roll);
sensor_h = (sensor == "lidar" || sensor == "both") ? 36 : 0;
total_h = stance_h + body_height + sensor_h;
pitch_need = abs(mass_kg / 2 * leg_length * sin(leg_pitch) / 10);
roll_need = abs(mass_kg / 2 * wy_r / 10);
roll_stand = mass_kg / 2 * wheel_yl / 10;
arm_lim = hip_rated / (mass_kg / 2);
pitch_max = arm_lim >= leg_length / 10 ? 90 : asin(arm_lim / (leg_length / 10));
rim_force = whl_stall / (wheel_r / 10);
leg_print = leg_length + 38;
body_print = body_width + 2 * pod_yo;
echo(str("stance ", round(stance_h), " mm, overall ", round(total_h), " mm, track ", round(track_w), " mm"));
echo(str("pitch joint ", round(pitch_need*10)/10, " kg.cm now, holds up to ", round(pitch_max), " deg on ", hip_rated, " kg.cm rated"));
echo(str("roll joint ", round(roll_need*10)/10, " kg.cm now, ", round(roll_stand*10)/10, " kg.cm just standing"));
echo(str("wheel rim force at stall ", round(rim_force*10)/10, " kg against ", mass_kg, " kg"));
echo(str("bed check 180 mm: body ", body_length, " x ", round(body_print), ", wheel ", wheel_diameter, ", leg ", leg_print, leg_print > 180 ? " -- lay the leg diagonally" : ""));
echo("print: tray upright, lid upside down, yoke on bucket floor, leg outboard face down, hub flat, tyre flat in TPU; no supports");
echo("fasteners: 4x M3 insert + 4x M3x10 for the lid; servo M2 screws everywhere else; tyre snaps on");
// ---------- 2D outlines ----------
module main_2d(o = 0) {
offset(r = corner_r + o) square([body_length - 2 * corner_r, body_width - 2 * corner_r], center = true);
}
module body_2d(o = 0) {
offset(r = o) offset(r = 3) offset(delta = -3) union() {
main_2d();
for (side = [-1, 1])
translate([(pod_x0 + pod_x1) / 2, side * (body_width / 2 + pod_yo / 2 - 1)])
square([pod_x1 - pod_x0, pod_yo + 2], center = true);
}
}
// ---------- primitives ----------
// Servo with shaft along +z, shaft centre at the origin, case below z=0.
module servo(sz) {
color("Goldenrod") {
translate([-shaft_off, -sz[1] / 2, -sz[2]]) cube([sz[0], sz[1], sz[2]]);
cylinder(h = 4, d = 6);
}
}
module horn_holes(h) {
for (a = [0 : 90 : 270]) rotate([0, 0, a])
translate([horn_circle / 2, 0, 0]) cylinder(h = h, d = horn_hole, center = true);
}
// ---------- body tray ----------
module battery_rib() {
difference() {
translate([-23, -1.5, 0]) cube([46, 3, wall + 14]);
for (i = [-1, 1]) translate([i * 10.5, 0, wall + 11])
rotate([90, 0, 0]) cylinder(h = 5, d = 19, center = true);
}
}
pi_x = body_length / 2 - wall - 4 - 32.5;
bat_x = -body_length / 2 + wall + 4 + 20.5;
drv_x = ((pi_x - 32.5) + (bat_x + 20.5)) / 2;
module body_tray() {
difference() {
union() {
linear_extrude(split_z) body_2d();
for (sx = [-1, 1], sy = [-1, 1])
translate([sx * (body_length / 2 - corner_in), sy * (body_width / 2 - corner_in), 0]) cylinder(h = split_z, d = 9);
for (sx = [-1, 1], sy = [-1, 1])
translate([pi_x + sx * 29, sy * 11.5, 0]) cylinder(h = wall + 5, d = 5.5);
for (sx = [-1, 1]) translate([drv_x + sx * 20, 0, 0]) cylinder(h = wall + 5, d = 5.5);
for (sy = [-1, 1]) translate([bat_x, sy * 30, 0]) battery_rib();
}
translate([0, 0, wall]) linear_extrude(split_z) main_2d(-wall);
// roll servo pockets in the pods, open at the top
for (side = [-1, 1]) {
translate([-rH - cl, side > 0 ? body_width / 2 : -(body_width / 2 + rW + 2 * cl), hip_z - (rL - shaft_off) - cl])
cube([rH + 2 * cl, rW + 2 * cl, 60]);
translate([-1, side * roll_y, hip_z]) rotate([0, 90, 0]) cylinder(h = pod_x1 + 2, d = horn_boss + 1);
translate([pod_x0 - 1, side * roll_y, hip_z]) rotate([0, 90, 0]) cylinder(h = 4, d = 7);
for (hx = [-(rH - shi), -shi], hz = [shaft_off - shi, -(rL - shaft_off - shi)])
translate([hx, side * body_width / 2, hip_z + hz]) rotate([90, 0, 0]) cylinder(h = wall * 3, d = m2_hole, center = true);
}
for (sx = [-1, 1], sy = [-1, 1])
translate([sx * (body_length / 2 - corner_in), sy * (body_width / 2 - corner_in), split_z - 8]) cylinder(h = 9, d = insert_d);
for (sx = [-1, 1], sy = [-1, 1]) translate([pi_x + sx * 29, sy * 11.5, wall]) cylinder(h = 6, d = m2_hole);
for (sx = [-1, 1]) translate([drv_x + sx * 20, 0, wall]) cylinder(h = 6, d = m2_hole);
// vents clear of the pods
for (side = [-1, 1], i = [0 : 3]) {
translate([body_length / 2 - 16 - i * 9, side * body_width / 2, split_z / 2 + 4]) rotate([0, 20, 0]) cube([3, wall * 3, 18], center = true);
if (-body_length / 2 + 16 + i * 9 < pod_x0 - 5)
translate([-body_length / 2 + 16 + i * 9, side * body_width / 2, split_z / 2 + 4]) rotate([0, -20, 0]) cube([3, wall * 3, 18], center = true);
}
translate([-body_length / 2, 0, split_z - 12]) cube([wall * 3, 14, 9], center = true);
}
}
// ---------- body lid ----------
ang = atan(6 / lid_h);
module front_cut(w, h, d) {
translate([body_length / 2 - 6 * 0.5, 0, lid_h * 0.5]) rotate([0, -ang, 0]) cube([d * 2, w, h], center = true);
}
module body_lid() {
difference() {
union() {
hull() {
linear_extrude(0.01) body_2d();
translate([0, 0, lid_h - 0.01]) linear_extrude(0.01) body_2d(-6);
}
translate([0, 0, -4]) linear_extrude(4.01) main_2d(-wall - 0.3);
for (sx = [-1, 1], sy = [-1, 1])
translate([sx * (body_length / 2 - corner_in), sy * (body_width / 2 - corner_in), -4]) cylinder(h = lid_h + 4, d = 9);
if (sensor == "lidar" || sensor == "both") translate([lidar_x, 0, lid_h - 0.01]) cylinder(h = 3, d = 44);
for (sx = [-1, 1]) translate([sx * 9, 0, wall]) cylinder(h = lid_h - 2 * wall - 4, d = 5);
}
translate([0, 0, -5]) linear_extrude(5.01) main_2d(-2 * wall - 0.3);
hull() {
linear_extrude(0.01) body_2d(-wall);
translate([0, 0, lid_h - wall - 0.01]) linear_extrude(0.01) body_2d(-6 - wall);
}
for (sx = [-1, 1], sy = [-1, 1]) {
translate([sx * (body_length / 2 - corner_in), sy * (body_width / 2 - corner_in), -5]) cylinder(h = lid_h + 10, d = m3_clear);
translate([sx * (body_length / 2 - corner_in), sy * (body_width / 2 - corner_in), lid_h - 3.5]) cylinder(h = 6, d = m3_head);
}
if (sensor == "lidar" || sensor == "both")
translate([lidar_x, 0, lid_h - 10]) {
cylinder(h = 20, d = 12);
for (a = [45 : 90 : 315]) rotate([0, 0, a]) translate([15, 0, 0]) cylinder(h = 20, d = 2.7);
}
front_cut(body_width - 24, 12, 1);
if (sensor == "camera" || sensor == "both") front_cut(26, 10, 6);
for (sx = [-1, 1]) translate([sx * 9, 0, wall]) cylinder(h = 5, d = m2_hole);
}
}
// ---------- hip yoke (right leg frame) ----------
module hip_yoke() {
difference() {
union() {
translate([bk_x0, bk_y0, bk_z0]) cube([bk_x1 - bk_x0, bk_y1 - bk_y0, bk_z1 - bk_z0]);
for (x0 = [arm_f0, arm_r0])
translate([x0, 0, 0]) rotate([90, 0, 90]) linear_extrude(3) hull() {
circle(r = 17);
translate([bk_y0, bk_z1 - 2]) square([bk_y1 - bk_y0, 2]);
}
}
// pitch servo pocket, open top
translate([pitch_x - (rL - shaft_off) - cl, pitch_in_y - cl, pitch_z - rW / 2 - cl])
cube([rL + 2 * cl, rH + 2 * cl, rW + 2 * cl + 5]);
translate([pitch_x, bk_y1 - sp - 1, pitch_z]) rotate([-90, 0, 0]) cylinder(h = sp + 2, d = horn_boss + 1);
for (hx = [pitch_x + shaft_off - shi, pitch_x - (rL - shaft_off - shi)], hy = [pitch_face_y - shi, pitch_face_y - rH + shi])
translate([hx, hy, bk_z0 - 1]) cylinder(h = sp + 2, d = m2_hole);
// front arm: horn recess, centre and horn holes
translate([arm_f0 - 1, 0, 0]) rotate([0, 90, 0]) { cylinder(h = 2, d = horn_boss); cylinder(h = 10, d = 3.4); }
translate([arm_f0 + 1.5, 0, 0]) rotate([0, 90, 0]) horn_holes(10);
// rear arm on the rear shaft
translate([arm_r0 - 1, 0, 0]) rotate([0, 90, 0]) cylinder(h = 5, d = 6.4);
}
}
// ---------- leg (pitch axis at origin, plate y in [0, lt], leg down -z) ----------
module leg_2d() {
union() {
hull() { circle(d = 38); translate([0, -0.42 * leg_length]) circle(d = 20); }
hull() { translate([0, -0.42 * leg_length]) circle(d = 20); translate([0, -leg_length]) circle(d = 36); }
}
}
module slot_2d(z0, z1) {
if (z0 - z1 > 22) hull() { translate([0, z0 - 6]) circle(d = 7); translate([0, z1 + 6]) circle(d = 7); }
}
module leg() {
ax = -leg_length;
difference() {
union() {
translate([0, lt, 0]) rotate([90, 0, 0]) linear_extrude(lt) difference() {
leg_2d();
slot_2d(-26, -0.42 * leg_length + 10);
slot_2d(-0.42 * leg_length - 10, ax + 26);
}
// ankle channel for the wheel servo, open inboard and at the top
for (sx = [-1, 1])
translate([sx * (wW / 2 + cl + sp / 2) - sp / 2, -wH - cl, ax - shaft_off - cl - sp])
cube([sp, wH + cl, wL + 2 * cl + sp]);
translate([-(wW / 2 + cl + sp), -wH - cl, ax - shaft_off - cl - sp])
cube([wW + 2 * cl + 2 * sp, wH + cl, sp]);
}
// pitch horn: recess on the inboard face, centre and horn holes
translate([0, -1, 0]) rotate([-90, 0, 0]) { cylinder(h = 2, d = horn_boss); cylinder(h = 10, d = 3.4); }
translate([0, lt / 2, 0]) rotate([-90, 0, 0]) horn_holes(lt + 2);
// wheel shaft through the plate and channel screws
translate([0, -1, ax]) rotate([-90, 0, 0]) cylinder(h = lt + 2, d = 8);
for (hz = [ax - shaft_off + shi, ax + wL - shaft_off - shi], hy = [-shi, -wH + shi])
translate([0, hy, hz]) rotate([0, 90, 0]) cylinder(h = wW + 4 * sp, d = m2_hole, center = true);
}
}
// ---------- wheel hub and tyre (axis z, hub face at z=0) ----------
rim_d = wheel_diameter - 2 * tire_t;
module wheel_hub() {
web_t = 6;
difference() {
union() {
difference() {
cylinder(h = wheel_width, d = rim_d);
translate([0, 0, -1]) cylinder(h = wheel_width + 2, d = rim_d - 6);
}
cylinder(h = web_t, d = rim_d - 5);
}
for (a = [0 : 72 : 359]) rotate([0, 0, a + 36]) translate([0, 0, -1]) hull() {
translate([0, 22, 0]) cylinder(h = web_t + 2, d = 10);
translate([0, rim_d / 2 - 14, 0]) cylinder(h = web_t + 2, d = 20);
}
translate([0, 0, wheel_width / 2]) rotate_extrude() translate([rim_d / 2, 0]) circle(d = 3);
translate([0, 0, -1]) { cylinder(h = 2, d = horn_boss); cylinder(h = web_t + 2, d = 3.4); }
translate([0, 0, web_t / 2]) horn_holes(web_t + 2);
}
}
module tire() {
color("DimGray") difference() {
rotate_extrude() hull() {
translate([rim_d / 2 + 0.2, 0]) square([0.01, wheel_width]);
translate([wheel_diameter / 2 - 4, 4]) circle(r = 4);
translate([wheel_diameter / 2 - 4, wheel_width - 4]) circle(r = 4);
}
for (i = [0 : tread_n - 1]) rotate([0, 0, i * 360 / tread_n])
translate([wheel_diameter / 2, 0, wheel_width / 2]) rotate([15, 0, 0]) cube([4, 2.2, wheel_width * 2], center = true);
}
color("DimGray") translate([0, 0, wheel_width / 2]) rotate_extrude() translate([rim_d / 2 + 0.2, 0]) circle(d = 2.6);
}
// ---------- assembly ----------
module right_leg_assembly() {
rotate([0, 90, 0]) servo(hip_size);
rotate([leg_roll, 0, 0]) {
color("Silver") hip_yoke();
translate([pitch_x, pitch_face_y, pitch_z]) mirror([1, 0, 0]) rotate([-90, 0, 0]) servo(hip_size);
translate([pitch_x, 0, pitch_z]) rotate([0, -leg_pitch, 0]) {
translate([0, leg_y_in, 0]) {
color("Silver") leg();
translate([0, 0, -leg_length]) rotate([-90, 0, 0]) rotate([0, 0, -90]) servo(whl_size);
}
translate([0, hub_y, -leg_length]) rotate([-90, 0, 0]) { color("WhiteSmoke") wheel_hub(); tire(); }
}
}
}
module assembly() {
color("WhiteSmoke") body_tray();
color("WhiteSmoke") translate([0, 0, split_z]) body_lid();
color("DimGray") translate([0, 0, split_z]) front_cut(body_width - 26, 11, 0.3);
if (sensor == "lidar" || sensor == "both") color("DimGray") translate([lidar_x, 0, body_height + 3]) cylinder(h = 33, d = 38);
translate([0, roll_y, hip_z]) right_leg_assembly();
mirror([0, 1, 0]) translate([0, roll_y, hip_z]) right_leg_assembly();
color("Gainsboro") translate([0, 0, ground_z - 3]) cube([500, track_w + 160, 6], center = true);
}
if (part == "assembly") assembly();
else if (part == "body_tray") body_tray();
else if (part == "body_lid") translate([0, 0, lid_h]) mirror([0, 0, 1]) body_lid();
else if (part == "hip_yoke") translate([0, 0, -bk_z0]) hip_yoke();
else if (part == "leg") translate([0, 0, lt]) rotate([-90, 0, 0]) leg();
else if (part == "wheel_hub") wheel_hub();
else if (part == "tire") tire();
Comments
Context, not a score. Comments never move a model up or down the results.No comments yet
Printed it? A note about your material and the clearance you landed on saves the next person a failed print.
