모션제어를 위한 C로 구현한 사다리꼴(Trapezoidal) 가감속 패턴 생성 알고리즘

C 언어로 Trapezoidal 가감속 알고리즘을 구현한 코드입니다. 이 코드는 일정한 가속, 정속, 감속 구간으로 구성된 가감속 패턴을 생성하며, 이동 거리와 속도 제어가 필요한 시스템에 적용 가능합니다.


알고리즘 설명

  1. 주요 변수:
    • acceleration: 가속도.
    • max_velocity: 최대 속도.
    • distance: 총 이동 거리.
    • dt: 시간 간격.
  2. 구간 나누기:
    • 가속 구간: 속도가 선형적으로 증가.
    • 정속 구간: 최대 속도로 일정하게 이동.
    • 감속 구간: 속도가 선형적으로 감소.
  3. 구간별 거리 및 시간 계산:
    • 가속/감속 구간에서 이동 거리는
      d=12at2d = \frac{1}{2} a t^2
       

      .

    • 정속 구간 이동 거리는
      d=vtd = v \cdot t
       

      .


C 코드

#include <stdio.h>
#include <math.h>

// Trapezoidal 프로파일 생성 함수
void trapezoidal_profile(float acceleration, float max_velocity, float distance, float dt) {
    // 가속 및 감속 구간 거리 계산
    float accel_time = max_velocity / acceleration;  // 가속 구간 시간
    float accel_distance = 0.5 * acceleration * pow(accel_time, 2);  // 가속 구간 거리

    float cruise_distance = distance - 2 * accel_distance;  // 정속 구간 거리
    float cruise_time = 0.0;

    // 정속 구간이 없는 경우 처리
    if (cruise_distance < 0) {
        accel_distance = distance / 2.0;
        accel_time = sqrt(2 * accel_distance / acceleration);
        cruise_distance = 0;
        cruise_time = 0;
    } else {
        cruise_time = cruise_distance / max_velocity;
    }

    float total_time = 2 * accel_time + cruise_time;

    // 출력 변수 초기화
    float time = 0.0;
    float velocity = 0.0;
    float position = 0.0;

    printf("Time\tVelocity\tPosition\n");

    // 가속 구간
    while (time < accel_time) {
        velocity = acceleration * time;
        position += velocity * dt;
        printf("%.2f\t%.2f\t\t%.2f\n", time, velocity, position);
        time += dt;
    }

    // 정속 구간
    while (time < accel_time + cruise_time) {
        velocity = max_velocity;
        position += velocity * dt;
        printf("%.2f\t%.2f\t\t%.2f\n", time, velocity, position);
        time += dt;
    }

    // 감속 구간
    while (time < total_time) {
        float decel_time = time - (accel_time + cruise_time);
        velocity = max_velocity - acceleration * decel_time;
        position += velocity * dt;
        printf("%.2f\t%.2f\t\t%.2f\n", time, velocity, position);
        time += dt;
    }
}

int main() {
    // Trapezoidal 프로파일 파라미터
    float acceleration = 2.0;  // m/s^2
    float max_velocity = 5.0;  // m/s
    float distance = 50.0;     // m
    float dt = 0.1;            // 시간 간격 (s)

    trapezoidal_profile(acceleration, max_velocity, distance, dt);

    return 0;
}

코드 설명

  1. trapezoidal_profile 함수:
    • 가속, 정속, 감속 구간의 거리를 계산합니다.
    • 시간 간격(dt)에 따라 속도와 위치를 업데이트하며 결과를 출력합니다.
  2. 가속 및 감속 처리:
    • 가속 구간에서
      v=atv = a \cdot t
       

      를 사용해 속도를 증가시킵니다.

    • 감속 구간에서는
      v=vmaxatv = v_{max} – a \cdot t
       

      를 사용해 속도를 감소시킵니다.

  3. 정속 구간 처리:
    • 최대 속도
      vmaxv_{max}
       

      로 이동하며 위치를 업데이트합니다.

  4. 출력:
    • 각 시간 단계별로 Time, Velocity, Position을 출력하여 프로파일을 확인할 수 있습니다.

출력 예시

입력 파라미터:

  • 가속도 = 2.0 m/s²
  • 최대 속도 = 5.0 m/s
  • 총 이동 거리 = 50.0 m
  • 시간 간격 = 0.1 s

출력 결과:

Time	Velocity	Position
0.00	0.00		0.00
0.10	0.20		0.02
0.20	0.40		0.06
0.30	0.60		0.12
0.40	0.80		0.20
...
5.80	3.60		45.92
5.90	3.40		46.24
6.00	3.20		46.52
...

코드의 특징

  1. 정확성:
    • 가속, 정속, 감속 구간을 정밀하게 계산합니다.
  2. 유연성:
    • acceleration, max_velocity, distance를 조정하여 다양한 시뮬레이션 가능.
  3. 확장성:
    • 추가적으로 S-Curve와 같은 고급 프로파일을 결합하거나 실시간 시스템에 적용 가능.

이 코드는 모터 제어, 물류 시스템, 또는 로봇 공학에서 부드럽고 효율적인 동작을 설계하는 데 사용할 수 있습니다.