# Door robot arm: design Designer, 2026-10-16. A standalone project (the user: *"this will be standalone project dont add on the ship yet"*). The ship file is not touched; the doors, rails and pocket come from `source/ship_context_2026-10-16.blend` as reference only. Every number the builder needs is in `design.json` (made by `build/design_make_json.py`; do not edit the JSON by hand, edit the scripts and run them again). Metres, Z up, the ship's world coordinates. What the user asked: model the white rail robot of the seven pictures, *"rig it accordingly and mechanically"*, fit it to the moon pool doors' open/close animation, *"also consider the rail"*, make two versions (with the grab limbs, and the red-sketch plate without them) *"side by side so I can change when I want"*, and *"dont miss details"*. ## 1. Reading the pictures: the mechanism Measured on ref1 (a near-orthographic side view) with a 50 px grid (`reference/crops/r1_grid_*.png`). Arm frame **A** at rest (rest = the ref1 pose, all joint angles 0): origin at the turntable face centre, +X forward (toward the tool), +Y the arm's left (ref1 shows the left side), +Z up. Image to A: X = 1000 - x_img, Z = 1550 - y_img (2000 px original). | joint | what the pictures show | axis | where (ref1 px, A) | metres (A) | |---|---|---|---|---| | J1 turret yaw | the turntable between carriage and turret | +Z | x_img 1000 | origin | | J2 shoulder pitch | the perforated drum, with an orange-ring motor cap on each turret ear, coaxial with it | lateral | (1155, 1315): 155 px BEHIND the J1 axis, 235 px up | (-0.341, 0, 0.517) | | J3 elbow pitch | the black elbow cap with the straight slot ("minus" screw head), on both sides | lateral | (1550, 720) | (-1.210, 0, 1.826) | | J4 forearm roll | the ringed roll section between the upper arm's front block and the forearm (a thin black bearing ring) | along the forearm | x_img 1025-1045 | axis at Z 2.0614 | | J5 wrist pitch | the wrist's round cap with concentric rings, on both sides of the wrist block's front fork | lateral | (565, 613) = wrist centre WC | (0.957, 0, 2.061) | | J6 flange roll | the knurled neck ring in front of the wrist; the gripper hub (or the plate neck) turns on it | tool axis | WC + 60 px = flange face | WC + 0.132 | J4, J5 and J6 meet at the wrist centre: a spherical wrist, so the inverse kinematics splits into position (J1-J3) and orientation (J4-J6) and has a closed form. Three pitch joints (J2, J3, J5), two rolls (J4, J6), one yaw (J1). Round caps that are **not** joints: - the big **slotted cap at the knee** of the lower arm (1393, 1165), with radial slots, orange ring and bolt, on both sides: the bearing caps of the **J3 cylinder's trunnion pin** (see below); - the **big orange-ring cap** on the upper arm (1262, 565), both sides: a gearbox cover (J4 drive), not an axis; - the **black dial with the cross** on the forearm's dark side plate (910, 590), both sides: the J5/J6 drive cover; - the **knurled knob** at the end of the truss (1762, 888): the pin of the cylinder's rod eye; - the orange-ring caps on the turret ears: the J2 motors (coaxial with J2). **The truss and its rod are the elbow's actuator, a hydraulic cylinder.** The "ANN" truss with triangular cut-outs is a lever fixed to the upper arm behind the elbow (two plates in the arm's middle plane). The black rod runs from the truss knob down into a channel on the lower arm's back. Its line points at the knee cap's centre within 4 degrees in ref1 (knob to cap -369,+277 px; the rod -242,+162 px), and it narrows at a collar part way along (ref1, ref3, ref5): a barrel with a gland and a piston rod. If it were a fixed-length parallel link, its lower end would sit on a crank at the shoulder and show below the lower arm, which no view shows. So: a double-acting cylinder on a middle trunnion at the knee (the slotted caps cover the trunnion pin), rod eye on the knob pin. Its length follows J3 (0.716-1.245 m over the whole animation); it is driven, not a separate joint. (The brief asked for "parallel links that really stay parallel"; the pictures show an actuator, not a parallelogram. What that requirement protects is kept: the rod's eye stays on the knob pin at every frame, proven to 0.002 mm.) **ref7 is a back view**, not a front view: no belt drive, cable bundle or forearm is in front of the turret, the turret's back shows screws and a latch, and the cylinder's barrel rises in the middle of the lower arm's back above a channel with cross rungs (the "ribbed centre strip"). Its turret is turned 90 degrees to the rail (the rail runs across the picture). The belt drive and the 7-cable bundle are on the turret's FRONT (under the forearm in ref1). **The gripper (version A)**: four fingers at 90 degrees round the hub (top, bottom, left, right). ref1 shows top, bottom and the near side finger, with the far side finger peeking under it; ref2 and ref6 show the near finger foreshortened toward the camera. Each finger: a bracket on the hub's front rim, a knuckle pin (round caps), a knurled drive motor fixed to the bracket pointing back and outward 20 degrees (r1: from the knuckle at WC+(107, 79) px to (47, 99) px), a proximal link with a ribbed rubber boot and a threaded tendon rod, a distal pin, and a distal link ending in a hook turned inward. Two finger joints, driven together by one grip control. **Lateral sizes**: from ref7 (scale to ref1 about 1:2 at the turret's depth) and ref2/3/6. The lower arm's root is narrower (Y +-150) between the turret ears and widens to +-205 beyond 0.38 m from J2; the upper arm sits between the lower arm's two yoke cheeks. ## 2. Scale One scale for the whole arm: **0.0022 m per ref1 pixel**. It was chosen by search (`build/design_search*.py`, `design_variants2.py`): smaller arms open the elbow past the truss's limit and need a longer cylinder stroke; larger arms fold the elbow tighter and fill the pocket. Main sizes at this scale: | | ref1 px | metres | |---|---|---| | carriage (along rail x across x height) | 390 x 390 x 185 | 0.858 x 0.858 x 0.407 | | turntable | dia 260 | 0.57 | | J2 behind / below the turntable face | 155 / 235 | 0.341 / 0.517 | | lower arm J2-J3 (dog-leg through the knee) | 714 | 1.571 | | forearm axis length J3-WC (along / offset) | 985 / 107 | 2.167 / 0.235 | | wrist centre to flange face | 60 | 0.132 | | gripper hub dia x length | 125 x 75 | 0.275 x 0.165 | | upright height of the whole arm (carriage foot to the upper arm top) | 1265 | 2.78 | | reach J2 to wrist centre, max | 1705 | 3.75 | ## 3. Version B (ref6's red sketch) The red X strikes out the hub and the four fingers. In their place the user drew two lines spreading from the wrist to a large quadrilateral: a **flared neck** and a **flat square plate** perpendicular to the tool axis. The quadrilateral is near-square on the page while the forearm behind it is strongly foreshortened: ref6 looks almost along the tool axis, so the plate's face is toward the camera and the neck shows short. Reading: the wrist (J5 cap) and the J6 flange stay; a trumpet-shaped neck (dia 0.154 at the flange to 0.29 at the plate) carries a square plate 0.55 x 0.55 x 0.044 m (2.0 x the hub's diameter, as drawn). **How the plate sits on the curved door.** The door's inner face is a cylinder-like curve of radius about 8.6 m. Over the plate's 0.55 m the face falls away by only 4.4 mm (sagitta), so the plate stays flat (as drawn) and bolts to a **conformal pad** 0.60 x 0.60 m on the door: its underside follows the face (ray-cast), its top is flat, 0.018-0.023 m thick. The pad is a door fixture, not part of the arm. Eight bolts through the plate into the pad. **Why the neck is 0.434 m long.** With that length the plate's door face lands exactly where version A's knob is held: both versions share **one wrist centre and one arm pose**. Switching versions then only swaps the tool and the door fixture; the arm does not move, the rig has one set of drivers, and one proof covers both. The neck is straight for 60% of its length and flares over the last 40%, which reads like the sketch from the sketch's own viewpoint. ## 4. Fit to the scene ### The arm hangs The pocket's rail is a plain box (0.458 x 0.335 m) whose top 0.08 m is buried in the deck; 0.255 m of it shows. Nothing can pass over it, so the reference carriage is turned over: the arm hangs **upside down** from a carriage that wraps the rail's visible part from below. Rig root `DoorArm_AFT` at (0, -5.795, -4.182), rotated 180 degrees about X; the carriage's turntable face is its underside at z -4.182, its cheek tops 20 mm under the deck (z -3.775). ### The rail problem The door slides 6.14 m; the rail gives 6.49 m between the end wall and its inner end. A carriage of the reference's proportions is 0.858 m long, and the hanging arm is about 1 m wide across its joints, so it must also stand off the end wall. Solution: - **travel**: the carriage runs 5.10 m, from x -8.116 (end-wall side) to -3.014 (rail's inner end) on the AFT rail; FORE mirrored in x = 3.05 (9.114 to 14.216); - **schedule**: it runs at 0.831 of the door's speed, `c = -3.198458 + 0.830925 * door_x` (AFT), so it reaches each end exactly when the door does; the arm's joints take up the remaining 1.04 m smoothly over the slide (no jolt when the carriage stops); during frames 1-12 and 108-120 the door moves 1.22 m inboard/out while the carriage stands at its inner end: the arm takes all of that; - **running gear** (rollers on which faces): the user's rail has no face that looks up, so the asset ADDS two **running flanges** (steel bars 0.05 x 0.03 m) along both side faces at the rail's bottom. Four **load wheels** (dia 0.10) roll on the flanges' tops (they carry the weight), four **counter-rollers** (dia 0.06) under the flanges hold the arm's tipping moment, four **side guide rollers** on vertical axles run on the flanges' outer edges. A **rack** (module 12) under the rail's bottom face and a pinion on the carriage's drive motor move it; - **end stops**: steel blocks with rubber buffers under the rail at both travel ends; the carriage stops 10 mm short of them in normal running (they are safety stops); - **energy chain**: the moving carriage needs power. A 44-link chain (3.30 m, bend radius 0.15) lies on its side in a tray hung under the deck inboard of the rail (y -5.28..-4.88), fixed at mid-travel, its moving end on a bracket on the carriage's inboard cheek. The tray's well-side end is cut on a slant to stay clear of the moon pool well's rounded edge. The links are rigid objects driven from the carriage position (they never stretch: proven, see 7). The user's rail object is not changed: everything above is an added part of this asset (`DoorArm_ | rail kit`). ### Where the arm holds the door On the door's inner face, **0.90 m in from its pocket-side end and 1.10 m lower than its top edge**: door-local (-2.10, -2.2178, 1.7179) on the AFT door, (+2.10, -2.2178, 1.7179) on the FORE door; the face normal there is (0, 0.9089, 0.4171). The tool's axis is the face's normal (into the door). Why there: - the carriage cannot follow the door past the rail's inner end (x -2.545) while the closed door lies over the moon pool well (x -2.78..3.05), so the hold must be near the door's pocket end; - high on the face the normal points mostly inboard, so the wrist centre (0.63 m off the face) stays 0.74 m or more off the J1 axis: no shoulder singularity, the turret turns only 50 degrees in the whole animation; - higher holds fold the elbow tighter and bring the forearm into the turret's front cable bundle at the open door; lower holds bring the wrist centre nearer the J1 axis, so the turret turns more (65-85 degrees) and the wrist margin shrinks; - the 0.60 m pad and the knob's 0.32 m base both fit on the face with room to the edges. ### Joint ranges over the whole animation (both doors, both versions; FORE mirrors J1, J4, J6) | joint | AFT (deg) | FORE (deg) | limit set (deg) | |---|---|---|---| | J1 | 32.7 .. 82.4 | 97.6 .. 147.3 | -170 .. 170 | | J2 | -52.9 .. 9.8 | same | -95 .. 45 | | J3 | -24.4 .. 29.1 | same | -40 .. 55 | | J4 | -52.5 .. -10.8 | 10.8 .. 52.5 | -170 .. 170 | | J5 | -74.4 .. -40.0 | same | -120 .. 120 (never within 40 of 0) | | J6 | 11.5 .. 52.3 | -52.3 .. -11.5 | -170 .. 170 | Elbow inner angle 38-92 degrees (the reference pose has 63); reach 36-73% of the arm's full reach; the fastest joint moves 4.1 degrees per frame (J3). The J3 cylinder turns only -5.2..+1.3 degrees inside its channel. The wrist always bends to the forearm's +Z side (q5 < 0). On that side only the two cheek lobes (R 0.121 m round the wrist centre) reach forward; the wrist block's body ends 0.198 m behind the wrist centre (the proof's proxy; the finger motors pass it with 29-34 mm), and the small top cylinder F15 sits 0.29 m away. The hub's or the neck's back face, 0.132 m out on the flange, clears the lobes by 9-11 mm at any bend. ## 5. Rig and inverse kinematics ### Decision: object hierarchy, armature only for the export Each moving part is its own object with its origin on its axis, rotation 0 and scale 1 at rest (rest = the ref1 pose). Drivers sit on the objects' channels. This is what the user's Blender runs without Python (simple expressions), what the project's other rigs do, and it keeps every part inspectable. For Unreal the export stage builds a deform armature from the same hierarchy (one bone per object, rigid weights, the elbow cables blended) and bakes the 120 frames into an animation (see 9). Hierarchy per arm: rig root (static) > carriage (location.x) > turret (rot z = q1) > lower arm (rot y = -q2) > { J3 cylinder (rot y = -cyl) > J3 piston (location x, z) ; upper arm (rot y = -q3) > forearm (rot x = q4) > wrist head (rot y = q5) > flange (rot x = q6) > { tool A hub > 4 x (finger proximal > finger distal) ; tool B } }. The door fixtures are world objects whose location follows the door (the door never turns). Objects, origins and channels: `design.json` "objects", "kinematics.joints". ### Closed-form inverse kinematics Frame C = the hanging arm's base frame (world turned 180 degrees about x, origin at the turntable face centre). Door location d (from the door object), carriage c = A + B d_x. Wrist centre in C: X = (1 - B) d_x + (w_x - A), Y = (y_b - w_y) - d_y, H = (z_b - w_z) - d_z with w = the wrist centre's door-local offset (attach point + 0.63 m along the normal), y_b = -5.795, z_b = -4.182. q1 = atan2(Y, X) (the arm turns to face the wrist centre) R = sqrt(X^2 + Y^2) + j2r, Hh = H - j2h (j2r = 0.341: J2 is behind J1; j2h = 0.517) phi_l = atan2(Hh, R) + acos((L2^2 - L3^2 + R^2 + Hh^2) / (2 L2 sqrt(R^2 + Hh^2))) elbow up, as in ref1 q2 = phi_l - phi_l0 (phi_l0 = 2.156857 rad, the ref1 lower-arm direction) phi_f = atan2(Hh - L2 sin phi_l, R - L2 cos phi_l) - beta (beta = atan2(a3, d4) = 0.108205) q3 = phi_f - phi_l + phi_l0 Spherical wrist: R3 = [x3 y3 z3] with x3 = cos(phi_f) X_T + sin(phi_f) Z_T, y3 = Y_T, z3 = cos(phi_f) Z_T - sin(phi_f) X_T, X_T = (cos q1, sin q1, 0), Y_T = (-sin q1, cos q1, 0), Z_T = (0, 0, 1). With the tool axes (x_t, y_t, z_t) in C (constants per door): M11 = x3.x_t, M21 = y3.x_t, M31 = z3.x_t, M12 = x3.y_t, M13 = x3.z_t, and (roll-pitch-roll Rx(q4) Ry(q5) Rx(q6), branch q5 < 0): q5 = -acos(M11), q4 = atan2(-M21, M31), q6 = atan2(-M12, -M13) J3 cylinder (lower-arm frame): knob k = (J3 - J2) + Ry(-q3) (knob - J3), trunnion t: L = |k - t|, cyl = atan2(k_z - t_z, k_x - t_x) - beta_c0; the piston slides along the rod axis by L - 1.0151. ### Driver plan (simple expressions only) Seven solver empties per arm carry custom properties; each reads only earlier empties (no property reads its own object), so one frame change evaluates the chain in order: | empty | properties | reads | |---|---|---| | IK1 target | c, X, Y, H | the door's location | | IK2 yaw | q1, R, Hh | IK1 | | IK3 shoulder | phi_l, q2 | IK2 | | IK4 elbow | phi_f, q3 | IK2, IK3 | | IK5 wrist matrix | M11, M21, M31, M12, M13, kx, kz | IK2, IK4 | | IK6 wrist angles | q4, q5, q6, L, cyl | IK5 | | chain solver | M, a, bx | IK1 | The exact expressions (168 per arm: 33 for the solver and the joints, 135 for the energy chain; all under Blender's 256-character limit) are in `design.json` "drivers" for each door, ready to apply; the switch, grip and fixture drivers are specified in "controls" and "fingers". Joint drivers: carriage location.x = c, turret rotation_euler.z = q1, lower arm .y = -q2, upper arm .y = -q3, forearm .x = q4, wrist head .y = q5, flange .x = q6, J3 cylinder .y = -cyl, J3 piston location.x / .z = rest + u (L - L0). Energy-chain link i: location x, y and rotation z from the chain solver (straight moving run, half-circle bend, straight fixed run; conditionals `a if c else b`). Grip (version A): `DoorArm | CONTROLS["grip"]` g in 0..1; proximal turn 14.7 degrees and distal 41.0 degrees toward the tool axis (top/bottom fingers on rotation y, left/right on rotation z, signs in `design.json` "fingers"). Closed, the hooks sit 6 mm behind the knob's head and 17 mm above its stem; the closing path clears the head by 6 mm or more. Cables over the elbow: Bezier curves with hooks (ends on each arm part, the middle point on an empty halfway between them by two Copy Transforms constraints, influence 1.0 then 0.5: no Python). All other cables have both ends on one part and are plain meshes. ## 6. Two versions: switching and side by side - **Switch**: one empty `DoorArm | CONTROLS` with `version` (0 = A gripper, 1 = B plate). Drivers on `hide_viewport` and `hide_render`: A parts `v > 0.5`, B parts `v < 0.5` (both arms, tools and door fixtures). The arm pose does not change. - **Side by side**: a second scene `DoorArm | Showroom`: both versions upright on one floor rail like the references (the ship rail turned over, on short posts), A at x -1.9, B at x +1.9, made of linked duplicates of the arm meshes at rest (the ref1 pose, fingers open), in a light grey cyclorama studio with key, fill and rim lights. ## 7. Proof (run before handing over) `build/design_ik_check.py` (headless, frames 1-120 step 1, both doors, both versions; `build/check_*.json`) and `build/design_driver_proto.py` (builds the actual driver chain in Blender; `build/proto_*.json`): | check | AFT A | AFT B | FORE A | FORE B | |---|---|---|---|---| | frames | 120 | 120 | 120 | 120 | | tool point on the door target (formula FK) | 0.0014 mm | 0.0014 mm | 0.0020 mm | 0.0020 mm | | tool axes (single-precision floor) | 0.03 deg | 0.03 deg | 0.03 deg | 0.03 deg | | joint limits | inside | inside | inside | inside | | min abs(q5) / elbow inner | 40.0 / 38-92 deg | same | same | same | | wrist centre from J1 axis, min | 0.74 m | 0.74 m | 0.74 m | 0.74 m | | carriage inside its travel | yes | yes | yes | yes | | J3 cylinder: length, piston, barrel rear | 0.716-1.245 m; -0.084..0.445 in barrel; rear 0.12 m inside the lower arm | same | same | same | | lowest clearance to the ship and rail kit (proxies) | 0.107 m turret / inner end stop, f120 | plate 0.017 m above the door = the pad (by design) | 0.107 m | 0.019 m (pad) | | lowest self clearance (proxies) | 0.009 m hub / wrist lobe (design gap) | 0.011 m neck / wrist lobe (design gap) | 0.009 m | 0.011 m | Next lowest real clearances: turret side cables to the end stops 0.118 m, fingers to the door 0.142 m, elbow and yoke to the end wall 0.19-0.20 m, truss to the lower arm's back 0.081 m, knee caps to the turret ears 0.091 m. Driver prototype (Blender's own evaluation after ONE frame_set per frame, AFT and FORE): 172 drivers, **all simple and valid**; tool point error 0.055 mm, axes 0.000 deg, joint values within 0.003 deg of the Python solution, piston eye on the knob within 0.002 mm, energy chain spacing exact (0.78 mm chord on the bend), first link at the carriage, all links inside the tray; the version switch hides and shows as it should, viewport and render. Honest limits: the clearance proxies are boxes and prisms at the design's sizes, not the final meshes; the Coder's check stage repeats this with the real meshes (BVH overlap of every moving mesh against everything, every frame). The proxies are deliberately generous except at the wrist, where the 9-11 mm gap between the hub/neck and the wrist lobes is a designed clearance that the modelled parts must keep. Pictures of the proxies in pose: `previews/design_pose_AFT_A_*.png`. ## 8. Materials, markings, bake, triangles | material | parts | source | |---|---|---| | M_DoorArm_PaintWhite | all white shells | `pd_look.paint(grey=(0.80,0.80,0.78), metallic 0, rough 0.38-0.55, wear 0.25, grime 0.18, dust 0.10, coat 0.30)` on the Poly Haven `blue_metal_plate` scan already on disk (its light/dark, roughness and relief only): satin off-white powder coat with fine orange peel, few chips (the ship is clean) | | M_DoorArm_Gunmetal | carriage, drum, cap rings, side plates, dials, wrist head, fingers, plate B, rail kit, fixtures | pd_look "gunmetal" style; the carriage with more edge wear (r1-3 show scratched edges) | | M_DoorArm_Steel | screws, pins, piston rod (rough 0.12), gland, knurls, wheels, rack, flanges, buckle | `pd_look.steel` + the ModSci pack's `T_Metal_Brushed_N.png` | | M_DoorArm_Rubber | cables, hose, belt, finger boots, buffers, chain links | `pd_look.dark`, rough 0.62-0.78 | | M_DoorArm_Orange | the thin orange rings in the cap stacks, the hose band | safety orange (0.93, 0.36, 0.08) under the masks | | M_DoorArm_Glass | the big caps' dark recessed discs | dark glossy, coat 1.0 | | M_DoorArm_Lamp | indicator lights, the light slot | faint cool white emission (an indicator, not a light source) | | M_DoorArm_Decals | the flat markings | `T_DoorArm_Decals.png`, 1024, made by script from vector shapes | Markings (all orange, shapes only, **no letters, numbers, logos or maker text**): hexagon outline and small triangle on the lower arm's left side; hatch stripes in a frame on both sides of the turret's front housing; a striped square on its lower block; 2x3 dot grids on the forearm; triangles and dots on the wrist block; abstract chevrons in place of the reference's glyphs on the upper arm; corner ticks on plate B. Full list: `design.json` "markings". Bake: UV0 = one 4096 atlas per arm (about 512 px per metre on the large shells): `T_DoorArm_Masks` (R occlusion, G convex edges, B cavities) and `T_DoorArm_BevelNormal` (bevel shader, radius 4 mm), the way `models/docking-arm/build/surfaces.py` does it; UV_Tile in metres for the tiling scans (paint 1.25 m, gunmetal 0.70, steel 0.50, rubber 0.40). Each bake in its own call. Triangles (LOD0): about 152k per arm with the gripper, 138k with the plate, plus 7k per rail kit and 5.5k for the chain. The reference is a dense subdivided render model; ours keeps its silhouette with 2-segment chamfers that the bevel-normal bake rounds, 32-48 sides on caps over 0.2 m, 16-24 on small round parts. Per-link budget: `design.json` "tri_budget". ## 9. Objects, collections, build, export, renders - Names: `DoorArm_ | `, shared `DoorArm | ...`, showroom `Showroom | ...`. Collections: `DoorArm | AFT`, `DoorArm | FORE`, `DoorArm | solver (hidden)`, `DoorArm | rail kit`, `DoorArm | door fixtures`, `DoorArm | collision`, `CONTEXT | ship (reference only)` (never exported), `Showroom | arms`, `Showroom | studio`. Scenes: `DoorArm | Ship fit` (1-120, 30 fps, the door markers) and `DoorArm | Showroom`. - Each link's static parts are joined into the link's one mesh (several material slots). No booleans, quads, UV0 + UV_Tile on every mesh. `UCX_` hulls per link from the clearance proxies (`build/design_parts.py` PROXIES). - Build: one entry `build/build.py -- `: context, parts, rig, check, surfaces, showroom, ucx, export, renders (each call under 9 minutes; bakes and renders separate). Back up `DoorRobotArm.blend` to `versions/vNN_/` before overwriting it. - Export (Unreal): `fbx/SK_DoorRobotArm_A.fbx` and `_B.fbx` (one skeleton; the armature made from the hierarchy at export, rigid weights, cables blended, the chain links as bones), animations `A_DoorRobotArm_AFT_OpenClose.fbx`, `..._FORE_OpenClose.fbx` (frames 1-120) and `A_DoorRobotArm_Grip.fbx`; door fixtures and rail kit as static meshes; per-link static parts with UCX for a Blueprint build if wanted. In Unreal the door's timeline and the arm's animation play together. - Renders (Cycles, GPU): showroom views matching ref1, ref2, ref3, ref4, ref5, ref6 (A and B from the same camera), ref7, and both side by side; in-scene frames 1, 12, 30, 48, 90 for both versions with both arms, lit (the pocket is dark: area lights under the deck and a fill from the well). List and cameras: `design.json` "renders". - Checks the build must pass: `design.json` "checks". ## 10. Open points and risks - The fold of the elbow (38 degrees inner angle at the open door) puts the upper arm between the lower arm's yoke cheeks; the yoke's crotch must stay 0.55 of the knee-to-elbow length below J3 (as the proxies assume). - The wrist block must keep the swing zone on its upper front free (0.25 m from the wrist centre); the reference's wrist top is sloped this way, but the modelled details (fin, top cylinder, orange marks) must respect it. - The arm is large (2.8 m tall upright, reach 3.75 m): this is what reaching a door 2-3 m away from a rail under the deck needs with the reference's proportions. The pocket is big enough (proven), but it will dominate the pocket in renders. - The ship's door material has four missing images (an old absolute path in the ship): not ours to fix; the context renders will show the door without its textures. - The design reads the doors, rails and pocket from the context copy of 2026-10-16. If the ship's doors or rails change, rerun `design_probe*.py`, `design_make_json.py`, `design_ik_check.py` and `design_driver_proto.py`. ## 11. Parts list (every part, per link) Sizes and positions in metres in each object's own frame (A axes at rest unless the row says otherwise). `refs`: r1-r7 are the seven references; `added` = needed by the mechanism but not seen in the pictures. Shapes: box, rbox (rounded box: x, y, z, radius), cyl (dia, length), ring (outer dia, inner dia, thickness), stack (rings: dia, height, material, from the face outward), plate2d (side outline in the link's X-Z plane, extruded across Y), tube (dia; path points), U (bent-tube handle), knurl, cone, decal. Source of truth: `design.json` "parts_m". ### Carriage Frame: Carriage object (origin [0.0, 0.0, 0.0] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | C01 | turntable plate (ref: top plate) | rbox | 0.858, 0.858, 0.044, 0.055 | (0.000, 0.000, -0.022) | r1 r4 r7 | gunmetal | rounded corners R25, 3 px chamfer; a raised rounded pad 330x330x4 px in its middle under the slewing ring (r7) | | C02 | stacked plates x5 | rbox | 0.8492, 0.8492, 0.0286, 0.0528 | (0.000, 0.000, -0.059) | r1 r4 r7 | gunmetal | five plates 13 px thick with 2.5 px V-grooves between them (Z -20..-95); alternate plates inset 2 px; worn lighter edges (r1-3 show scratched paint on the dark carriage) | | C03 | strap band | rbox | 0.8624, 0.8624, 0.088, 0.0484 | (0.000, 0.000, -0.253) | r1 r4 r7 | gunmetal | Z -95..-135; on both rail-side faces (+-Y, the cheeks' outer faces in the ship): the dot panels and the strap+buckle | | C03a | dot panels (2 per face, 4 total) | box | 0.154, 0.0066, 0.0616 | (0.330, 0.431, -0.253) | r4 r7 | gunmetal | both sides (mirror Y). a raised panel at each end of the band; 2 rows x 3 round dimples, dimple dia 7 px, pitch 13 px | | C03b | strap (flat) | box | 0.132, 0.0088, 0.0308 | (0.209, 0.433, -0.246) | r4 r7 | gunmetal | both sides (mirror Y). between dot panel and buckle | | C03c | buckle chain (5 links per face) | links | 0.44, 0.0132, 0.0396 | (0.000, 0.438, -0.255) | r4 r7 | steel | both sides (mirror Y). five articulated flat links, each 42x18x6 px with rounded ends and 2 pins; the two outer pairs angle down 12 deg, the centre link sits 10 px lower (the strap sags); static (no rig) | | C04 | lower block (ref) | rbox | 0.8536, 0.8536, 0.066, 0.0528 | (0.000, 0.000, -0.330) | r1 r4 r7 | gunmetal | Z -135..-165 with one groove line 4 px under its top edge | | C05 | skirt with chamfered notch | rbox | 0.858, 0.858, 0.044, 0.055 | (0.000, 0.000, -0.385) | r4 r7 | gunmetal | Z -165..-185; on the +-Y faces the middle 55% is cut back 15 px with 45 deg chamfers (the 'feet' at the ends); a thin raised line runs round the face 4 px from the edge | | C06 | rail channel (cut through C02..C05) | channel | 0.858, 0.578, 0.285 | (0.000, 0.000, -0.265) | added | gunmetal | [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] U channel along X for the rail + running flanges, 0.578 m wide, from the cheek tops (ship z -3.775) down to ship z -4.06 (clears the rack by 0.01); pockets in its floor and cheeks for the rollers and the pinion; made with loops/extrusion, no boolean; the cheeks either side are 0.140 m thick | | C07 | load wheels x4 | cyl | 0.1, 0.04 | (0.300, -0.254, -0.252); (-0.300, -0.254, -0.252) | added | steel | both sides (mirror Y). [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] in the cheeks, axles along Y; they roll on the TOP of the running flanges K01 (ship z -3.93 centre) | | C08 | counter-rollers x4 | cyl | 0.06, 0.035 | (0.300, -0.254, -0.142); (-0.300, -0.254, -0.142) | added | steel | both sides (mirror Y). [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] under the running flanges (ship z -4.04 centre); hold the arm's tipping moment | | C09 | side guide rollers x4 | cyl | 0.06, 0.03 | (0.200, -0.309, -0.187); (-0.200, -0.309, -0.187) | added | steel | both sides (mirror Y). [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] vertical axles; run on the flanges' outer edges (lateral load) | | C10 | drive motor + gearbox + pinion | cyl | 0.12, 0.3 | (0.000, 0.000, -0.084) | added | gunmetal | [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] axis along Y under the rail; pinion dia 0.096 (module 12, 8 teeth) meshes with the rack K02 from below; the motor's end cap (dia 0.12, steel bolt ring, thin orange ring) shows on the carriage's outboard face | | C11 | energy-chain bracket | box | 0.1, 0.14, 0.05 | (0.000, -0.497, -0.387) | added | steel | [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] on the inboard cheek top (ship +y); carries the chain's moving end at ship y -5.23 | | C12 | buffer strike pads x2 | box | 0.02, 0.2, 0.08 | (0.439, 0.000, -0.112); (-0.439, 0.000, -0.112) | added | steel | [frame: Carriage object in metres: A axes (X along the rail, Y = ship -y, Z = ship DOWN), origin at the turntable face centre; ship world = (c + X, -5.795 - Y, -4.182 - Z)] steel pads on both end faces below the rail (ship z -4.11..-4.03), where the rail's end-stop buffers K03 meet them | | C13 | slewing ring, fixed race | ring | 0.594, 0.528, 0.0176 | (0.000, 0.000, 0.009) | r1 r4 | gunmetal | on C01's pad; 24 bolt heads dia 8 px on a 255 px circle | ### Turret Frame: Turret object (origin [0.0, 0.0, 0.0] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | T01 | slewing ring, turning race | ring | 0.5764, 0.0, 0.0484 | (0.000, 0.000, 0.033) | r1 r4 r7 | gunmetal | three stacked rings with 2 V-grooves (r4); hollow centre for the cables (hidden) | | T02 | lower block (skirt) | rbox | 0.77, 0.726, 0.187, 0.044 | (-0.033, 0.000, 0.147) | r1 r2 r3 r4 r7 | paint_white | X -190..160, Z 25..110; corners R20; seams: one horizontal groove 30 px above its foot | | T02a | back screw strips | box | 0.0066, 0.0396, 0.176 | (-0.422, 0.114, 0.147) | r7 | paint_white | both sides (mirror Y). two vertical strips on the back face (Y +-52) with 3 round screw heads each (dia 10 px, steel) | | T02b | back latch slot | box | 0.0066, 0.088, 0.187 | (-0.422, 0.000, 0.147) | r7 | gunmetal | a vertical slot in the back face with a bent U-tab (30x60 px, bar 8 px) hooked over its top (r7 centre) | | T02c | side recess | box | 0.132, 0.0088, 0.033 | (-0.066, 0.365, 0.099) | r1 r2 | gunmetal | both sides (mirror Y). a horizontal recessed slot (r1 x_img 1030) | | T02d | rear corner glands | cyl | 0.066, 0.0484 | (-0.330, 0.365, 0.066) | r1 r7 | rubber | axis Y. both sides (mirror Y). where the side cable pairs end (r1 x_img 1135, y 1530) | | T02e | front corner screws | disc | 0.022, 0.0066 | (0.352, 0.264, 0.132); (0.352, 0.264, 0.187); (0.352, 0.264, 0.220) | r4 | steel | axis X. both sides (mirror Y). three small screw heads up each front corner of the lower block (r4) | | T02f | side slot panel | rbox | 0.154, 0.0088, 0.0484, 0.0176 | (-0.176, 0.365, 0.110) | r4 | paint_white | both sides (mirror Y). a recessed rounded slot panel low on each side of the lower block (r4, right of the cable) | | T03 | front housing | plate2d | outline (0.550, 0.242) (0.550, 0.638) (0.440, 0.748) (0.132, 0.770) (-0.088, 0.748) (-0.088, 0.242) | (0.000, 0.000, 0.000) | r1 r2 r4 | paint_white | side outline in X-Z (px) extruded Y +-140; top front edge chamfered 50 px; a lid 130x6 px on top (x_img 870-1000); two horizontal seams and one vertical seam on each side; fillets 6 px | | T03a | front housing top plug | cyl | 0.055, 0.0264 | (0.330, 0.000, 0.781) | r4 | paint_white | axis Z. small round plug on the lid | | T04 | J2 ears | rbox | 0.572, 0.187, 0.572, 0.088 | (-0.341, 0.378, 0.517) | r1 r3 r7 | paint_white | both sides (mirror Y). the two side housings that hold the shoulder; inner faces at Y +-130 (the drum turns between them) | | T04a | J2 motor caps | stack | dia 0.363 h 0.040 paint_white / dia 0.264 h 0.022 gunmetal / dia 0.167 h 0.007 orange / dia 0.154 h 0.031 gunmetal / dia 0.088 h 0.022 steel | (-0.341, 0.473, 0.517) | r1 r2 r3 r4 r7 | mixed | axis Y. both sides (mirror Y). a stack of rings on each ear's outer face (outer dia, height px, material): white bezel, dark ring, thin ORANGE ring, dark stepped hub with 3 rings, hex bolt in the centre (r1: the orange-ring cap at x_img 1155) | | T05 | connector boss | stack | dia 0.114 h 0.022 paint_white / dia 0.066 h 0.018 gunmetal | (0.407, 0.312, 0.440) | r1 r2 r4 | mixed | axis Y. double ring boss on the front housing side (r1 x_img 815; r4 left of the gland) | | T06 | cable port glands (side pairs start) | stack | dia 0.106 h 0.026 paint_white / dia 0.070 h 0.044 rubber | (0.187, 0.312, 0.440) | r1 r2 r3 r4 | mixed | axis Y. both sides (mirror Y). white collar + rubber sleeve; the cable pair leaves here (r1 x_img 915, y 1350) | | T07 | orange hatch marking | decal | 0.154, 0.044 | (0.154, 0.310, 0.726) | r1 r2 r3 | orange | both sides (mirror Y). five 45-deg stripes in a thin frame + a thin line above it, on both sides of the front housing | | T07a | warning stripes, lower block | decal | 0.066, 0.077 | (-0.374, 0.365, 0.198) | r1 | orange | small striped square (r1 x_img 1120, y 1460) | | T08 | bundle gland (front top) | stack | dia 0.136 h 0.066 paint_white / dia 0.106 h 0.026 rubber | (0.451, 0.132, 0.700) | r1 r2 r4 | mixed | axis X. a round collar with a lip on the front housing top (r4); the multi-cable bundle leaves it forward | | T09 | cable bundle (7 cables) | tube | 0.022 | (0.451, 0.132, 0.726); (0.638, 0.145, 0.726); (0.748, 0.154, 0.572); (0.759, 0.154, 0.440) | r1 r2 r4 | rubber | 7 black cables dia 10 px in a hexagonal pack (dia 34 px), arcing forward and down to the clamp T10; cable ends enter T11 | | T10 | bundle clamp block | rbox | 0.154, 0.132, 0.11, 0.0176 | (0.726, 0.154, 0.407) | r1 r2 r4 | paint_white | two-part clamp with one bolt head (dia 15, steel) and a slot; orange tick on its face (r2) | | T11 | belt-drive arm | rbox | 0.286, 0.154, 0.176, 0.022 | (0.682, 0.077, 0.242) | r1 r2 r4 | paint_white | white bracket from the front housing forward to the pulley; 3 small bolt heads (r4) | | T12 | drive pulley (J1 motor) | stack | dia 0.172 h 0.088 paint_white / dia 0.132 h 0.013 gunmetal / dia 0.088 h 0.022 gunmetal / dia 0.040 h 0.026 steel | (0.671, 0.077, 0.242) | r1 r2 r3 r4 | mixed | axis Y. ringed white pulley (5 grooves) with a dark core and shaft (r1 x_img 695, y 1440) | | T12b | drive motor end cap | stack | dia 0.128 h 0.026 paint_white / dia 0.097 h 0.009 gunmetal / dia 0.066 h 0.013 glass_dark | (0.550, 0.165, 0.242) | r2 r4 | mixed | axis Y. the J1 motor's end on the belt arm's outer side, coaxial with the pulley: white ring, dark ring, dark lens (r2 turret crop) | | T13 | toothed belt | belt | 0.066, 0.0176 | (0.671, 0.077, 0.242); (0.330, 0.077, 0.154) | r1 r4 | rubber | black belt 30 px wide from the pulley T12 back to a hidden pulley in the lower block (x_img 850); teeth on the outside every 12 px (r4: rectangular lugs); static | | T14 | idler pulley | stack | dia 0.066 h 0.026 gunmetal / dia 0.026 h 0.035 steel | (0.561, 0.077, 0.110) | r1 r4 | mixed | axis Y. small dark pulley with a bolt (r1 x_img 745) | | T15 | side cable pairs (2 x 2 cables) | tube | 0.0264 | (0.187, 0.330, 0.440); (0.132, 0.660, 0.385); (-0.088, 0.726, 0.242); (-0.264, 0.550, 0.088); (-0.330, 0.385, 0.066) | r1 r2 r3 r4 r7 | rubber | both sides (mirror Y). two cables per side side by side 25 px apart; loop out to Y +-330 (r7) and down to T02d; rubber ferrules at both ends | | T16 | dot vent | box | 0.088, 0.0066, 0.055 | (0.264, 0.312, 0.253) | r4 | gunmetal | dark panel with 6x4 round holes dia 4 px (r4, under the housing) | | T17 | recessed vent slot | box | 0.033, 0.0088, 0.088 | (0.462, 0.312, 0.352) | r4 | gunmetal | both sides (mirror Y). a vertical slot with one sloped edge (r4) | ### LowerArm Frame: LowerArm object (origin [-0.341, 0.0, 0.517] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | L01 | drum (J2 barrel) | cyl | 0.594, 0.462 | (0.000, 0.000, 0.000) | r1 r2 r3 r7 | gunmetal | axis Y. turns with the lower arm between the turret ears; perforated: side faces 24 holes dia 14 px on a 210 px circle; barrel face 2 rows x 24 holes dia 16 px at Y +-55 (r7); holes are blind recesses 8 px deep (quad rings) | | L02 | root shells | plate2d | outline (0.363, 0.000) (0.000, 0.363) (-0.319, 0.275) (-0.385, 0.000) (0.000, -0.363) | (0.000, 0.000, 0.000) | r1 r3 r5 | paint_white | both sides (mirror Y). the white side shells round the drum (R 160 about J2, white rim ring visible round the drum in r1), Y +-205 outer, blending into the beam L03 | | L03 | beam J2 -> knee -> crotch | plate2d | outline (0.209, 0.209) (-0.209, 0.715) (-0.385, 0.891) (-0.803, 0.627) (-0.693, 0.209) (-0.385, -0.011) | (0.000, 0.000, 0.000) | r1 r2 r3 r5 | paint_white | box section, Y +-205 outer; side outline in X-Z px; seams and raised panels on the sides (r5) | | L04 | back channel | channel | 0.242, 0.099 | (-0.275, 0.000, -0.143); (-0.693, 0.000, 0.473); (-0.891, 0.000, 1.111) | r3 r5 r7 | gunmetal | recessed channel down the back face (Y +-55, 45 px deep) from the drum to the elbow; the J3 cylinder lies in it | | L05 | rungs | box | 0.022, 0.242, 0.066 | (-0.275, 0.000, -0.143); (-0.891, 0.000, 1.111) | r1 r2 r5 r7 | gunmetal | cross ribs every 20 px along the channel (about 40); in r1/r2 they show as the dashed strip on the arm's upper edge | | L06 | knee bosses | ring | 0.55, 0.44, 0.044 | (-0.524, 0.451, 0.330) | r1 r2 r3 r5 | paint_white | axis Y. both sides (mirror Y). raised white ring round each slotted cap | | L07 | knee caps (radial slotted) | stack | dia 0.418 h 0.022 gunmetal / dia 0.264 h 0.013 gunmetal / dia 0.198 h 0.013 gunmetal / dia 0.132 h 0.013 gunmetal / dia 0.121 h 0.004 orange / dia 0.055 h 0.018 steel | (-0.524, 0.473, 0.330) | r1 r2 r3 r5 | mixed | axis Y. both sides (mirror Y). black disc with 10 radial slots (35x12 px, open at the rim like teeth, at r 70), a stepped inner hub, a thin ORANGE ring and a bolt; they cover the J3 cylinder's trunnion pin | | L18 | front dark core + inner cap | plate2d | outline (-0.385, 0.583) (-0.605, 1.023) (-0.693, 1.199) (-0.539, 1.155) (-0.319, 0.715) | (0.000, 0.000, 0.000) | r1 r5 | gunmetal | between the side shells on the lower arm's front a dark core shows (r1: the black region under the upper arm; r5: dark plates with two round bosses dia 20 px and small bolt heads); an inner round cap dia 45 px at (-380, 0, 645) (r1 x_img 1380, y 905) | | L08 | hexagon outline (orange) | decal | 0.11, 0.11 | (-0.176, 0.453, 0.297) | r1 r2 | orange | 3 px line, left side only (r1 x_img 1235, y 1165) | | L09 | triangle outline (orange) | decal | 0.0396, 0.0396 | (-0.451, 0.453, 0.605) | r1 r5 | orange | small, left side (r1 x_img 1360, y 1040) | | L10 | light slot | box | 0.0396, 0.0132, 0.308 | (-0.814, 0.453, 0.979) | r1 r5 | lamp | recessed slot inclined along the arm with a pale bar inside (r1 x_img 1505-1550, y 800-940); left side only; very faint glow | | L11 | round button | stack | dia 0.066 h 0.013 gunmetal / dia 0.048 h 0.018 paint_white | (-0.726, 0.453, 0.660) | r1 r5 | mixed | axis Y. domed button, left side (r1 x_img 1485, y 1015) | | L12 | stepped side panels | plate2d | outline (-0.539, 0.627) (-0.803, 0.891) (-0.891, 1.199) (-0.693, 1.023) | (0.000, 0.000, 0.000) | r1 r5 | paint_white | both sides (mirror Y). raised panels 6 px proud with 45 deg steps and the notch block near the knee top (r5) | | L13 | handles (bent tube) | U | 0.154, 0.33, 0.0264 | (-0.693, 0.407, 0.319) | r1 r3 r5 r7 | paint_white | both sides (mirror Y). on the back face near each side edge at knee height, standing out backward 70 px; the outer leg has a segmented sleeve of 5 rings (r5); two small mounting blocks 18x18x12 px | | L14 | elbow yoke cheeks | plate2d | outline (-0.693, 1.023) (-0.979, 1.155) (-1.067, 1.309) (-0.869, 1.496) (-0.693, 1.397) | (0.000, 0.000, 0.000) | r1 r2 r5 | paint_white | both sides (mirror Y). two cheeks Y +-(125..205) from the crotch (55% of knee->J3) to J3, rounded R 85 round J3; the upper arm turns between them | | L15 | elbow caps | stack | dia 0.308 h 0.026 paint_white / dia 0.242 h 0.013 gunmetal / dia 0.220 h 0.026 gunmetal / dia 0.132 h 0.009 steel | (-0.869, 0.451, 1.309) | r1 r2 r3 r5 | mixed | axis Y. both sides (mirror Y). black cap with a straight slot 60x12 px across ('minus' screw head) and two small tick notches at 12 and 6 o'clock | | L16 | inner channel guide + hose loop | box | 0.088, 0.132, 0.132 | (-0.891, 0.000, 1.155) | r3 | gunmetal | in the channel's upper end (r3: a threaded rod and a white sliding block); here: the J3 cylinder's hose loop and a guide block (added) | | L17 | cable gland, back of elbow | stack | dia 0.075 h 0.022 paint_white / dia 0.053 h 0.031 rubber | (-1.067, 0.132, 1.243) | r1 r3 | mixed | axis X. twin gland where the two upper-arm cables U09 come in (r1 x_img 1620-1640, y 690-710) | ### Cylinder Frame: Cylinder object: origin at the trunnion; at = (s, 0, 0) with s measured along the rod axis u = (-0.7997, 0, 0.6003) (lower-arm rest axes, toward the knob). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | R01 | barrel | cyl | 0.075, 0.8 | (0.100, 0.000, 0.000) | r1 r3 r5 | gunmetal | black barrel from 0.30 m behind the trunnion to 0.50 m ahead of it (middle trunnion), on the line to the knob; the part behind the trunnion stays inside the lower arm channel | | R02 | trunnion block + pin | box | 0.1, 0.11, 0.1 | (0.000, 0.000, 0.000) | added | gunmetal | pin dia 0.06 across the lower arm, hidden by the knee caps | | R03 | gland collar | cyl | 0.085, 0.04 | (0.480, 0.000, 0.000) | r1 r3 r5 | steel | bright ring where the rod leaves the barrel | | R04 | hoses x2 | tube | 0.02 | - | added | rubber | [frame: A] from the barrel's two ports into the channel wall; hooked at both ends | ### Piston Frame: Piston object: origin at the rod eye centre; at = (s, 0, 0) with s along the rod axis u (negative = into the barrel). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | R05 | piston rod | cyl | 0.05, 0.8 | (-0.400, 0.000, 0.000) | r1 r3 r5 | steel | chrome rod from its eye 0.80 m back to the piston | | R06 | rod eye | ring | 0.075, 0.05, 0.024 | (0.000, 0.000, 0.000) | r1 r3 | steel | [frame: Piston object: origin at the rod eye centre] eye on the knob pin between the two truss plates | ### UpperArm Frame: UpperArm object (origin [-1.21, 0.0, 1.826] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | U01 | elbow hub | cyl | 0.33, 0.506 | (0.000, 0.000, 0.000) | r1 r5 | gunmetal | axis Y. between the yoke cheeks (Y +-115) | | U02 | housing (the hump) | plate2d | outline (-0.198, -0.066) (-0.110, 0.396) (0.176, 0.550) (0.484, 0.583) (0.858, 0.583) (0.858, 0.132) (0.550, 0.088) (0.176, -0.066) | (0.000, 0.000, 0.000) | r1 r2 r3 r5 | paint_white | side outline X-Z px, Y +-110; a raised spine along the top; a dark recess strip along the lower edge (x_img 1380-1500); seams | | U03 | big caps | stack | dia 0.363 h 0.031 paint_white / dia 0.229 h 0.009 orange / dia 0.220 h 0.022 glass_dark / dia 0.158 h 0.013 steel | (0.634, 0.246, 0.341) | r1 r2 r3 | mixed | axis Y. both sides (mirror Y). white bezel, thin ORANGE ring, a dark glossy recessed disc and a slotted screw head (bar 70x14 px) inside | | U04 | ribbed vents | box | 0.22, 0.0132, 0.121 | (0.176, 0.244, 0.209) | r1 r2 r3 r5 | paint_white | both sides (mirror Y). raised panel with 8 slots 10x45 px, pitch 12 px, inclined 30 deg along the top edge | | U05 | indicator lights | stack | dia 0.073 h 0.009 gunmetal / dia 0.055 h 0.013 lamp | (0.429, 0.244, 0.198) | r1 r3 | mixed | axis Y. both sides (mirror Y). white lens in a dark ring; faint glow | | U06 | small dot | disc | 0.0176, 0.0044 | (0.297, 0.244, 0.242) | r1 | gunmetal | axis Y. | | U07 | orange ticks | decal | 0.0308, 0.0308 | (0.055, 0.244, 0.396) | r1 r2 | orange | two small abstract chevrons (the reference has glyphs; no text here) | | U08 | twin cable gland | rbox | 0.11, 0.088, 0.066, 0.0132 | (0.176, 0.110, 0.418) | r1 r2 r3 | paint_white | on the top behind the vents; two rubber glands dia 16 px face backward | | U09 | two cables over the elbow | tube | 0.0264 | (0.176, 0.110, 0.418); (-0.198, 0.121, 0.594); (-0.572, 0.132, 0.352); (-0.462, 0.136, 0.066); (-0.198, 0.132, -0.066) | r1 r2 r3 r5 | rubber | cross J3: hooked at both ends, middle points blended 50/50 (see the rig); 18 px apart | | U10 | truss plates (pair) | plate2d | outline (-0.022, 0.066) (0.110, -0.154) (-0.418, -0.440) (-0.528, -0.330) (-0.132, 0.066) | (0.000, 0.000, 0.000) | r1 r2 r3 r5 | paint_white | two plates Y +-(14..40) behind the elbow down to the knob; raised rim 8 px; 4 triangular cut-outs alternating (the 'ANN' pattern), dark backing visible through them; the rod eye sits between the plates | | U11 | knob pin + caps | knurl | 0.1364, 0.044, 24 | (-0.466, 0.101, -0.370) | r1 r3 r5 | gunmetal | axis Y. both sides (mirror Y). pin dia 50 px through both plates; knurled caps (24 ribs) on both sides with a dark dome centre dia 25 | | U12 | front block (J4 housing) | rbox | 0.209, 0.462, 0.451, 0.0264 | (1.008, 0.000, 0.356) | r1 r2 r3 | paint_white | X -140..-45; 3 ring grooves round it; a small square button (x_img 1090, y 520), a small white indicator rectangle 18x10 px (x_img 1155, y 545, lamp), a dark bolt (x_img 1150, y 650) | ### Forearm Frame: Forearm object (origin [-0.077, 0.0, 2.0614] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | F01 | roll bearing ring | ring | 0.418, 0.33, 0.0264 | (0.013, 0.000, 0.000) | r1 r2 r6 | gunmetal | axis X. the black thin ring between the upper arm and the forearm | | F02 | dial housing | rbox | 0.55, 0.418, 0.429, 0.066 | (0.275, 0.000, 0.022) | r1 r2 r3 r6 | paint_white | X -35..215, Z 850..1045 | | F03 | dark side plates | rbox | 0.506, 0.0132, 0.319, 0.066 | (0.286, 0.211, 0.077) | r1 r3 r6 | gunmetal | both sides (mirror Y). rounded plates with a '7'-shaped groove near the rear top corner (r6), a small bolt with a white ring at x_img 1015 | | F04 | dials | stack | dia 0.242 h 0.013 gunmetal / dia 0.187 h 0.009 gunmetal / dia 0.121 h 0.009 steel / dia 0.044 h 0.013 gunmetal | (0.275, 0.220, 0.051) | r1 r2 r3 r6 | mixed | axis Y. both sides (mirror Y). black stepped disc with a '+' cross groove (6 px) through it and 4 notches on the rim (r6) | | F05 | belly | rbox | 0.44, 0.352, 0.132, 0.0308 | (0.319, 0.000, -0.125) | r1 r6 | paint_white | below the side plates; seam; a flat bar 230x25 px under it (r6) | | F06 | orange dot grids | decal | 0.0572, 0.0308 | (0.473, 0.211, 0.007) | r1 r3 | orange | both sides (mirror Y). 2 x 3 dots dia 5 px | | F07 | J5/J6 motor cylinder | cyl | 0.165, 0.198 | (0.638, 0.000, 0.139) | r1 r2 r6 | paint_white | axis X. ringed (3 grooves) white cylinder, top front, joining the wrist block | | F08 | hose | tube | 0.0484 | (0.517, -0.022, -0.147); (0.649, -0.022, -0.169); (0.803, -0.022, -0.147) | r1 r3 r6 | rubber | black hose with metal ferrules (dia 28 x 15 px) at both ends and an ORANGE band (6 px) near the front end | | F09 | wrist block (fork) | plate2d | outline (0.550, 0.260) (0.814, 0.238) (1.045, 0.117) (1.177, 0.000) (1.045, -0.169) (0.550, -0.191) | (0.000, 0.000, 0.000) | r1 r2 r3 r6 | paint_white | angled housing Y +-75; its front is a fork (cheeks Y +-(55..75)) carrying J5; lobes R 60 round WC | | F10 | wrist fin (left) | rbox | 0.165, 0.033, 0.0484, 0.0176 | (0.803, 0.167, 0.172) | r1 r6 | paint_white | raised rounded bar, inclined 20 deg; right side has an oval recessed slot 70x18 px instead (r3) | | F11 | orange triangles + dots | decal | 0.077, 0.055 | (0.836, 0.167, 0.084) | r1 r3 r6 | orange | both sides (mirror Y). three small triangles and two dots (left); 2x2 dots (right) | | F12 | screw caps | disc | 0.033, 0.011 | (0.957, 0.167, -0.015); (0.924, 0.167, -0.114) | r1 r6 | paint_white | axis Y. both sides (mirror Y). two white domes per side | | F13 | bottom handle | U | 0.121, 0.033, 0.011 | (0.928, 0.000, -0.209) | r1 r3 r6 | gunmetal | flat-bar loop under the wrist block | | F14 | J5 caps (wrist round caps) | stack | dia 0.220 h 0.013 gunmetal / dia 0.176 h 0.009 gunmetal / dia 0.132 h 0.009 gunmetal / dia 0.088 h 0.009 steel / dia 0.044 h 0.009 gunmetal | (1.034, 0.167, 0.000) | r1 r2 r3 r6 | mixed | axis Y. both sides (mirror Y). stepped concentric rings on both cheeks | | F15 | wrist top cylinder | cyl | 0.099, 0.088 | (0.781, 0.000, 0.150) | r6 | paint_white | axis X. short cylinder with a black band on the wrist block top; kept outside 0.25 m of the wrist centre on the upper side, where the tool swings | ### WristHead Frame: WristHead object (origin [0.957, 0.0, 2.0614] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | W01 | head drum | cyl | 0.209, 0.2332 | (0.000, 0.000, 0.000) | r1 r6 | gunmetal | axis Y. between the fork cheeks, turns about Y | | W02 | neck collar | cyl | 0.165, 0.0264 | (0.077, 0.000, 0.000) | r1 r6 | gunmetal | axis X. | ### Flange Frame: Flange object (origin [0.957, 0.0, 2.0614] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | FL1 | knurled ring | knurl | 0.1584, 0.055, 36 | (0.103, 0.000, 0.000) | r1 r6 | steel | axis X. J6 turns here (r6 knurled neck) | | FL2 | flange face | disc | 0.176, 0.011 | (0.136, 0.000, 0.000) | added | gunmetal | axis X. 6 bolt holes; tools bolt here | ### ToolA Frame: ToolA object (origin [0.957, 0.0, 2.0614] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | A01 | hub | cyl | 0.275, 0.165 | (0.213, 0.000, 0.000) | r1 r2 r3 r6 | paint_white | axis X. white body with a black ring at each end, 3 grooves; front face: 4 dark stepped rings (dia 125/100/75/45) | | A02 | finger brackets x4 | box | 0.077, 0.066, 0.055 | (0.257, 0.000, 0.154) | r1 r2 r3 r6 | gunmetal | on the hub's front rim at r 70, one per finger | | A03 | finger motors x4 | knurl | 0.066, 0.143, 24 | (0.319, 0.000, 0.242) | r1 r2 r6 | steel | knurled cylinder fixed to each bracket, axis in the finger's plane pointing back-outward 20 deg from the tool axis (r1 top finger) | ### Finger Frame: Finger object (origin [0.0, 0.0, 0.0] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | A04 | knuckle pin caps | disc | 0.0528, 0.0132 | (0.000, 0.000, 0.000) | r1 r6 | steel | axis Y. both sides of the knuckle | | A05 | proximal link | rbox | 0.1936, 0.0396, 0.0484, 0.011 | (0.097, 0.000, 0.000) | r1 r2 r3 r6 | gunmetal | with a ribbed rubber boot (8 ribs, dia 26, 45 px long) on its middle and a threaded tendon rod dia 5 px along its outer side | | A06 | distal pin caps | disc | 0.044, 0.0132 | (0.194, 0.000, 0.000) | r1 r6 | steel | axis Y. | | A07 | distal link + hooked tip | rbox | 0.154, 0.0352, 0.0396, 0.0088 | (0.271, 0.000, 0.000) | r1 r2 r3 r6 | gunmetal | tapered 18 -> 10 px; a 15 px hook turned inward at the tip; ridged steel jaw insert on the inner face | ### ToolB Frame: ToolB object (origin [0.957, 0.0, 2.0614] m in the arm frame A at rest). | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | B01 | flared neck | cone | 0.154, 0.2926, 0.4334 | (0.348, 0.000, 0.000) | r6 (red sketch) | paint_white | axis X. trumpet-shaped: the sketch's two lines spread from the wrist to the plate (the sketch is a 3/4 view looking along the tool, so the neck shows short); 0.434 m long so the plate's face lands where version A grips (both versions share one arm pose); straight for its first 60%, flaring over the last 40%; two ring grooves; fillet into the plate | | B02 | mounting plate | rbox | 0.044, 0.55, 0.55, 0.033 | (0.585, 0.000, 0.000) | r6 (red sketch) | gunmetal | square plate 0.55 x 0.55 x 0.044 m, corner R 0.033, 2 mm chamfers; its door face is flat | | B03 | plate bolts x8 | hex | 0.0396, 0.022 | (0.561, 0.000, 0.000) | added | steel | M24-size hex heads, 2 per edge on a 0.46 m square | | B04 | orange corner ticks | decal | 0.044, 0.044 | (0.561, 0.000, 0.000) | added (matches the arm's accents) | orange | four small L-ticks at the plate's corners | ### DoorFixtureA Frame: fixture local: Z = door normal. | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | DA1 | conformal pad | pad | 0.32, 0.32, 0.02 | (0.000, 0.000, 0.000) | added | gunmetal | underside follows the door's inner face (ray-cast), top flat | | DA2 | base plate | rbox | 0.26, 0.26, 0.03, 0.02 | (0.000, 0.000, 0.035) | added | gunmetal | [frame: fixture local] 4 bolts | | DA3 | stem | cyl | 0.08, 0.115 | (0.000, 0.000, 0.107) | added | steel | [frame: fixture local] | | DA4 | grab knob (mushroom head) | cyl | 0.13, 0.05 | (0.000, 0.000, 0.190) | added | steel | [frame: fixture local] 3 mm chamfers; the 4 hooked tips close under it round the stem | ### DoorFixtureB Frame: fixture local. | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | DB1 | conformal pad | pad | 0.6, 0.6, 0.02 | (0.000, 0.000, 0.000) | added | gunmetal | underside follows the door's face; the plate B02 bolts to its flat top | ### RailKit Frame: world. | id | part | shape | size (m) | at (m) | refs | material | notes | |---|---|---|---|---|---|---|---| | K01 | running flanges x2 | box | 6.49, 0.05, 0.03 | (-5.790, -6.049, -3.995) | added | steel | both sides (mirror Y). flat bars bolted to both side faces at the rail's bottom, x -9.0348..-2.5453, z -4.010..-3.980, protruding 0.05 (y -6.0738..-6.0238 and -5.5662..-5.5162); bolt heads (M16) every 0.25 m on their outer faces | | K02 | rack | rack | 5.32, 0.06, 0.04 | (-5.565, -5.795, -4.030) | added | steel | gear rack bolted under the rail's bottom face over the pinion's travel (x -8.225..-2.905), teeth down, module 12 mm | | K03 | end stops x2 | box | 0.13, 0.3, 0.12 | (-8.620, -5.795, -4.070); (-2.525, -5.795, -4.070) | added | gunmetal | wall end: steel block x -8.685..-8.585 bolted under the rail + rubber buffer x -8.585..-8.555; inner end: rubber buffer x -2.575..-2.545 + steel block x -2.545..-2.475 bolted to the rail's end face and underside; both z -4.13..-4.01 between the flanges; the carriage's end faces (strike pads C12) stop 10 mm short of the buffers at its travel ends (c -8.1158 / -3.0143) | | K04 | energy-chain tray | channel | 6.05, 0.4, 0.125 | (-5.975, -5.080, -3.840) | added | gunmetal | a shallow tray hung under the deck on the inboard side: y -5.28..-4.88, floor top at z -3.895, walls to -3.78, x -9.00 to a slanted well-side end (x -2.95 at y -5.28, -3.08 at y -4.88: >= 0.05 m short of the moon pool well's rounded edge); hangers to the deck every 0.8 m | | K05 | energy chain | chain | 3.27, 0.1, 0.06 | - | added | rubber | lying on its side in the tray (bend axis vertical), 44 links of pitch 0.075 m (link 0.075 x 0.06 x 0.10 high), length 3.30 m, bend radius 0.15 m; runs at y -5.23 (moving, carriage side) and -4.93 (fixed); fixed end at x -5.565 (mid travel), moving end on the carriage bracket C11; the loop travels x -8.40..-5.70; links are rigid objects driven by simple expressions of the carriage x | ## 2026-10-18 scale-up and door-centre attach (addendum, the Coder) The user: "make it bigger so those can withstand the pressure to open that door under the water" and "attach the main plate to the doors center and make it bigger". The coordinator: the plate and version A's knob at the exact centre of each door, solved with these means in this order: the rail's position, the scale (1.4-1.5x preferred, never under 1.3x), the IK branch / turret zero / joint limits, the link lengths (as little as needed). **The centre.** The middle of the door's length (local x) and of its curved inner face by arc length: door-local (-0.0858 AFT / +0.0858 FORE, -0.7053, -0.6179), face normal (0, 0.7422, 0.6701) (`build/door_centre.json`, `build/dra_door_centre.py`). With the door shut it is 4.1 m under the rail and 1.0 m outboard of the old rail line. **Why the old layout cannot do it.** With the rail where the user had it (y -5.795), the retracted door's inner face passes under the rail line; the wide lower arm (0.92 x scale across) then hangs into the door while it slides (1.5x: 0.4-0.6 m deep), and with the door open the elbow leans back into the pocket's end wall. Scale alone, other carriage schedules and the other IK branches did not fix it (`build/dra_fit_map.py`, `build/fit_map.json`). **The layout (proved by `build/dra_fit3d.py` / `dra_fit3d_proof.py` before building; `build/fit3d_proof.json`).** | means | change | why | |---|---|---| | 1 rail | the rail line moves 2.0 m inboard, from y -5.795 to y -3.800; still fixed to the deck's underside (top 0.13 m into the deck slab), still from the pocket's end wall (x -9.035) to the deck's edge at the moon pool (x -3.10 on this line; FORE mirrored about x 3.05); the user's rail boxes stay hidden | from there the arm comes at the door from above-inboard, along the face's normal, and the pulled-in door's face stays 0.3 m and more from every link; the line is clear under the deck (no lamp, lip or coaming there; the basin channel is 1.2 m further inboard) | | 2 scale | 1.6x, everything (arm, carriage, rail section, rack, chain, tray), anchored at the rail line under the deck | 1.5x does not reach the shut door's centre from the rail's inner end without the elbow opening past what its cylinder allows; 1.6x needs the smallest length change (1.5x would need +35 %) | | 3 limits | J3 (elbow) works over -29.75..+63.25 deg (was -40..+55 in the design, -25..+47 what the cylinder allowed); J1 (turret) +-185 deg (was +-170) | J3: the needed range is -24.6..+57.2 deg; J1: the FORE arm turns to 165 deg; the turret turns the whole arm, no part crosses another | | 3 drive | the J3 cylinder's upper pin (the knob at the truss tip) moves 13 % closer to J3 and turns 2 deg about it (knob_in_upper (-0.4664, -0.3696) -> (-0.4167, -0.3072) before scaling); barrel, rod and bore unchanged | a shorter lever gives the cylinder's stroke the wider J3 window above; the piston stays in its bore over the whole path (length 0.558..1.220 x scale, bore window 0.535..1.26) | | 4 lengths | the upper arm (J3 -> J4) +20 %, the forearm (J4 -> wrist centre) +20 %; the lower arm and the tools unchanged (scaled) | reach for the shut door's centre with the elbow inside its window | | attach | both versions at the door's centre; version B's plate 1.2 m square (0.070 thick), its conformal pad 1.3 m square, top 0.040 above the centre's tangent plane (the hollow face rises 27 mm at its edges, the pad is >= 12 mm everywhere); version A's knob fixture scaled 1.6x | as asked | | schedule | the carriage runs c = A + B * door x, from the rail's inner end (AFT c -3.83) with the door shut to c -5.50 with it open (B = 0.272, 1.67 m of travel); FORE mirrored | the arm takes up the rest, as before | Wrist centre to the door face: A 1.008 m, B 0.530 m. Root (turntable face) z -4.438. **The proof** (every half frame 1-120, both doors, both versions, the full arm against the ship's surroundings read from the ship file with instances, and both doors): nearest ship surface 0.45 m (B's tool, hull lining), the doors 0.32 m (B's flange, next to its own plate by design; A 0.55 m), joints >= 5.2 deg inside their limits (A's J3 when the door is open, B's J3 when it is shut), the turret 165 deg of 185. Rough boxes and a 5 cm grid: the real meshes are checked again by rig_check and the ship check after the build.