2016-12-05 6 views
1

부드러운 움직임으로 무언가를 만들고 싶습니다. 엘리베이터에 대해 생각해보십시오. 원하는 층에 도달하면 전속력으로 움직이지 않고 멈추지 않습니다. 가능한 한 빨리 진행되고 원하는 층에 도달 할 때까지 단계적으로 느려집니다.간편한 모션 기능 (번호 쉽게) C++

int steps = 10; 
int target = 100; 

내가 입력 루프를 필요

는 ... 그래서 기능이 이상적으로이 기능이 대단히 PID loop처럼 행동해야한다 (100)

의 목표 값에 도달하는 열 개 조치를 취할 것입니다.

필자는 본질적으로 PID 루프를 만드는 것보다 쉬운 방법이 있기를 바라고 있습니다.

+0

너무 소프트 스타트해야합니까? 이 경우 나는 S-curve https://en.wikipedia.org/wiki/S_Curve와 같은 것을 당신에게 추천 할 것입니다. – Rama

답변

2

당신이 얼마나 가까이 있는지에 따라 속도를 조정하여 PID보다 간단한 것을 할 수 있습니다. 물론 고정 된 단계 수를 사용하면 마지막 단계에서 나머지 단계로 진행해야하지만 충분히 작 으면 큰 문제가 아니어야합니다.

이 값은 각 단계에서 남은 거리의 고정 비율로만 이동하며, 속도는 속도를 줄이려는 속도에 따라 다릅니다. 귀하의 예제에서는 40 %처럼 뭔가를 할 수 있습니다

{0., 40., 64., 78.4, 87.04, 92.224, 95.3344, 97.2006, 98.3204, 98.9922} 
{0, 40, 64, 78, 87, 92, 95, 97, 98, 100} after rounding 

코드를 0에서 시작하고 내가 Iluvatar 정확히 예의를 필요로 무엇

#include <math.h> 
... 
int steps[NUM_STEPS]; 
for (int i = 0; i < NUM_STEPS - 1; i++) { 
    steps[i] = N - N * pow(.6, i); 
} 
steps[NUM_STEPS - 1] = N; 
+0

그건 정확히 내가 원하는 것입니다. 왜 내 뇌가 호의적이지 않은지 모르겠습니다. 오늘 나 한테 어떻게 쓰겠 니? 수학은 단지 내게 오지 않을 것입니다 :/ – CTOverton

+0

기본적으로'N-N * frac^i'는'frac'가 증가율입니다. – Iluvatar

+1

이것은 정말 고마워요! – CTOverton

1

일 것입니다 목표 값 N에 가기 위해. ..

#include <math.h> 
using namespace std; 

int main() 
{ 
    void smooth(int, int, float); 

    smooth(10, 100, 0.6); 

    return 0; 
} 

void smooth(int steps, int target, float increment) { 
    for (int i = 0; i < steps - 1; i++) { 
     int num = target - target * pow(increment, i); 
     cout << num << endl; 
    } 
    cout << target << endl; 
}