本文へ移動
BenriWorks Lab

開発記事公開日

支持多角形でクレーンの転倒を判定する

白いヘルメットをかぶった女性エンジニアが、クレーンの3Dモデルを映した大型モニタの横に立っている

クレーン安全シミュレーターで、支持多角形と安定余裕から転倒の危険を判定し、アウトリガーの張出しが効く理由を体感できるようにした実装を紹介します

クレーンはなぜ、アウトリガーを張り出すと倒れにくくなるのでしょうか。力学の教科書なら、接地点を結んだ多角形の内側に重心の真下が収まっていれば倒れない、という一枚の絵で答えるところです。絵としては簡単です。ただ、絵を知っていることと、レバーを倒した先にある転倒の気配を感じ取れることは別の話です。教育用のクレーン安全シミュレーターの開発では、この絵をそのまま画面上の判定にして、張り出しの効き目を操作の結果として返すことを目指しました。この記事では、接地点から多角形を組み立て、余裕を数値化して危険を段階表示し、余裕が尽きたら実際に倒すまでの実装を紹介します。

接地点が作る二つの矩形

判定の土台は支持多角形です。機体が地面と接している点を結んでできる多角形で、機体を倒そうとする力と支えようとする力のせめぎ合いは、すべてこの多角形の辺の上で起きます。本アプリの既定機は2tクラスの積載形クレーンで、接地状態は二通りしかありません。タイヤで立っているか、アウトリガーのジャッキで立っているかです。

export function getSupportPolygon(spec: CraneSpec, mode: OutriggerMode): SupportPoint[] {
  const padsDown = mode === 'MID' || mode === 'MAX';
  if (!padsDown) {
    // タイヤ接地: 前輪 x=-2.35 〜 後輪 x=2.45、トレッド半幅 1.15m
    const hz = 1.15;
    return [
      { x: -2.35, z: -hz },
      { x: 2.45, z: -hz },
      { x: 2.45, z: hz },
      { x: -2.35, z: hz },
    ];
  }
  // ジャッキ接地: 前側ジャッキ x=-1.6(キャブ直後)、後側 x=2.5
  const hz = spec.outriggers.spreadsM[mode] / 2;
  return [
    { x: -1.6, z: -hz },
    { x: 2.5, z: -hz },
    { x: 2.5, z: hz },
    { x: -1.6, z: hz },
  ];
}

タイヤ接地の矩形は横幅2.3mです。ジャッキを最大に張り出すと横幅は3.4mになり、1.5倍近く広がります。一方で前側のジャッキはキャブの直後に付いているので、前後方向はタイヤの矩形よりむしろ短くなります。広がるのは横だけ、しかも前後は非対称。この形の非対称は、ブームを側方へ向けたときと後方へ向けたときで余裕の値が変わる、という差になって計算結果に現れます。

なお、張り出し最小のモードはジャッキが接地していない状態とみなし、タイヤの矩形をそのまま使う簡略化にしています。ジャッキを浮かせたまま吊る危険な状態と、張り出し不足の状態を、判定の上では同じ「狭い矩形」として扱う割り切りです。

クレーンを上から見た支持多角形の比較図。タイヤ接地では前輪x=−2.35から後輪x=2.45、半幅1.15 mの細長い矩形になり、ジャッキを最大に張り出すと前ジャッキx=−1.6から後ジャッキx=2.5、半幅1.75 mの幅の広い矩形になる
接地のしかたで支える多角形が変わる。張り出すほど横方向の辺が外へ動く

重心の投影と辺回りのモーメント

最初の設計では、教科書の絵をそのまま実装するつもりでした。車体、旋回体、カウンタウェイト、ブームの重さから合成重心を求め、その鉛直投影が支持多角形の内側にあるかを判定する。静止した自重だけが相手なら、それで足ります。

ところが、このシミュレーターの吊り荷は静止していません。荷は物理エンジンのケーブルで吊られていて、ブーム先端が受ける張力は、荷振れやショック荷重で毎フレーム向きも大きさも変わるベクトルです(張力計算の中身は「物理エンジンでクレーンの荷振れとワイヤー破断を表現する」で紹介しています)。さらにブーム自体が風も受けます。水平方向の力は重心の鉛直投影を少しも動かさないのに、機体を倒す働きをします。重心の内外判定だけでは、この二つを扱えません。

そこで判定は、支持多角形の辺ごとのモーメント集計にしました。各辺を転倒の回転軸とみなし、すべての作用力のモーメントを「外へ倒す側」と「内に留める側」に振り分けて、余裕を比で表します。

let tipMoment = 0;
let stabMoment = 0;
for (const { pos, forceN } of forces) {
  const rx = pos.x - p1.x;
  const ry = pos.y;
  const rz = pos.z - p1.z;
  // 辺方向の回転軸 a 回りのモーメント成分 (r × F)・a
  const mx = ry * forceN.z - rz * forceN.y;
  const my = rz * forceN.x - rx * forceN.z;
  const mz = rx * forceN.y - ry * forceN.x;
  const m = mx * ax + my * ay + mz * az;
  if (m > 0) tipMoment += m; // 外へ倒す側
  else stabMoment += -m; // 内に留める側
}
const margin = stabMoment > 1e-9 ? (stabMoment - tipMoment) / stabMoment : -1;

余裕度は、復元モーメントに転倒モーメントがどれだけ食い込んでいるかの割合です。1なら倒す力がゼロ、0でちょうど釣り合い、負なら静的に転倒が始まる条件になります。下向きの力しか働いていなければ、この符号は重心投影の内外判定と一致するので、教科書の絵を含んだまま横向きの力まで同じ枠組みで扱えます。作用力として積むのは、車体、旋回体、カウンタウェイト(ブームと反対側へ1.3mオフセット)、長さに比例するブームの自重、ブーム先端のケーブル反力、そしてブームが受ける風の合力です。吊り荷が受ける風はすでにケーブル張力に現れているため、ブーム自身の受風だけを足して二重計上を避けています。矩形4辺それぞれの余裕度のうち最小値を、このアプリでは安定余裕と呼んで画面に出します。

転倒判定の考え方の図。支持多角形の各辺を回転軸として、車体・旋回体・カウンタウェイト・ブーム自重・ケーブル反力・ブームの受風のモーメントを外へ倒す側と内に留める側に振り分け、安定余裕を復元モーメントから転倒モーメントを引いて復元で割った比として表す
重心の内外判定では横向きの力を扱えないため、辺ごとのモーメント集計にした

危険の段階表示と警告の猶予

では、その数値をどう見せれば「危ない」が伝わるのでしょうか。安定余裕はHUDに百分率で常時表示していて、35%を切ると黄色、15%を切ると赤になります。ただ、色が変わるだけでは足りないと考えました。レバーを握っている人は、計器の数字を読み続けてはいられません。そこで低余裕の状態が続くと機体が警告状態に入り、表示が点滅し、周囲にいる作業員の3Dモデルが退避を始めます。自分の操作で人が逃げ出す。数字が読めていなくても状況の変化が目に入るようにした演出です。

この状態遷移には三つの時間定数を挟んでいます。

const WARNING_MARGIN = 0.15;
// 転倒警告バナーを視認できるよう、余裕度が負になってから転倒開始まで猶予を持たせる
const TRIGGER_HOLD_SEC = 1.0;
// 警告は余裕低下がこの時間続いてから出す(玉掛け時など単発フレームの
// 数値スパイクで誤警告・作業員退避が起きるのを防ぐ)
const WARNING_HOLD_SEC = 0.35;

警告前の0.35秒は誤警告対策です。玉掛けの瞬間などに張力が単発フレームで跳ね、余裕度が一瞬だけ落ちることがあり、そのたびに作業員が退避していては教材として成立しません。警告の解除も、余裕が20%まで戻ってからにして、しきい値の境界で点滅が往復するのを避けています。そして余裕が負になっても、すぐには倒しません。1.0秒の猶予は力学から出てきた値ではなく、転倒警告のバナーを視認してから倒れてほしいという教材側の都合です。

余裕が尽きたあとの転倒表現

警告が出ても巻き上げをやめなければ、いよいよ倒れます。通常時のクレーンはレバー入力どおりに動かすキネマティックな表示で、物理エンジン側には固定の当たり判定しか置いていません。余裕度が負のまま1秒たった瞬間に、そのときの姿勢と同じ形の動的な剛体(車体、旋回体、カウンタウェイト、2分割したブームの複合体)を組み立てて初速ゼロで解放し、以後は重力とケーブル張力に任せます。倒れる条件だけをこちらで判定し、倒れ方は演出せず物理エンジンに渡す分担です。転倒後は速度がほぼゼロの状態が一定時間続いた時点で転倒完了とみなし、事故レポートを表示します。

転倒シナリオは、この判定が確実に発火する初期条件として設計しました。アウトリガー最小張り出しのまま過負荷防止装置を解除し、旋回316度、起伏29.8度の大きな作業半径で、2.8tのコンクリートブロックに玉掛けした状態から始まります。自動スクリプトはまずワイヤーを巻き下げてたるませ、張力計の値が落ちるのを見せてから巻き上げます。荷重がブームに乗った約1秒後に安定余裕が尽き、機体ごと倒れます。風の水平力で発生時刻がずれないよう、このシナリオの天候は晴れに固定しました。

張り出しの差は、単体テストでも性質として固定してあります。同じ姿勢で同じ2.8tを吊っても、タイヤ接地の矩形では余裕度が負になり、最大張り出しの余裕度はそれを上回る。定格内の400kgなら最大張り出しで余裕が残る。前後のジャッキ位置が非対称なので、側方吊りと後方吊りでは値が一致しない。多角形が広がれば同じ荷でも余裕が増えるという教科書の一文が、そのまま実行可能なテストになりました。

ヘルメットをかぶった男性エンジニアが手を広げて説明しているイラスト。左に「転倒は辺の上で起きる 支持多角形と安定余裕で危険を測る」というキャッチコピーが入っている
倒す力と支える力のせめぎ合いは、支持多角形の辺の上で起きる

教材としての限界と体験できること

断っておくと、この判定は教育用の簡略化モデルです。地盤の耐力もジャッキの沈下も車体のたわみも扱っておらず、実際のクレーン作業の可否をこの計算で判断することはできません。実作業はメーカーの定格荷重表と過負荷防止装置、有資格者の判断に従うものです。

その限界の内側でなら、支持多角形は冒頭の問いへの手応えのある答えになってくれます。張り出しを変えて同じ荷を吊り、安定余裕の数字と警告の出方が変わるのを確かめる。教科書の絵が、レバー操作に反応して動く。この体験は「移動式クレーン安全シミュレーター」の転倒シナリオで試せます。支持多角形の手前にある地盤側の条件をどう教材化するかは、まだ手つかずの宿題です。

関連アプリ

こんな記事も読まれています