ベルト直動機構用計算ライブラリ
Orgyは、ベルト直動機構を用いたカタパルトロボット向けの弾道計算ライブラリです。
Teensy 4.0の演算能力を活用し、単純な数式ではなく物理シミュレーション(空気抵抗を含む数値積分)を行うことで、高精度な射出パラメータを算出します。
- このページの上部にある
codeボタンを押し、Download ZIPを選択して保存します。 - Arduino IDEを起動し、メニューバーの
スケッチ>ライブラリをインクルード>.ZIP形式のライブラリをインストールを選択します。 さきほどダウンロードしたファイルを選択します。
Orgy(float pulleyRadiusMm, float gearRatio, float maxRpm, float robotHeightMm, float armLengthMm)
ライブラリの初期化を行います。また、ロボットのハードウェア寸法を設定します。
- 引数
- pulleyRadiusMm(float): ベルトを駆動するプーリーの半径(mm)
- gearRatio(float): モーターとプーリー間のギア比(例: 1.0 = 直結)
- maxRpm(float): モーターの最大回転数(rpm)。計算時の探索範囲の上限になります
- robotHeightMm(float): アーム回転軸(ピボット)の地面からの高さ(mm)
- armLengthMm(float): 回転軸から発射口(マズル)までの距離(mm)
// プーリー半径20mm, ギア比1:1, 最大3000rpm, 高さ300mm, アーム長150mm
Orgy orgy(20.0, 1.0, 3000.0, 300.0, 150.0);発射する物体の形状や重さを登録します。最大10個まで登録可能です。
void initObject(String name, ShapeType type, float dim1, float dim2, float dim3, float massKg)
新しい発射物を登録します。形状タイプに応じて自動的に空気抵抗係数(
- 引数
name(String): オブジェクトの識別名(例: "Ball", "Box")type(ShapeType): 形状の種類(後述)dim1,dim2,dim3(float): 寸法(mm)。形状によって意味が異なりますmassKg(float): 質量(kg)
- 形状タイプ (ShapeType) と寸法の定義
タイプ(ShapeType) |
dim1 | dim2 | dim3 | 備考 |
|---|---|---|---|---|
| SPHERE(球) | 直径 | 0 | 0 | Cd ≈ 0.47 |
| BOX(直方体) | 幅 | 高さ | 0 | 前方投影面積を使用 Cd ≈ 1.05 |
| RING(リング) | 外径 | 内径 | 0 | 中空の円環 Cd ≈ 1.1 |
| TETRAHEDRON(正四面体) | 辺の長さ | 0 | 0 | 三角形の面投影 Cd ≈ 0.5 |
| CONE(円錐) | 底面直径 | 0 | 0 | 底面投影 Cd ≈ 0.5 |
$C_d$ は抗力係数を指します。
これは「その形がどれくらい空気を切り裂きやすいか(空気抵抗を受けにくいか)」を示す数値です。 係数が大きいほど空気抵抗をまともに受けて失速しやすいです。
orgy.initObject("CannonBall", SPHERE, 80, 0, 0, 0.5); // 直径80mm, 0.5kgの球bool changeObject(String name)
計算に使用する現在のオブジェクトを切り替えます。
- 引数:
name(String):initObjectで登録した名前。
- 戻り値:
true: 切り替え成功false: 指定された名前が見つからない
void getLaunchParams(float targetDistMm, float* outAngle, int* outRpm)
指定した距離に飛ばすために必要な「角度」と「RPM」を計算して返します。
- 引数:
targetDistMm(float): 目標地点までの水平距離(mm)outAngle(float*): 計算された角度(度)が格納されるポインタoutRpm(int*): 計算されたモーター回転数(rpm)が格納されるポインタ
- 動作:
- 現在は角度を45度に固定し、目標距離に最も近づくRPMを二分探索で求めます
float getDistance(float angleDeg, int rpm)
指定した角度とRPMで発射した場合の飛距離(到達距離)をシミュレーションします。
- 引数:
angleDeg(float): 発射角度(度)rpm(int): モーター回転数
- 戻り値:
- 飛距離(mm)
そんなもんはここにはない。さっさとexample.inoを確認するのじゃ。
現在の速度ベクトルを$(v_x, v_y)$、合成速度を$v = \sqrt{v_x^2 + v_y^2}$とすると、物体にかかる空気抵抗力$F_d$は:
これによる加速度$(a_x, a_y)$は(重力加速度$g$を含む):
位置と速度の更新式(次の時刻$t+\Delta t$の値):
このループを$y < 0$(着弾)になるまで繰り返すことで、飛距離を算出しています。