Тригонометрия и Ардуино

bal-bes
Offline
Зарегистрирован: 06.06.2012

Всем привет! Ребята ну помогите в таком деле - надо средствами ардуино высчитать угол  "А"  в градусах по имеющимся x и у. Это всё для сервопривода. И вообще очень интересует опыт тригонометрических расчетов .

Lipt0n
Offline
Зарегистрирован: 04.11.2013

sin(A)=x/y; - вычисляем синус угла по гипотенузе и прилежазему катету.

A=arcsin(sin(A)); - переводим синус угла в радианы.

A=(A*180)/Pi; - получаем градусы.

Вся формула выглядит так:

A=(arcsin(x/y)*180)/Pi;

Как заменить арксинус для того чтобы arduino посчитал - я не знаю.

UPD. Эх... если бы мне все эти тригонометрические функции в школе показывали на тех же сервоприводах, уверен что заучил бы их на отлично. А так оно для меня так и осталось абстрактным понятием.

step962
Offline
Зарегистрирован: 23.05.2011

Lipt0n пишет:

sin(A)=x/y; - вычисляем синус угла по гипотенузе и прилежазему катету.

Для данного рисунка Sin(A)=sqrt(y*y-x*x-y*y)/x

Ибо синусом угла называется отношение противолежащего катета к гипотенузе

step962
Offline
Зарегистрирован: 23.05.2011

Lipt0n пишет:

Как заменить арксинус для того чтобы arduino посчитал - я не знаю.

Ряд Тейлора ей в зубы

или нагляднее так (из пикиведии):

  • Арксинус: \arcsin x = x + \frac{x^3}{6} + \frac{3x^5}{40} + \cdots\ = \sum^{\infin}_{n=0} \frac{(2n)!}{4^n (n!)^2 (2n+1)} x^{2n+1} для всех \left| x \right| < 1[1]
Lipt0n
Offline
Зарегистрирован: 04.11.2013

step962 пишет:

Для данного рисунка Sin(A)=sqrt(y*y-x*x-y*y)/x

Ибо синусом угла называется отношение противолежащего катета к гипотенузе

Опять я всё напутал. Думал о косинусе, а написал про синус.

A=(arccos(x/y)*180)/Pi;

 

 Sin(A)=sqrt(y*y-x*x-y*y)/x  -> y^2-x^2-y^2 =-x^2+y^2-y^2=-x^2     - это как?

Или там должна быть третья сторона?

Если так, то у нас только две :(

step962
Offline
Зарегистрирован: 23.05.2011

Lipt0n пишет:

step962 пишет:

Для данного рисунка Sin(A)=sqrt(y*y-x*x-y*y)/x

Ибо синусом угла называется отношение противолежащего катета к гипотенузе

Опять я всё напутал. Думал о косинусе, а написал про синус.

A=(arccos(x/y)*180)/Pi;

 

 Sin(A)=sqrt(y*y-x*x-y*y)/x  -> y^2-x^2-y^2 =-x^2+y^2-y^2=-x^2     - это как?

Или там должна быть третья сторона?

Если так, то у нас только две :(

Тогда уж

A=(arccos(y/x)*180)/Pi;

(делим на гипотенузу, а не на катет)

Lipt0n
Offline
Зарегистрирован: 04.11.2013

step962 пишет:

Тогда уж

A=(arccos(y/x)*180)/Pi;

(делим на гипотенузу, а не на катет)

Верно! :)

step962
Offline
Зарегистрирован: 23.05.2011

Lipt0n пишет:

 Sin(A)=sqrt(y*y-x*x-y*y)/x  -> y^2-x^2-y^2 =-x^2+y^2-y^2=-x^2     - это как?

Или там должна быть третья сторона?

Если так, то у нас только две :(

очепятка, ессссно (тоже боролся с непривычным именованием сторон)
 Sin(A)=sqrt(x*x-y*y)/x  ("пифагоровы штаны...")
bal-bes
Offline
Зарегистрирован: 06.06.2012

))) Спасибо парни. Я знаю тригонометрию. Тогда конкретизирую вопрос, в моем представлении по крайней мере. Так как наши Atmel`ы не дружат с float, то у меня одна мысль - это таблицы. Точнее выбор из промежутков. Может есть какие-то примеры БЫСТРОГО кода выборки из таблицы(массива) интервалов. Может быть кто-то пользовался библиотеками какими-либо для этого. Моё работает медленно и оное громоздко. Вот и ищу что-то оптимальнее моего. Не всегда ж сервы от АЦП гнут. Или там в цикле)))) google & yandex не помогли. Если что пропустил - прошу тыкнуть носом.

Lipt0n
Offline
Зарегистрирован: 04.11.2013

bal-bes пишет:

))) Спасибо парни. Я знаю тригонометрию. Тогда конкретизирую вопрос, в моем представлении по крайней мере. Так как наши Atmel`ы не дружат с float, то у меня одна мысль - это таблицы. Точнее выбор из промежутков. Может есть какие-то примеры БЫСТРОГО кода выборки из таблицы(массива) интервалов. Может быть кто-то пользовался библиотеками какими-либо для этого. Моё работает медленно и оное громоздко. Вот и ищу что-то оптимальнее моего. Не всегда ж сервы от АЦП гнут. Или там в цикле)))) google & yandex не помогли. Если что пропустил - прошу тыкнуть носом.

Было бы неплохо написать это сразу(т.к. в этом случае я бы не показал свои навыки незнания тригонометрии и исключительной невнимательности :) ).

В чём выражается недружелюбность с float? 

bal-bes
Offline
Зарегистрирован: 06.06.2012

:))) тригометрию только вики сейчас и помнит.

Я понял свою ошибку. Начну с начала. Есть лапа из четырех суставов. Мне надо высчитать углы поворота 5 серв. Долго высчитывается всё это. Надо делать отдельно серво-контроллер, ведь есть же ещё другие комманды в потоке.

bal-bes
Offline
Зарегистрирован: 06.06.2012

Пересмотрел огромное количество различных жутей на 2-6-8 и более лап. В каждой по 2-3 сервы. И оно всё довольно быстро двигается. Там же как-то считается.

Lipt0n
Offline
Зарегистрирован: 04.11.2013

Можно ссылочку для того чтобы представить что это такое?

bal-bes
Offline
Зарегистрирован: 06.06.2012

http://blog.oscarliang.net/arduino-hexapod-robot/ вот смотрел только-что.

по ссылке лапы проще, меньше серв. пример на картинке и на примере многоногов - чтобы лапа отошла от корпуса на Y=20 см надо найти угол А или В. Длина колена X - известна

Lipt0n
Offline
Зарегистрирован: 04.11.2013

Всёравно я не пойму...  

МК формирует значение угла и отсылает его серве, которая его понимает и выгибается под заданный угол. 

Почему напрямую не брать это значение?

UPD. Я понял что и нужно сформировать эти углы, но всё равно мне не понятна конструкция :)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
bal-bes
Offline
Зарегистрирован: 06.06.2012

1 серва пусть будет плечо. 2 серва - локоть. чтобы протянуть руку на 80 см от себя, надо согнуть руку и в плече, и в локте. на определенные градусы в плече и локте. вот мне и нужны эти углы))

Клапауций
Offline
Зарегистрирован: 10.02.2013

смотри что нарыл http://tmm-umk.bmstu.ru/lectures/lect_20.htm

копай в эту сторону

Grettaa
Grettaa аватар
Offline
Зарегистрирован: 27.08.2019

У меня не получались как то арктангенсУглы треугольника обычно измеряются в градусах (x°). 1 градус равен ​\( \frac{1}{360} \)​ длины окружности с центром в точке начала угла. Также используется минута x′, равная ​\( \frac{1}{60} \)​ градуса, и секунда x″, равная ​\( \frac{1}{60} \)​ минуты. В тригонометрии, однако, используется также радиан. 1 радиан примерно равен 57º17′45″. Длина дуги, которую высекает угол в α радиан, равна αR, где R - радиус окружности.

 
b707
Offline
Зарегистрирован: 26.05.2017

Грета, твой ответ в этой ветке запоздал на 6 лет

IVAN222
Offline
Зарегистрирован: 19.04.2017

 Я так понял у Вас проблема с этой таблицей. Cos(0) = 1,  Cos(1) =0,999847695 ........... Cos(359) = 0,999847695, Cos(360) = 1.   И так вбиваете всю таблицу, может Вам и не надо все 360 градусов , а только те углы на какие поворачивается плече, а если получается между целыми градусами то есть минуты, то округляйте до целого числа градуса. Так же с sin, tg, ctg  и т. д. если они Вам нужны. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да нет ни у кого проблем. Здесь разговор велся как расчитать движение лап механических тараканов на сервах. Но народ затупил и кинулся в расчеты. Но если бы народ влючил голову и просто сделал точно такую лапу, а лучше таракана но с лапами где вместо серв были переменные резисторы, то задачу решили еще быстрее. Причем еще отработали кучу походок передвижения.

ПС: прошло 7 лет и проект даже не начился ;))

IVAN222
Offline
Зарегистрирован: 19.04.2017

bal-bes пишет:

Всем привет! Ребята ну помогите в таком деле - надо средствами ардуино высчитать угол  "А"  в градусах по имеющимся x и у. Это всё для сервопривода. И вообще очень интересует опыт тригонометрических расчетов .

Косинус - отношение прилежащего катета к гипотенузе. Это Вы получите цифру от 0 до 1 но не градусы, а что бы перевести в градусы нужна таблица перевода в градусы. В ардуино такой библиотеки нет что бы в всяких соотношениях катетов и гепотенуз выдовало сразу градусы. Остается только в ручную набирать таблицу и прикручивать к Вашим расчетам.

sadman41
Offline
Зарегистрирован: 19.10.2016

В кои-то веки соглашусь с Квоном: точно крутить сервы без обратной связи - все равно, что вслепую жонглировать.