|
Приведение в полярных координатах |
|
|
|
Jul 19 2012, 12:30
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926

|
Здравствуйте, есть такая задача: Начальные условия: Два орудия направлены в одну точку на расстоянии N метров от линии их стояния. Известны углы, на которые повернуты оба орудия. Расстояния N, расстояние между точками стояния орудий не известны и не могут быть введены в систему оператором орудий. Таких точек можно получить несколько на этапе настройки.
Задача: В "рабочем" режиме дно из орудий постоянно поворачивается и сообщает свои координаты по каналу связи (является ведущим). Необходимо перемещать ведомое орудие так, чтобы точка пересечения осей стволов обоих орудий (точка, в которую смотрят оба ствола) перемещалась по линии, параллельной линии стояния орудий и находящейся на расстоянии N метров от линии стояния.
Беда в том, что вычислительные возможности системы управления ведомым, реализованной на 8-бит микроконтроллере, очень скудны (она к тому же еще кучу функций выполняет). Подскажите, как лучше решить задачу, сэкономив вычислительные ресурсы.
Надеюсь, не запутал. Спасибо!
Сообщение отредактировал Misile_Inc - Jul 19 2012, 13:58
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 23)
|
Jul 19 2012, 14:19
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926

|
Попробую нарисовать. Вот. Известно несколько пар (a;b). Далее по введенному a надо найти b. Пары углов получаем вручную при установке оборудования. При следующем включении взаимное расположение оборудования может измениться. Расстояние до целевой линии тоже Вот иллюстрация второй задачи.
Сообщение отредактировал Misile_Inc - Jul 19 2012, 14:32
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 19 2012, 14:28
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Misile_Inc @ Jul 19 2012, 18:19)  Попробую нарисовать. А где N? Цитата(Misile_Inc @ Jul 19 2012, 18:19)  Вот. Известно несколько пар (a;b). Далее по введенному b надо найти a. Так кто ведущий, а кто ведомый?
|
|
|
|
|
Jul 19 2012, 14:33
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926

|
Цитата(Tanya @ Jul 19 2012, 18:27)  А где N? N- расстояние между черными параллельными линиями в первой задаче (которые соединены цветными лучами). Но оно не известно, как говорилось выше. Известны только пары углов (a;b). Цитата(Tanya @ Jul 19 2012, 18:28)  Так кто ведущий, а кто ведомый? Поправил. Но ведь это не существенно для решения задачи.
|
|
|
|
|
Jul 19 2012, 16:31
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Я бы делал "в лоб" - при включении инициализация, нахождение текущего (на данный сеанс работы) N - аналитически по тригонометрии (должно решаться тривиально), в железе - по таблично заданной функции. А далее просто - b является при известном N функцией от a, аналитически она выразится через какую-то тригонометрию, эту функцию в виде таблицы закладываете хоть в ведущего хоть в ведомого (у кого ресурсов больше), вычисляете b. Если нужна точность - интерполируете эту таблично заданную функцию до нужной степени точности на этапе расчета b. Повторюсь что сам расчет можно вести хоть в ведущем, хоть в ведомом, хоть половину там и там. Для случая прямой уравнение связи параметров такое: ctg(a) + ctg(  = M/N, где M - расстояние между орудиями (5-й класс средней школы). При стартовой привязке по нескольким парам углов вычисляете поточнее ваше значение M/N для данной конфигурации, запоминаете его и все. Расчет угла ведомого: считаете (по таблице с интерполяцией) котангенс угла ведущего, вычитаете его из имеющегося параметра M/N и берете арккотангенс результата (по таблице с интерполяцией). Для других случаев просто будут другие уравнения связи параметров. И можно рисовать любые фигуры, которые луч ведущего пересекает только один раз при любом своем угле.
|
|
|
|
|
Jul 20 2012, 10:47
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Пожалуйста  Кстати, для случая окружности с центром в одном из орудий уравнение выглядит так: Код ctg(b) = (M/R - cos(a))/sin(a) M/R аналогично находите из первых привязок, далее по a получаете b через пару табличных функций (для sin и cos одна таблица четверти периода). Только пара моментов: 1) если решать относительно a (с центром в ведомом), то придется численно решить вышеприведенное уравнение относительно a, что немного сложнее 2) нули синуса (как теоретические так и машинные) = бесконечность котангенса и, как следствие, +- нулевой угол, обойдете при реализации самостоятельно, это просто.
|
|
|
|
|
Aug 15 2012, 20:34
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Поставил Матлаб, нравится, балуюсь  Для линии: CODE M = 5; N = 3;
x_i = zeros(1, 2); x_i(2) = M; y_i = zeros(1, 2); x = 0; y = 0; al_eps = 0.01*pi; al = al_eps; while al <= (pi - al_eps) be = acot(M/N - cot(al)); % if be < 0 be = be + pi; end k1 = tan(al); k2 = -tan(be); x0 = k2*M/(k2 - k1); x = [x x0]; y = [y x0*k1]; al = al + 0.001*pi; end x(1) = []; y(1) = [];
figure(1) clf reset p_y_i = plot(x_i, y_i, 'or'); set(p_y_i,'LineWidth', 4); title('Линия на расстоянии 3 от линии ведущий - ведомый') xlabel('Ведущий: 0, ведомый: 5') text(1, -2, 'A') text(x_i(2) + 1, -2, 'B') hold on plot(x, y, '-x') hold off grid on axis equal
Для окружности: CODE M = -2; N = 3;
x_i = zeros(1, 2); x_i(2) = M; y_i = zeros(1, 2); x = 0; y = 0; al = 0; while al <= 2*pi be = acot( (M/N - cos(al)) / sin(al) ); % if be < 0 be = be + pi; end k1 = tan(al); k2 = -tan(be); x0 = k2*M/(k2 - k1); x = [x x0]; y = [y x0*k1]; al = al + 0.001*pi; end x(1) = []; y(1) = [];
figure(1) clf reset p_y_i = plot(x_i, y_i, 'or'); set(p_y_i,'LineWidth', 4); title('Окружность радиуса 3 с центром в ведущем') xlabel('Ведущий: 0, ведомый: -2') text(0.1, -0.2, 'A') text(x_i(2) + 0.1, -0.2, 'B') hold on plot(x, y, '-x') hold off grid on axis equal
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 15 2012, 21:57
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
UPD все-таки непривычно мыслить многомерными векторами.... Вот так получше будет, методически правильнее  CODE M = 5; N = 3; al = 0.01*pi:0.001*pi:(pi - 0.01*pi); be = acot(M./N - cot(al)); x = -tan(be).*M./(-tan(be) - tan(al)); y = x.*tan(al);
clf reset set(plot([0, M], [0, 0], 'or'), 'LineWidth', 4); title('Линия на расстоянии 3 от линии ведущий - ведомый') xlabel('Ведущий: 0, ведомый: 5') text(1, -2, 'A') text(M + 1, -2, 'B') hold on plot(x, y, '-x') hold off grid on axis equal CODE M = -2; N = 3; al = 0:0.001*pi:2*pi; be = acot( (M./N - cos(al)) ./ sin(al) ); x = -tan(be).*M./(-tan(be) - tan(al)); y = x.*tan(al);
clf reset set(plot([0, M], [0, 0], 'or'), 'LineWidth', 4); title('Окружность радиуса 3 с центром в ведущем') xlabel('Ведущий: 0, ведомый: -2') text(0.1, -0.2, 'A') text(M + 0.1, -0.2, 'B') hold on plot(x, y, '-x') hold off grid on axis equal
|
|
|
|
|
Aug 16 2012, 19:17
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Наконец-то я частично решил эту примитивную задачку  Если исходная кривая задается в аналитическом (или табличном) виде в полярных координатах с центром в ведущем - например как r(a), то угол b ведомого, расположенного в точке (М, 0) будет выражаться: b = acot( (M/r(a) - cos(a)) / sin(a) )
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 20 2012, 14:01
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198

|
Вот только параметры функции r(a)/M придется как-то получать ("на этапе настройки"). Для приведенных картинок это может быть не совсем тривиально
|
|
|
|
|
Aug 20 2012, 19:23
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198

|
Да, если ведущий действительно в центре подобия, и ориентация фигуры ему известна.
|
|
|
|
|
Aug 20 2012, 19:33
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Поэтому я и писал про частичное решение. Если ведущий не в центре подобия - тогда... надо подумать  Овалы я вроде так рисовал, а в общем случае... Есть одна идейка, также на уровне 5-го класса, если получится - сейчас проверю. Ну а если ему неизвестна ориентация фигуры - тогда, простите, решения не существует - фигуры нет как таковой  ЗЫ - вот, действительно снова 5 класс. И смещение из центра подобия ведущего, и поворот.
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 20 2012, 19:45
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198

|
Фигура есть, просто у нее больше параметров. И для настройки потребуется больше одной точки. Например, цель движется по произвольной кривой второго порядка - ну и что, за 5 прицелов функцию a®/M можно найти. Но лучше это делать не на борту, а на командирском лаптопе.
|
|
|
|
|
Aug 21 2012, 02:59
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198

|
Случайно нет. Да, в обеих формулировках задачи ведущий находится в центре подобия, и калибровать нужно только один параметр (кстати, из исходной формулировки не следует, что известно направление прямой, соединяющей орудия - но это уже вопрос к автору). В случае нестационарной фигуры задача неразрешима. В случае, когда луч, проведенный из ведущего, пересекает фигуру в двух и более точках (как у вас на последних картинках) - тоже.
|
|
|
|
|
Aug 21 2012, 09:35
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Цитата кстати, из исходной формулировки не следует, что известно направление прямой, соединяющей орудия - но это уже вопрос к автору Следует и известно. Просто у автора неявно полагается, что углы a и b отсчитываются именно от прямой соединяющей орудия. Но если расширить задачу и считать что это не так - придется вводить прямую отсчета углов относительно фигуры и линии орудий. Цитата В случае нестационарной фигуры задача неразрешима. Очень даже разрешима. Только добавляется параметрические зависимости параметров системы (расстояния между орудиями, вид/положение/направление/размер фигуры) от времени. Если все эти зависимости известны - решение то же самое. Хотя с привязкой немножко посложнее  Цитата В случае, когда луч, проведенный из ведущего, пересекает фигуру в двух и более точках (как у вас на последних картинках) - тоже. Ну, смотря что считать решением. Если только строгую однорзначную функциональную зависимость b(a), то нет. А если допускать счетную неоднозначность решения - 2 угла b при одном a, или же если считать задачу не потенциальной - то есть зависимой от пути прихода a в свое значение (как у меня на последних картинках и сделано) - то все очень даже имеет решение - что и демонстрируют мои последние картинки
|
|
|
|
|
Aug 21 2012, 10:08
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198

|
Как только зависимость b(a) перестает быть однозначной - мы приходим к нелинейным уравнениям и прочм неявным функциям. А это уже не 5-й класс (в отличие от котангенса)  По картинкам трудно понять, а что же именно там сделано
|
|
|
|
|
Aug 21 2012, 11:29
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198

|
"считать по формуле"? По какой? Даже в простейшем случае окружности со смещенным центром (в точку (c,a0) относительно ведущего) мы имеем уравнение r(a)^2-2*c*r(a)*cos(a-a0)+(c^2-R^2)=0, где R - радиус окружности. При этом величины R,c,a0 и M (расстояние до ведомого) заранее не определены. Ну, квадратное уравнение мы решить можем. Но что за формула будет в случае сердечек и звездочек, боюсь даже представить
|
|
|
|
|
Aug 21 2012, 12:38
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Насчет "заранее не определены" - да, я уже отмечал что привязка несколько усложнится  А насчет "по какой формуле" - давайте декомпозируем задачу. Допустим, мы знаем при любом a длину отрезка r от точки ведущего до нужной точки фигуры - то есть знаем r(a), даже в случае неоднозначного функционального определения - через кейсы и путь прихода в данный угол (разумеется, считая что a изменяется непрерывно от времени а не скачками). Так вот, если мы знаем r(a) для любого a, то b считается по формуле, написанной на предыдущей странице. Теперь остается только вопрос определения r(a) при сложных фигурах и неоднозначных функциях. Тут можно посоветовать следующее (это не единственный вариант) - вместо прямого расчета r(a) с такими фигурами, мы составляем таблицу (хоть через то же наше параметрическое задание фигур) с необходимым шагом по a (точнее с необходимым шагом по параметру, приводящему к необходимому шагу по a) и при работе по нашему текущему a получаем текущее r любым из методов интерполяции  UPD это все просто в случае заранее известных всех параметров фигуры относительно ведущего - но при этом расстояние ведущий-ведомый может плавать, т.к. оно вообще не фигурирует при определении фигуры относительно ведущего и используется только при финальном расчете b. В случае же заранее неизвестных каких-либо параметров фигуры при известных некоторых её показателях (фразу звучит забавно, но это из серии "некая кривая второго порядка"  ) задача действительно ещё немножко усложняется, примерно как вы показали на примере окружности заранее неизвестного радиуса и центра  Но тут уже все определяется соотношением того, что мы заранее знаем о фигуре а что нет. В принципе, при статической фигуре мы можем вообще просто воткнуть ведомого в любое место, пробежать многочисленными привязками пар a-b по всей фигуре, получить таблицу r(a) с учетом всех кейсов и неоднозначностей, и в дальнейшем использовать её для любого положения ведомого M.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|