2016-03-13 5 views
2

Я не могу загрузить фото, поэтому я постараюсь объяснить свою проблему лучше. Я хочу, чтобы имитировать обнаружение движущегося объекта роботом типа «одноцилиндровый». Робот моделируется с положением (x, y) и направлением theta как три состояния. Препятствие представляется в виде круга радиуса r1. Я хочу, чтобы найти углы alpha_1 и alpha_2 от локальной системы координат робота к окружности, как показано здесь:Угол к касательной линии круга

Так что я делаю пытаюсь найти угол от робота к линии, соединяющего робот и центр окружности (этот угол называется aux_t в моем коде), затем найдите угол между касательной и той же линией (называемой phi_c). Наконец, я бы нашел нужные углы, добавив и вычитая phi_c из aux_t. Диаграмма Я имею в виду показано:

Проблема заключается в том, что я получаю проблемы с моим кодом, когда я пытаюсь найти углы альфа: Он начинает рассчитывать углы правильно (хотя в отрицательных значениях, не уверен, что это вызывает серьезные проблемы), но по мере приближения как автомобиля, так и цикле phi_c становится больше, чем aux_t, и один из альфов внезапно меняет свой знак. Например я получаю это:

aux_t ////// phi_c ////// alpha_1 ////// alpha_2
-0,81 ///// /+0.52//////-1.33//////-0.29

-0,74 ////// + 0.61 ////// - 1.35 ////// - 0.12

-0,69 ////// + 0,67 ////// - 1,37 ////// - 0,02

-0,64 ////// + 0. 74 ////// - 1.38 ////// + 0.1

Так что в основном, alpha_2 получает неправильную форму здесь. Я знаю, что делаю что-то неправильно, но я не уверен, что, я не знаю, как ограничить углы от 0 до пи. Есть ли лучший способ найти альфа-углы? Вот часть моего кода:

+0

это возможно потому, что 'atan2' возвращает значение' aux_t' между -pi и pi, поэтому оно меняет знак, как только он пересекает эту половину строки. –

ответ

3

Насколько ваша математика идет, единственное изменение, которое я хотел бы сделать бы вычесть(pi/2 - theta) от угла цели, а не добавлять его. Это даст вам углы в более типичной ориентации (против часовой стрелки положительный).

Я не совсем уверен, почему вы думаете, что alpha_2 неверно в данных, которые вы отправили в своем ответе. Что происходит, так это то, что ваш робот приближается к цели, а касательная линия alpha_2 фактически перемещается на другую сторону или линию, указывающую направление вашего робота. Я создал аналогичную ситуацию здесь, где метки на касательных линиях являются углом относительно робота (желтая линия), и все углы вынуждены находиться между 0 и 2 * pi.

enter image description here

Чтобы обратиться к вам вопрос о принуждении угол, чтобы быть в пределах определенного диапазона. Для этого вы захотите использовать модуль (mod в MATLAB). В этих примерах я использовал mod(theta, 2*pi), потому что технически, если ваш робот сталкивается с прочь от цели, углы могут быть больше, чем пи.

В качестве теста я выполнил простую имитацию, которая перемещает робота вокруг и показывает углы касательных по отношению к направлению робота (опять же, от 0 до 2pi)

enter image description here

Если вы действительно, чтобы ваши углы были между 0 и pi, вместо этого вы могли вместо этого использовать mod(theta, pi).

alpha_1 = mod(alpha_1, pi); 
alpha_2 = mod(alpha_2, pi); 
+0

Я очень благодарен за нашу ценную помощь. Мои сомнения были связаны с тем, что я не был (и до сих пор нет), получая то, что хочу, как поведение последнего робота, поэтому, когда я начал устранять проблемы с программами, цифры, о которых я говорил, казались мне неестественными и думали, что они могут негативно повлиять на закон о контроле. Однако, посмотрев на ваш ans поскольку это имеет большой смысл, мне не показалось, что вторая касательная линия идет к другой стороне относительно направления робота. Я бы использовал мод 2 * pi для своих альфа-углов и проверить, где еще я могу ошибиться. С уважением – Wobbler28

0

Точка находится в точке P, окружности в точке O и радиусе r. Вы хотите касательной к окружности, проходящей через Р, кал его T

Итак, мы знаем расстояние ОП, мы знаем расстояние OT, который г, и мы знаем, что угол ВОМ является прямым углом. Итак, мы используем Pythagoras для получения расстояния TP. Тогда cos theta ( угол OPT является TP/OP. Мы могли бы сэкономить шаг и рассчитать sin theta, но cos theta проще справиться, потому что он дает нам точечный продукт векторов направления PT и PO. вам не понадобится для вызова acos().

Смежные вопросы