Необходимо внести поправку в формулу для AngleChanged следующим образом:
Взять L и R за расстояния, пройденные левым и правым колесами, соответственно, за один такт.
Пусть B обозначает длину номинальной колесной базы (не длину вашей наклонной).
Пусть E представляет ошибку левого колеса. То есть расстояние, на которое левое колесо смещено вперед от идеального положения.
Мы стремимся найти θ, изменение угла колесной базы за один такт.
Сначала (предварительно) вычислите угол между перекосом колесной базы и идеальной колесной базой:
φ = арктан (E / B).
Используя некоторую элементарную геометрию (я могу опубликовать детали, если хотите), мы можем вычислить тета следующим образом:
σ = арктан ((E + L - R) / B)
θ = φ - σ
Учитывая, что это сводится к вашей предыдущей реализации, когда E = 0, и имеет интуитивно понятные результаты как E -> + inf., Наша формула кажется верной.
Примечание:
Вы, вероятно, хотите покончить с этим вычислительно-уродливым арктангенсом при вычислении σ (сигма). В подобных ситуациях обычной практикой (в действительности вы использовали ее в своих предыдущих формулах) использование приближения arctan (x) = x для малых x.
Проблема здесь заключается в том, что, хотя количество (L-R) / B, вероятно, будет довольно небольшим, ошибка добавления E / B может расти неприемлемо большой. Вы можете попробовать вычислить сигму, просто покончив с арктаном и используя сигму = (E + LR) / B, но если вы хотите лучшего приближения, вы должны использовать ряд Тейлора первого порядка для арктана (a + x) около 0:
арктан (а + х) = арктан (а) + х / (1 + а ^ 2)
Применительно к расчету сигмы приближение теперь выглядит так:
σ = арктан (E / B) + (L - R) / (B + E ^ 2 / B)
Обратите внимание, что арктан (E / B) уже был предварительно рассчитан как φ. Это гораздо лучшее приближение для сигмы, которое должно дать более точные вычисления для тета.