모션제어를 위한 Python으로 구현한 사다리꼴(Trapezoidal) 가감속 패턴 생성 알고리즘
사다리꼴 가감속 패턴은 가속 및 감속을 선형으로 증가/감소시키는 방식으로, 일정한 속도로 이동하는 구간을 포함합니다. 이는 모터나 이동 시스템에서 부드러운 동작과 정밀한 제어를 위해 널리 사용됩니다.
아래는 Python으로 사다리꼴 가감속 패턴 생성 알고리즘을 구현한 코드입니다.
알고리즘 설명
- 주요 변수:
acceleration
: 가속도.max_velocity
: 최대 속도.distance
: 이동 거리.
- 구간 나누기:
- 가속 구간: 속도가 선형으로 증가.
- 정속 구간: 속도가 일정.
- 감속 구간: 속도가 선형으로 감소.
- 계산 방법:
- 가속 구간과 감속 구간에서 이동 거리는 각각
를 이용해 계산.
- 정속 구간의 이동 거리는
.
- 가속 구간과 감속 구간에서 이동 거리는 각각
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()
코드 설명
accel_time
및accel_distance
:- 가속 구간의 시간을 계산하고, 이동 거리를 구합니다.
- 정속 구간 거리 및 시간 계산:
- 전체 이동 거리에서 가속/감속 거리 합을 뺀 값을 정속 구간 거리로 설정합니다.
- 구간별 반복:
- 가속, 정속, 감속 구간을 각각 나눠 속도와 위치를 계산합니다.
- 결과 시각화:
- 시간에 따른 속도 및 위치를 그래프로 시각화합니다.
결과 예시
- 속도 프로파일: 가속-정속-감속으로 이어지는 사다리꼴 모양.
- 위치 프로파일: 부드럽게 증가하며 최종 목표 위치에 도달.
이 코드는 다양한 이동 거리와 속도 요구사항에 따라 쉽게 조정할 수 있습니다. 추가적으로 3D 모션이나 다축 시스템에 확장할 수도 있습니다.