реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Приведение в полярных координатах
Misile_Inc
сообщение Jul 19 2012, 12:30
Сообщение #1


Частый гость
**

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



Здравствуйте, есть такая задача:
Начальные условия:
Два орудия направлены в одну точку на расстоянии N метров от линии их стояния.
Известны углы, на которые повернуты оба орудия.
Расстояния N, расстояние между точками стояния орудий не известны и не могут быть введены в систему оператором орудий.
Таких точек можно получить несколько на этапе настройки.


Задача:
В "рабочем" режиме дно из орудий постоянно поворачивается и сообщает свои координаты по каналу связи (является ведущим).
Необходимо перемещать ведомое орудие так, чтобы точка пересечения осей стволов обоих орудий (точка, в которую смотрят оба ствола) перемещалась по линии, параллельной линии стояния орудий и находящейся на расстоянии N метров от линии стояния.


Беда в том, что вычислительные возможности системы управления ведомым, реализованной на 8-бит микроконтроллере, очень скудны (она к тому же еще кучу функций выполняет).
Подскажите, как лучше решить задачу, сэкономив вычислительные ресурсы.

Надеюсь, не запутал.
Спасибо!

Сообщение отредактировал Misile_Inc - Jul 19 2012, 13:58
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Jul 19 2012, 13:56
Сообщение #2


Частый гость
**

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



Еще вопрос: Я так понимаю, если потребуется выбирать цель не параллельно линии стояния, а на заданном радиусе от ведущего (ведущий и ведомый внутри окружности), подход к решению задачи будет аналогичен решению этой?
Go to the top of the page
 
+Quote Post
Tanya
сообщение Jul 19 2012, 14:00
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Misile_Inc @ Jul 19 2012, 16:30) *
Надеюсь, не запутал.
Спасибо!

Тоже надеюсь, что не только меня.
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Jul 19 2012, 14:19
Сообщение #4


Частый гость
**

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



Попробую нарисовать.
Вот. Известно несколько пар (a;b). Далее по введенному a надо найти b.
Пары углов получаем вручную при установке оборудования.
При следующем включении взаимное расположение оборудования может измениться.
Расстояние до целевой линии тоже

Вот иллюстрация второй задачи.

Сообщение отредактировал Misile_Inc - Jul 19 2012, 14:32
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Tanya
сообщение Jul 19 2012, 14:28
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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.

Так кто ведущий, а кто ведомый?
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Jul 19 2012, 14:33
Сообщение #6


Частый гость
**

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



Цитата(Tanya @ Jul 19 2012, 18:27) *
А где N?

N- расстояние между черными параллельными линиями в первой задаче (которые соединены цветными лучами).
Но оно не известно, как говорилось выше.
Известны только пары углов (a;b).

Цитата(Tanya @ Jul 19 2012, 18:28) *
Так кто ведущий, а кто ведомый?

Поправил. Но ведь это не существенно для решения задачи.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Jul 19 2012, 16:31
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Я бы делал "в лоб" - при включении инициализация, нахождение текущего (на данный сеанс работы) N - аналитически по тригонометрии (должно решаться тривиально), в железе - по таблично заданной функции. А далее просто - b является при известном N функцией от a, аналитически она выразится через какую-то тригонометрию, эту функцию в виде таблицы закладываете хоть в ведущего хоть в ведомого (у кого ресурсов больше), вычисляете b. Если нужна точность - интерполируете эту таблично заданную функцию до нужной степени точности на этапе расчета b. Повторюсь что сам расчет можно вести хоть в ведущем, хоть в ведомом, хоть половину там и там.

Для случая прямой уравнение связи параметров такое: ctg(a) + ctg(cool.gif = M/N, где M - расстояние между орудиями (5-й класс средней школы). При стартовой привязке по нескольким парам углов вычисляете поточнее ваше значение M/N для данной конфигурации, запоминаете его и все. Расчет угла ведомого: считаете (по таблице с интерполяцией) котангенс угла ведущего, вычитаете его из имеющегося параметра M/N и берете арккотангенс результата (по таблице с интерполяцией).
Для других случаев просто будут другие уравнения связи параметров. И можно рисовать любые фигуры, которые луч ведущего пересекает только один раз при любом своем угле.
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Jul 20 2012, 06:15
Сообщение #8


Частый гость
**

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



_Ivana, спасибо большое! sm.gif буду вспоминать 5й класс.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Jul 20 2012, 10:47
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Пожалуйста sm.gif Кстати, для случая окружности с центром в одном из орудий уравнение выглядит так:
Код
ctg(b) = (M/R - cos(a))/sin(a)

M/R аналогично находите из первых привязок, далее по a получаете b через пару табличных функций (для sin и cos одна таблица четверти периода). Только пара моментов:
1) если решать относительно a (с центром в ведомом), то придется численно решить вышеприведенное уравнение относительно a, что немного сложнее
2) нули синуса (как теоретические так и машинные) = бесконечность котангенса и, как следствие, +- нулевой угол, обойдете при реализации самостоятельно, это просто.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Aug 15 2012, 20:34
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Поставил Матлаб, нравится, балуюсь sm.gif
Для линии:
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


Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Aug 15 2012, 21:57
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



UPD все-таки непривычно мыслить многомерными векторами.... Вот так получше будет, методически правильнее sm.gif
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
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Aug 16 2012, 19:17
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Наконец-то я частично решил эту примитивную задачку sm.gif
Если исходная кривая задается в аналитическом (или табличном) виде в полярных координатах с центром в ведущем - например как r(a), то угол b ведомого, расположенного в точке (М, 0) будет выражаться: b = acot( (M/r(a) - cos(a)) / sin(a) )
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение


Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

 
Go to the top of the page
 
+Quote Post
Mrrl
сообщение Aug 20 2012, 14:01
Сообщение #13





Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198



Вот только параметры функции r(a)/M придется как-то получать ("на этапе настройки"). Для приведенных картинок это может быть не совсем тривиально sad.gif
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Aug 20 2012, 18:16
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Очень просто. Считаем r(a) = N*r1(a), где r1(a) - "единичная" функция фигуры, N - коэффициент её масштаба. При привязке задаем любой a0, считываем соответствующий ему b0, по ним из уравнения (что тривиально делается аналитически) находим M/N - наш неизвестный безразмерный коэффициент, определяющий масштаб фигуры относительно расстояния между орудиями.
Go to the top of the page
 
+Quote Post
Mrrl
сообщение Aug 20 2012, 19:23
Сообщение #15





Группа: Новичок
Сообщений: 9
Регистрация: 20-08-12
Пользователь №: 73 198



Да, если ведущий действительно в центре подобия, и ориентация фигуры ему известна.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 14:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016