Autodesk Fusion でロボットの治具やパーツを作る Log#2 | ハコブくんの外形を Claude の指示だけで作ろうとして失敗した
Fusion を Claude から動かせる状態にしたあと、搬送ロボット「ハコブくん」の外形を作ろうとした。三面図がある。寸法も書き込んである。これを言葉で Claude に渡せば立体になるはずだった。


ならなかった。頭の部分だけで7回作り直し、それでも形にならず、最後は方法そのものを変えた。
この記録は、どこまでが指示で通り、どこから通らなかったかの境界線を残すためのもの。うまくいった部分もあるので、そこから書く。
箱を積んで穴を開けるところまでは通った
外形の骨格を作る作業は、指示を出せばそのまま通った。4回に分けて出した指示文を全量で残す。
第1回。角を丸めず、直方体を3つ積むところまで。
Fusion で搬送ロボットの外装を作ります。単位 mm。
X=幅、Y=奥行(前面が -Y 側)、Z=高さ。床は Z=0。左右前後とも原点中心。
fusion_mcp_execute で Fusion Python API のスクリプトを書いて実行してください。
今回は角を丸めず、直方体を3つ積むところまでです。
1. XY平面に 520×520 の矩形を描き、Z=80 から Z=220 まで押し出す。
ボディ名「chassis」。
2. 520×520 の矩形を Z=220 から Z=950 まで押し出す。
ボディ名「body_main」。
3. 440×400 の矩形を Z=950 から Z=1150 まで押し出す。
Y方向は +20 だけ後ろ(+Y側)へずらす。
ボディ名「head」。
終わったら、3つのボディそれぞれのバウンディングボックスを報告してください。第2回。縦のエッジだけにフィレットをかける。ここが最初の関門になると予想していた。
前回作った3つのボディの、縦方向のエッジだけにフィレットをかけてください。
エッジの選び方:
各ボディの edges を走査し、edge.geometry.objectType が
adsk.core.Line3D.classType() のものについて、
startPoint と endPoint の x の差と y の差がどちらも 0.001 未満の
ものだけを縦エッジとして集めます。
半径:
chassis = 50
body_main = 45
head = 30
ボディごとに別々のフィレット操作にしてください。
1つ失敗しても他が残るようにするためです。
各ボディで何本のエッジを拾ったかを報告してください。
chassis と body_main は4本、head も4本のはずです。
本数が違ったら実行せずに報告だけしてください。結果は3ボディとも4本ちょうど。面数が 6→10 に増え(側面4面が平面4+円筒面4に分割)、幾何的にも辻褄が合っていた。
第3回。ヘッドの上面を丸める。
head の上面を丸めてください。
面の選び方:
head.faces を走査し、face.geometry.objectType が Plane の面のうち、
法線の z 成分が 0.99 より大きいものを上面とします。
その面に接するエッジすべてに半径60のフィレットをかけてください。
拾った面の数と、フィレット後の head の高さを報告してください。
高さは 1150 のままのはずです。第4回。ディテールを7項目まとめて。
以下を順に追加してください。1つずつ実行し、都度報告してください。
【A】引き出しの前面
本体前面(Y=-260)に、幅460・高さ200(Z=750〜950)の矩形を描き、
Y方向に深さ3だけ浅くカットして溝を作る。
引き出しは開けないので、面に線が入っているだけで構いません。
【B】引き出しの取っ手
Aで作った溝の中央(X=0、Z=850)に、
幅120・高さ30・角R15 の角丸矩形を描き、深さ8でカットする。
【C】側面リング(右)
本体の右側面 X=+260 に、中心 (Y=0, Z=620)、
外径320・内径260 の同心円を描き、深さ8でカットする。
側面がフィレットで丸まっている場合は、平らな部分の中央に描いてください。
【D】側面リング(左)
Cと同じものを X=-260 に作る。
【E】ディスプレイ
head の前面(Y=-180付近)に、幅360・高さ130(Z=990〜1120)、
角R20 の角丸矩形を描き、深さ10でカットする。
【F】バンパーの溝
chassis の外周(Z=200〜250 の帯)に、深さ5の溝を全周に入れる。
【G】キャスター
直径80・高さ80の円柱を4つ、Z=0 から Z=80。
中心は (X,Y) = (180,180) (180,-180) (-180,180) (-180,-180)。
ボディ名 caster_1〜4。
全部終わったら全体のバウンディングボックスを報告してください。
520 × 520 × 1150 になっているはずです。全部通った。事前に「一番難しい」と見ていた F の全周溝(角が丸まった外周に深さ5均一)も含めて通り、外形寸法は最後まで 520 × 520 × 1150 のまま変わらなかった。
各工程の整合性の報告はこうだった。
A 溝 深さ3(除去271k mm³、フィレット部の食い込み分だけ理論値より減、正常)
B 取っ手 深さ8(理論値と完全一致)
C/D リング溝 左右とも218,655mm³で完全対称
E ディスプレイ(上端30mmはR60ブレンドに漸減で溶け込む。パネル有効平面は Z=990〜1090)
F 全周溝 深さ5均一(2段構成、理論値一致)
G キャスター4本、chassis 底面(Z=80)にちょうど接する数値を指定すれば、その通りの立体ができる。ここまでは指示だけで足りていた。
出てきたのは、角の丸い箱に穴が開いたものだった。イラストのハコブくんとは似ていない。

ここから先が長かった。
頭の断面を7回引き直した



側面図から座標を読み取り、断面の点として Claude に渡す。作らせる。見る。違う。また測る。これを7回繰り返した。各回の断面座標を全部残す。
1回目。前面が前傾しているという読み。
A (Y=+260, Z=950) … 背面・付け根
B (Y=+260, Z=1150) … 背面・上端
C (Y=-30, Z=1150) … 前面・上端
D (Y=-80, Z=950) … 前面・付け根出てきたのは前後が逆の形だった。スロープが後ろへ下っていた。
2回目。前後を直し、スロープを前へ。
A (Y=+260, Z=950)
B (Y=+260, Z=1150)
C (Y=+60, Z=1150)
D (Y=-80, Z=1020)
E (Y=-80, Z=950)C→D が水平方向140に対して垂直方向130、約43度。急すぎた。イラストの肩はもっとなだらかに下っている。
3回目。傾斜を27度まで寝かせ、頂部の平坦部を80mmに。
A (Y=+260, Z=950)
B (Y=+260, Z=1150)
C (Y=+180, Z=1150)
D (Y=-80, Z=1020)
E (Y=-80, Z=950)肩の角(C)に R100 を指定した。ここは通ったが、まだ形が違う。
4回目。Figma の図面の上に赤い長方形を置き、その長さを右パネルで読む方法で測り直した。全高に合わせた長方形が 11500 だったので、10単位 = 1mm として換算できる。
Rect 30(横・短) 754 = 75 mm 頂部の平坦部
Rect 29(前・縦) 3173 = 317 mm スロープの上下範囲
Rect 28(後・縦) 2563 = 256 mm 背面のヘッド区間
Rect 30(横・長) 5602 = 560 mm 頂部前端〜背面の水平距離スロープの着地点が Z=833。それまで Z=1020 だと思っていた。187mm ずれていた。つまりスロープは頭の領域を突き抜けて胴体の前上角まで食い込んでいる、という読みになる。
A (Y=+260, Z=950)
B (Y=+260, Z=1150)
C (Y=+185, Z=1150)
D (Y=-101, Z=950)あわせて body_main の前上角を三角形でカットし、頭のスロープと一直線にする指示も出した。
この回の報告には、実装側からこういう指摘が返ってきた。
シームの1.4°折れ — body斜面36.35° vs head 35.0°。P3 を Z=833→838.7 にすれば完全一直線。
取っ手痕 — 旧取っ手の断片がbody斜面下端(X±60)に残り、ステップ5のR60がその周りでパッチ状になっています。
R60 は入りませんでした。R16 を適用しています。幾何学的に R60 は不可能です。前面と斜面の二面角 124.99° → フィレットの後退量は 0.521 × R。R60 は前面側に 31.2mm の平面を要求。しかし溝の上端が Z=830 → 使える隙間は 8.7mm のみ。上限は R16.7。
数値の追い込みは正確だった。ただし、形そのものは依然としてイラストと違っていた。
5回目。正面図を見て、タブレットの角度が違うことに気づく。イラストのタブレットはほぼ垂直で、人の目線に正対している。看護師(立位1600)と車椅子(座位1150)の両方から見えることが要件なのだから、当然そうなる。
「頭のスロープ」と「タブレットが載る面」を同じ面にしていた。イラストでは別の面だった。
A (Y=+260, Z=950)
B (Y=+260, Z=1150)
C (Y=+40, Z=1150)
D (Y=-170, Z=1090)
E (Y=-180, Z=950)D→E がタブレット面(垂直から約4度後傾)、C→D が天面(前下がり約16度)。
このとき、実行前に面の向きを検証させる手順を入れた。
【2 検証 ← 実行前に必ず】
押し出し後、D-E を含む面の法線を取得して報告。
Y 成分が −0.99 より小さい(ほぼ真正面を向く)こと。
Z 成分の絶対値が 0.1 未満(ほぼ水平を向く)こと。
条件を満たさない場合、ここで停止して報告してください。6回目。正面図から、頭が胴体より細いことを読み取る。頭の幅は胴体の78%。520に対して405mm。
7回目。再度 Figma で測り直し、頭の付け根が Z=826 であることを確定。それまで Z=950 で作らせていた。124mm 違っていた。前面は胴体とツライチ(Y=−260)。
A (Y=+260, Z=826)
B (Y=+260, Z=1150)
C (Y=-181, Z=1150)
D (Y=-260, Z=1070)
E (Y=-260, Z=826)ここまでやって、まだ形が合わない。
体積の検算は7回とも通っていた
7回のあいだ、実装側の報告はほぼ毎回こうだった。
体積27,720,000 = 理論値ぴったり
除去371,653 = 理論値完全一致
C/D リング溝 左右とも218,655mm³で完全対称
除去体積 4,510,522 mm³ は数値積分の理論値と 0.00% 一致数値検証は全部通っている。それでも形が違う。
理由は、体積の検算が「指示通りに作れたか」しか見ていないからだ。「指示の元になった読み取りが正しいか」は検証範囲の外にある。座標を間違えて渡せば、間違えた通りに正確に作られ、正確に検算が通る。
途中で法線の向きを検証させる手順を追加したのは、この穴を塞ぐためだった。実際、向きの取り違えは1回で止められるようになった。ただし「向きは合っているが位置が124mm違う」といった誤りは、この手順では捕まえられない。
検算は自分の外側にある前提を検証できない。
指示だけで通ること、通らないこと
7回やって見えた境界線はこうなる。
作業 | 指示だけで通るか |
|---|---|
直方体を積む | 通る |
特定のエッジ群を選んでフィレット | 通る |
面の法線で対象を選ぶ | 通る |
穴・溝・リングを彫る | 通る |
フィレット半径の幾何的な上限を計算する | 通る |
除去体積を理論値と突き合わせる | 通る |
図から曲面のシルエットを起こす | 通らない |
上の6つは、寸法が数値として与えられている作業だ。下の1つだけが、絵から数値を作る作業になっている。
そして数値を作る工程は、この日ずっと人がやっていた。図面を見て座標を読み、言葉にして渡す。この経路が、情報がいちばん落ちる経路だった。
方法を変える
7回目の途中で、Fusion のキャンバス機能に切り替えた。画像を平面に貼り、既知の1辺で縮尺を合わせ、その上をなぞってスケッチを引く。図面から立体を起こすときの標準的なやり方で、座標を言葉で渡す必要がなくなる。
Log#1 のセットアップの時点でこの選択肢は把握していた。それでも全部を数値で渡そうとしていた。「Claude に指示すれば作れる」という前提を、途中で疑わなかったことになる。
キャンバスの配置は API で行った。一度目は「配置成功」と報告されたのに画面に何も出ず、実態を確認する手順を入れ直した。
【0 現状確認】
まず以下を報告してください。推測ではなく API から取得した実値で。
- rootComponent.canvases.count
- 各キャンバスの name / isVisible / opacity / isLightBulbOn
- 各キャンバスの transform(Matrix3D)の translation 成分
- 各キャンバスの boundingBox の minPoint と maxPoint
【1 全削除】
既存のキャンバスをすべて削除。count が 0 になったことを報告。
ref_side / ref_front / ボディは残す。
【2 1枚だけ作成してテスト】
hakobu_side.png のみを YZ 平面に配置してください。
canvases.add() を使い、
- 第1引数: 画像のフルパス(~ を展開した絶対パス)
- 第2引数: YZ 平面(rootComponent.yZConstructionPlane)
作成後、必ず以下を確認して報告:
- canvas.isValid が True か
- canvas.boundingBox.minPoint / maxPoint の実値
- canvas.isLightBulbOn が True か
- canvas.opacity の値
boundingBox が原点付近(各成分の絶対値が 5000mm 以内)に
無い場合は、そこで停止して報告してください。
【3 サイズと位置の調整】
boundingBox が原点付近にある場合、画像の高さが 1150mm 前後に
なるようスケールを調整してください。
canvas.transform に Matrix3D を設定し、setToScale または
setCell でスケール成分を変更します。
変更後は必ず canvas.transform = matrix で書き戻すこと
(プロパティを直接いじっても反映されません)。
調整後の boundingBox を報告。
Z 方向の範囲が 0〜1150 に近い値になっていること。
【4 opacity】
canvas.opacity = 0.5 に設定。
ここまで1枚が確実に表示される状態になってから、
front と back の2枚を同じ手順で追加します。
1枚目が確認できるまで残り2枚は作らないでください。1枚ずつ確認しながら進める形にして、3枚とも乗った。
画像を歪ませようとして止められた
縮尺合わせの過程で、横方向だけを縮める補正を提案した。側面図の車体幅が実寸と合わないので、横だけ 0.6828 倍する、という内容だった。
止められた。
画像は元のアスペクト比変更したら絶対ダメだよ!
その通りだった。キャンバスは下絵で、なぞるための元絵になる。歪めたら、なぞった線が全部おかしくなる。
そして、この一言で問題の性質が変わった。画像を歪めずに実寸と合わないなら、どちらかの寸法が間違っている。画像を加工して辻褄を合わせる話ではなく、どの数値を正とするかを決める話だった。
7回合わなかった本当の理由
画像を等比のまま、高さ1150だけを基準にして残りを計算した。
側面図(1568 × 2213 px)。
車体上端 y=152 / 下端 y=2085 → 車体高 1933 px
スケール = 1150 / 1933 = 0.594930 mm/px
車体前端 x=155 / 後端 x=1435 → 車体幅 1280 px
奥行 = 1280 × 0.594930 = 761.5 mm正面図(1568 × 2493 px)。
車体上端 y=145 / 下端 y=2350 → 車体高 2205 px
スケール = 1150 / 2205 = 0.521542 mm/pxFusion 上でキャンバスを等比のまま高さ1150に合わせ、車体の左端をクリックすると X = −302 と出た。全幅は約604mm。
三面図に書かれた「520 mm」とは合わない。
図 | 幅 | 奥行 | 高さ |
|---|---|---|---|
正面図から算出 | 604 | — | 1150 |
側面図から算出 | — | 761 | 1150 |
三面図に書かれた数値 | 520 | 520 | 1150 |
高さ1150だけが3者で一致する。幅と奥行は、イラストと数値が食い違っている。
7回とも、520を正しいと信じて座標を計算していた。どう測っても合うはずがなかった。毎回「読み取りを間違えた」と判断して測り直していたが、間違っていたのは読み取りではなく、参照していた数値のほうだった。
数値で渡している限り、この食い違いは「測り間違い」に見え続ける。図面を実寸座標の上に置いて初めて、図面のほうが数値と合っていないことが目に見える形になった。
寸法を決め直す
どちらを正とするかを決める根拠は、それぞれの数値の出どころにある。
高さ1150には根拠がある。車椅子に座った人の目線高が1150mm、看護師が手を伸ばす作業高が750mm。この2つを満たす位置に画面とトレイを置くために決まった値だ。
幅520の根拠は、どこにもなかった。上面図に「520 mm」と2回書かれているが、幅の数値を奥行にもコピーした転記に見える。しかも上面図のイラスト自体は明らかに縦長で、正方形には描かれていない。
イラストのプロポーションを正として、寸法を確定した。
全幅 624 mm
奥行 768 mm
全高 1150 mm
通路での検証も通る。
項目 | 値 |
|---|---|
通路幅 | 2000 |
ハコブくん幅 | 624 |
ストレッチャー幅 | 600 |
並んだときの残り | 776 |
必要な安全余裕 | 400 |
すれ違い成立。エレベーター(寝台用の標準的な内寸 1400 × 2400 程度)にも入る。
引き出しのストロークが停止位置を決める
この日、寸法の食い違いとは別に、ひとつ設計上の発見があった。
引き出しのストロークを測ると 274mm。奥行の約半分にあたる。実物のスライドレールが 250 / 300 / 350 のような刻みで売られていることもあり、280mm で決めた。
引き出しが 280mm 出るということは、トレイの手前端が本体前面から 280mm の位置にあるということ。
本体中心 ──┬── 本体前面
└── + 280 mm ──┤ トレイ手前端看護師はこのトレイに手を届かせる必要がある。人が楽に手を伸ばせる距離を 400mm とすると、立ち位置が決まる。つまりロボットが人の何mm手前で止まるべきかが、引き出しのストロークから逆算できる。
逆に、引き出しを 150mm しか出さない設計にすると、看護師はロボットにその分近づく必要が出る。引き出しのストロークは見た目の話ではなく、停止位置の話だった。
受け渡しシリーズで mechArm を相手にやっていることと同じ構造をしている。「どこまで出すか」が「どこで止まるか」を決める。
次に確かめること
キャンバスの上を実際になぞって、外形の輪郭を閉じたスケッチにする
押し出して、正面図で幅方向を削り込む
既存のボディ(520 × 520 前提で作ったもの)を削除する
引き出しストローク280mmを新しい寸法に合わせて再計算する
既存のボディは全部作り直しになる。ただしタイムラインが連鎖破損する可能性があるので、新しい形ができてから削除する。
なぞる作業は人の手になる。Claude は Fusion 内の形状は読めるが、貼り付けた画像は見えないためだ。指示で通る範囲は、なぞって輪郭が閉じた後から再開する。
