Як генерувати періодичні пандуси в Python за допомогою UliEngineering
UliEngineering містить модуль UliEngineering.SignalProcessing.Ramp, який можна використовувати для генерації пандусів із заданими профілями прискорення та уповільнення, а також із можливістю генерації C²-безперервних траєкторій.
Мінімальний приклад використання:
generate_ramp.py
from UliEngineering.SignalProcessing.Ramp import periodic_ramp
# Згенерувати сигнал
y = periodic_ramp(
frequency = 2.0,
samplerate=1000,
amplitude=10,
rise_time=0.1,
fall_time=0.2,
high_time=0.1,
acceleration=4000,
length=1.0,
)Детальний скрипт для побудови графіка
згенеровано за допомогою цього коду Python
plot_ramp.py
#!/usr/bin/env python3
"""
Приклад скрипта для генерації та побудови графіка періодичного пандусного сигналу за допомогою
`UliEngineering.SignalProcessing.Ramp.periodic_ramp`.
Використання:
python3 examples/ramp_example.py
Параметри дозволяють змінювати частоту дискретизації, частоту, амплітуду, часи наростання/спаду,
прискорення (злам), кількість періодів та ім'я вихідного файлу.
"""
import argparse
import numpy as np
import matplotlib.pyplot as plt
from UliEngineering.SignalProcessing.Ramp import periodic_ramp
plt.style.use("ggplot")
def main():
p = argparse.ArgumentParser(description="Згенерувати та побудувати графік періодичного пандусного сигналу")
p.add_argument('--samplerate', '-r', type=float, default=1.0, help='Вибірки за секунду')
p.add_argument('--frequency', '-f', type=float, default=1.0/15000.0, help='Частота сигналу в Гц')
p.add_argument('--amplitude', '-a', type=float, default=1.05e8, help='Розмах амплітуди (peak-to-peak)')
p.add_argument('--rise', type=float, default=3500.0, help='Час наростання (секунди)')
p.add_argument('--fall', type=float, default=3500.0, help='Час спаду (секунди)')
p.add_argument('--high', type=float, default=4000.0, help='Час утримання на високому рівні (секунди)')
p.add_argument('--acceleration', '-A', type=float, default=50.0, help='Прискорення фронтів (одиниць/с^2)')
p.add_argument('--periods', type=int, default=2, help='Кількість періодів для генерації')
p.add_argument('--outfile', '-o', default='ramp.svg', help="Ім'я файлу для збереження графіка")
args = p.parse_args()
# Обчислити загальну довжину, необхідну для генерації заданої кількості періодів
period = 1.0 / args.frequency
length = args.periods * period
# Згенерувати сигнал
y = periodic_ramp(
args.frequency,
args.samplerate,
amplitude=args.amplitude,
rise_time=args.rise,
fall_time=args.fall,
high_time=args.high,
acceleration=args.acceleration,
length=length,
)
# Вісь часу
t = np.arange(y.size) / args.samplerate
# Побудова графіка
plt.figure(figsize=(10, 4))
plt.plot(t, y, color='tab:red', linewidth=1.0)
plt.xlabel('Час [с]')
plt.ylabel('Амплітуда')
plt.title(f'Періодичний пандус (f={args.frequency:.6g} Гц, A={args.amplitude:g})')
plt.grid(True)
plt.tight_layout()
plt.savefig(args.outfile, dpi=150)
print(f"Графік збережено у {args.outfile}")
# Показати інтерактивно (якщо доступно)
try:
plt.show()
except Exception:
pass
if __name__ == '__main__':
main()Дивіться схожі статті за категоріями:
Python, UliEngineering, Data Science
Якщо ця стаття допомогла вам, будь ласка, подумайте про те, щоб купити мені каву або зробити пожертву через PayPal на підтримку досліджень та публікації нових статей на TechOverflow