я тут подумал, а ведь люфтом управляет не планировщик(который пересчитывает траекторию не в реалтайме, а через сколько то строк кода), а сам компонент motion. то есть можно попробовать напрямую задавать значение joint.backlash-corr как функцию от скорости(например через scale), и она будет меняться каждый период в реалтайме, и это будет точнее, чем выбор между дискретными значениями задержки, которые относительно большие в этом случае!)
ну и можно саму команду joint.pos-cmd смещать офсетом так же пропорциональным скорости, без установки backlash. Мне кажется это идеальный вариант, при чем регулируемый на ходу очень точно.
https://linuxcnc.org/docs/html/man/man9/offset.9.html
то есть вставляем офсет между
net x-pos-cmd joint.0.motor-pos-cmd => offset => arisc.pwm.0.pos-cmd
Код: Выделить всё
loadrt scale names=scale.x,scale.y
loadrt offset names=offset.x,offset.y
# добавление функций к потоку, в данном случае, надо делать в определенном порядке,
# чтобы сначала считалась скорректированная позиция, а потом уже отправлялась в arisc
#↑↑↑ addf motion-controller
addf scale.x servo-thread
addf scale.y servo-thread
addf offset.x.update-output servo-thread
addf offset.x.update-feedback servo-thread
addf offset.y.update-output servo-thread
addf offset.y.update-feedback servo-thread
#↓↓↓ addf arisc..write
net x-pos-cmd <= joint.0.motor-pos-cmd
net x-pos-fb <= arisc.pwm.0.pos-fb
#x-offset-ratio (offset = vel-cmd * ratio)
setp scale.x.in 0.001
net x-vel-cmd joint.0.vel-cmd => scale.x.gain
net x-offset scale.x.out => offset.x.offset
net x-pos-cmd => offset.x.in
net x-pos-fb => offset.x.fb-in
net x-new-pos-cmd offset.x.out => arisc.pwm.0.pos-cmd
net x-new-pos-fb offset.x.fb-out => joint.0.motor-pos-fb