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

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

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

|
Да, если ведущий действительно в центре подобия, и ориентация фигуры ему известна.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|