16326


オブジェクトを座標Aから座標Bへ、以下の条件に基づいて移動させようとしています。

・座標Aでの速度は定数Va  
・座標Bでの速度は定数Vb  
・AからBまで移動するのにかかる時間は定数T  
・AからBまでの距離は定数D

この条件下で、速度をVaからVbへスムーズに変化させながら移動させたいのですが、どうすれば特定時刻での速度を求めることができるでしょうか？  
(座標Bに到着する前に速度がVbに達していても構いません)


CC BY-SA 3.0
2015-09-06T18:18:59.623
16322
2015-09-07T14:44:39.183
12224
question
アルゴリズム
初速・最終速度・移動時間・移動距離が決まっている状況で、速度をスムーズに変化させる


「スムース」の条件は何ですか? 単に「速度が連続であれば良い」なら折れ線で良いので比較的簡単です。

下図において、影の面積が距離Dになります。

[![速度のグラフ](https://i.stack.imgur.com/2pDFT.png)](https://i.stack.imgur.com/2pDFT.png)

Va <= Vb, T・Va <= D <= T・Vb もしくは Va > Vb, T・Va >= D >= T・Vb の場合は、

D = T・Va + T1・(Vb - Va)/2 + (T - T1)・(Vb - Va) を満たすT1を求めて、

[code]

    V(t) = Va + (Vb - Va)t  (t < T1)
           Vb               (t >= T1)
    
[/code]

とします。

上の条件にあてはまらない場合は、Hidekiさんのコメントにあるように、一旦min(Va, Vb)より遅くしてからまた速くする、あるいはmax(Va,
Vb)より速くしてからまた減速する、といった操作が必要になりますが、計算は基本的に三角形と長方形の面積の組み合わせですので丁寧に場合分けしてゆけば同様に求まります。

(「スムース」の条件が「加速度が連続」だと曲線で囲まれた面積になるのでうんとややこしくなりますが、どうですか?
例えば加速度が折れ線なら、速度のグラフは二次曲線と直線を  
つなげたものになります)


CC BY-SA 3.0
2015-09-06T22:15:57.287
16326
2015-09-06T22:15:57.287
5258
16322
answer


与えられた条件で速度もなめらかに変化させたい場合、位置を3次関数で表すのが簡単だと思います。

すなわち時刻tにおける位置(初期位置からの距離)をp(t)、速度をv(t)とすると  
p(t) = At3 \+ Bt2 \+ Ct ・・・(1)  
(1)を微分して  
v(t) = 3At2 \+ 2Bt + C ・・・(2)

(1)(2)に条件を当てはめれば係数A、B、Cを求めることができます。

p(T) = D = AT3 \+ BT2 \+ CT ・・・(3)  
v(0) = Va = C ・・・(4)  
v(T) = Vb = 3AT2 \+ 2BT + C ・・・(5)

計算過程は省きますが(3)～(5)を連立して解くと、

A = -2D / T3 \+ (Va + Vb) / T2  
B = 3D / T2 \- (2Va + Vb) / T  
C = Va  
が得られます。

これを(1)、(2)に当てはめれば任意の時刻における位置と速度が求まります。

T=10、Va=10、Vb=0、D=100でExcelでプロットしてみました。

[![画像の説明をここに入力](https://i.stack.imgur.com/Fv83X.png)](https://i.stack.imgur.com/Fv83X.png)

* * *

一応題意は満たしていると思いますが、パラメータによっては途中の速度が負（つまり位置が後戻り）になります。ときには目標地点を行き過ぎて戻ることも。それでよければということで。


CC BY-SA 3.0
2015-09-07T12:16:01.313
16348
2015-09-07T14:44:39.183
2015-09-07T14:44:39.183
4765
4765
16322
answer