Skip to content

udonrobo/Orgy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Orgy

ベルト直動機構用計算ライブラリ

このライブラリについて

Orgyは、ベルト直動機構を用いたカタパルトロボット向けの弾道計算ライブラリです。
Teensy 4.0の演算能力を活用し、単純な数式ではなく物理シミュレーション(空気抵抗を含む数値積分)を行うことで、高精度な射出パラメータを算出します。

導入方法

  1. このページの上部にあるcodeボタンを押し、Download ZIPを選択して保存します。
  2. 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)

使用例1

// プーリー半径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)
新しい発射物を登録します。形状タイプに応じて自動的に空気抵抗係数($C_d$)と投影面積が計算されます。

  • 引数
    • 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$は抗力係数を指します。
これは「その形がどれくらい空気を切り裂きやすいか(空気抵抗を受けにくいか)」を示す数値です。 係数が大きいほど空気抵抗をまともに受けて失速しやすいです。

使用例2

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を確認するのじゃ。

その他の計算式

空気抵抗($F_d$)

$F_d = \frac{1}{2} \times (\text{空気の密度}) \times (\text{速度})^2 \times (\text{面積}) \times \mathbf{C_d}$

初速の計算(RPM → m/s)

$v_0 = \frac{RPM}{60} \times R_{gear} \times 2\pi r_{pulley}$

形状ごとの投影面積($A$)の計算

RING

$A = \pi \left( \left(\frac{d_{out}}{2}\right)^2 - \left(\frac{d_{in}}{2}\right)^2 \right)$

SPHERE

$A = \pi \left(\frac{d}{2}\right)^2$

BOX

$A = w \times h$

TETRAHEDRON

$A = \frac{\sqrt{3}}{4} d^2$

発射開始位置の補正

$x_{start} = L_{arm} \cos(\theta)$

$y_{start} = H_{robot} + L_{arm} \sin(\theta)$

弾道シミュレーション(運動方程式)

空気抵抗係数$k$の定義

$k = \frac{1}{2} \rho C_d A$

$\rho$: 空気密度 (_rho $\approx 1.225$)

ステップ毎の計算

現在の速度ベクトルを$(v_x, v_y)$、合成速度を$v = \sqrt{v_x^2 + v_y^2}$とすると、物体にかかる空気抵抗力$F_d$は:

$F_d = k v^2$

これによる加速度$(a_x, a_y)$は(重力加速度$g$を含む):

$a_x = - \frac{F_d}{m} \left( \frac{v_x}{v} \right)$

$a_y = - g - \frac{F_d}{m} \left( \frac{v_y}{v} \right)$

位置と速度の更新式(次の時刻$t+\Delta t$の値):

$v_{x(new)} = v_x + a_x \Delta t$ $v_{y(new)} = v_y + a_y \Delta t$ $x_{(new)} = x + v_{x(new)} \Delta t$ $y_{(new)} = y + v_{y(new)} \Delta t$

このループを$y < 0$(着弾)になるまで繰り返すことで、飛距離を算出しています。

About

ベルト直動機構用計算ライブラリ

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages