Am Fri, 19 Jun 2015 13:27:47 +0600
schrieb Ilya Nemihin <
nem...@gmail.com>:
> Привет, Алексей!
>
> Спасибо за комментарии. PyGTK так же посмотрю как будет возможность.
>
> Думаю идея про аналог LinuxCNC интересная.
Там фактически есть четыре части:
1. Интерполятор шагов. (Можно сделать аппаратно на Cortex M3/M4). Эта
часть работает в почти жестком реальном времени и при реализации на
компьютере нужен LPT-порт и ядро как минимум с RT_PREEMPT. (Вариант
PCI-карты можно не рассматривать, это равноценно аппаратной
реализации). ИМХО, варианты с реализацией на компьютере тут интересны
только в случае, если компьютер - это ARM с GPIO. Математика невкусная,
но реализуемая. (Обычно эту часть переупрощают и делают неправильно,
как, например, в LinuxCNC и в большинстве контроллеров 3d-принтеров).
2. Планировщик траектории. Матан матановый. Реализация в LinuxCNC
удовлетворительная, в контроллерах 3d-принтеров никуда не годится. Есть
статьи, как делать это правильно. Хорошие реализации есть только в
дорогих фирменных станках с ЧПУ, контроллерах вроде Fanuc.
3. Интерпретатор G-кода. Средне-сложно. Реализация в LinuxCNC хорошая, в
контроллерах 3d-принтеров удовлетворительная (не полнофункциональная).
Можно сделать лучше, чем в LinuxCNC. Можно на моем компиляторе
компиляторов, когда он будет готов.
4. Графический интерфейс. Делать в последнюю очередь.
По интерполяции шагов. Имеет смысл координаты считать в шагах мотора, а
время - в тиках таймера. Тогда можно построить алгоритм типа
Брезенхема, гарантирующий "абсолютно точное" движение (в том смысле,
что в каждый момент времени отклонение реального положения от идеального
не больше 0.5 шага двигателя, а шаги происходят на тех тиках таймера,
на которых отклонение переходит через 0.5).
Теория говорит, что траектория должна планироваться с ограничениями на
скорость, ускорение и рывок (jerk, скорость изменения ускорения).
LinuxCNC ограничивать рывок как раз и не умеет. Ограничение на рывок
нужно для снижения шума, вибраций, износа и для увеличения точности на
соответствующих частях детали. Отсюда следует, что траекторию выгодно
представить в виде кусочной интерполяции полиномами (сплайнами) 3-го
порядка. Формулу для этого я уже вывел.
По планированию траектории: мы задаем максимально допустимые отклонения
от требуемого контура и максимально допустимые отклонения от требуемой
скорости. Планировщик должен найти компромисс, минимизируя получающиеся
отклонения в рамках данных ограничений на ускорение и рывок, или
сказать, что это невозможно. Например, при лазерной резке неправильно
будет тормозить до нуля на углах, а правильно будет слегка срезать
острые углы, предпочитая поддержание правильной скорости движения. То
же самое получается при гравировании - скругление на углу не так
вредно, как остановка инструмента, приводящая к "перерезу". Тут все
сложно.
Изначально я планировал доработать LinuxCNC, но потом стало ясно, что
это невозможно в силу архаичности архитектуры. После доработки от
оригинала ничего не останется, так что лучше сразу делать с нуля.
> Я ещё думаю про не очень сложные приложения, или "заготовки", например
> desktop приложение работающее с Ардуино - мигающее светодиодом,
> управляющее серво. -- чтобы человек мог сам его доработать и сделать
> своё приложение.
Это называется "библиотека". В большинстве случаев делать ничего с нуля
не надо, а надо дорабатывать имеющееся. Дело в том, что уже есть много
очень хороших по задумке вещей вроде libopencm3 для Cortex, библиотек
для устройств под Linux и т.д., многие из которых неюзабельны из-за
сырости, неотлаженности и недоработанности. Или просто от плохой
документации. Чем начинать делать свой велосипед, лучше помочь одному
из таких проектов. Это в миллион раз полезнее - работа не будет
дублироваться, усилия людей будут концентрироваться на одном и том же.