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

사다리꼴 가감속 패턴은 가속 및 감속을 선형으로 증가/감소시키는 방식으로, 일정한 속도로 이동하는 구간을 포함합니다. 이는 모터나 이동 시스템에서 부드러운 동작과 정밀한 제어를 위해 널리 사용됩니다.

아래는 Python으로 사다리꼴 가감속 패턴 생성 알고리즘을 구현한 코드입니다.


알고리즘 설명

  1. 주요 변수:
    • acceleration: 가속도.
    • max_velocity: 최대 속도.
    • distance: 이동 거리.
  2. 구간 나누기:
    • 가속 구간: 속도가 선형으로 증가.
    • 정속 구간: 속도가 일정.
    • 감속 구간: 속도가 선형으로 감소.
  3. 계산 방법:
    • 가속 구간과 감속 구간에서 이동 거리는 각각
      d=12at2d = \frac{1}{2} a t^2
       

      를 이용해 계산.

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

      .


Python 코드

import matplotlib.pyplot as plt
import numpy as np

def trapezoidal_profile(acceleration, max_velocity, distance, dt=0.01):
    """
    사다리꼴 가감속 패턴 생성
    :param acceleration: 가속도 (m/s^2)
    :param max_velocity: 최대 속도 (m/s)
    :param distance: 이동 거리 (m)
    :param dt: 시간 간격 (s)
    :return: 시간, 속도, 위치 리스트
    """
    # 가속 및 감속 구간에서 필요한 거리 계산
    accel_time = max_velocity / acceleration  # 가속 구간 시간
    accel_distance = 0.5 * acceleration * accel_time**2  # 가속 구간 거리

    # 정속 구간 거리 계산
    if 2 * accel_distance >= distance:
        # 정속 구간 없이 바로 감속
        accel_distance = distance / 2
        accel_time = (2 * accel_distance / acceleration)**0.5
        cruise_distance = 0
        cruise_time = 0
    else:
        cruise_distance = distance - 2 * accel_distance
        cruise_time = cruise_distance / max_velocity

    total_time = 2 * accel_time + cruise_time

    # 시간, 속도, 위치 리스트 초기화
    time = []
    velocity = []
    position = []

    current_time = 0
    current_velocity = 0
    current_position = 0

    # 가속 구간
    while current_time < accel_time:
        current_velocity = acceleration * current_time
        current_position += current_velocity * dt
        time.append(current_time)
        velocity.append(current_velocity)
        position.append(current_position)
        current_time += dt

    # 정속 구간
    while current_time < accel_time + cruise_time:
        current_velocity = max_velocity
        current_position += current_velocity * dt
        time.append(current_time)
        velocity.append(current_velocity)
        position.append(current_position)
        current_time += dt

    # 감속 구간
    while current_time < total_time:
        decel_time = current_time - (accel_time + cruise_time)
        current_velocity = max_velocity - acceleration * decel_time
        current_position += current_velocity * dt
        time.append(current_time)
        velocity.append(current_velocity)
        position.append(current_position)
        current_time += dt

    return time, velocity, position


# 테스트
acceleration = 2.0  # m/s^2
max_velocity = 5.0  # m/s
distance = 50.0     # m

time, velocity, position = trapezoidal_profile(acceleration, max_velocity, distance)

# 결과 시각화
plt.figure(figsize=(10, 5))

plt.subplot(2, 1, 1)
plt.plot(time, velocity, label="Velocity")
plt.title("Trapezoidal Velocity Profile")
plt.xlabel("Time (s)")
plt.ylabel("Velocity (m/s)")
plt.grid(True)
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(time, position, label="Position", color="orange")
plt.title("Position Profile")
plt.xlabel("Time (s)")
plt.ylabel("Position (m)")
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()

코드 설명

  1. accel_timeaccel_distance:
    • 가속 구간의 시간을 계산하고, 이동 거리를 구합니다.
  2. 정속 구간 거리 및 시간 계산:
    • 전체 이동 거리에서 가속/감속 거리 합을 뺀 값을 정속 구간 거리로 설정합니다.
  3. 구간별 반복:
    • 가속, 정속, 감속 구간을 각각 나눠 속도와 위치를 계산합니다.
  4. 결과 시각화:
    • 시간에 따른 속도 및 위치를 그래프로 시각화합니다.

결과 예시

  • 속도 프로파일: 가속-정속-감속으로 이어지는 사다리꼴 모양.
  • 위치 프로파일: 부드럽게 증가하며 최종 목표 위치에 도달.

이 코드는 다양한 이동 거리와 속도 요구사항에 따라 쉽게 조정할 수 있습니다. 추가적으로 3D 모션이나 다축 시스템에 확장할 수도 있습니다.