LINUX.ORG.RU

Библиотеки для инерциальной навигации - какие есть?


3

4

Существуют ли универсальные (или популярные) библиотеки для обработки данных с гироскопов и акселерометров? Которые были бы написаны вне привязки к какому-то продукту или производителю?

Чтобы не париться с объединением результатов акселерометра, гироскопа и прочих? Вдруг есть готовое решение? Я пока такое не могу найти.

Ответ на: комментарий от amaora

Сори что часто долблю ответы, редактировать нельзя. В общем, вижу 720 градусов вместо 90, видать какой-то делитель то выставляется то нет. Ну ясно...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

у ?этого же? (у того короче, кто модуль для ROS запаковал) написан модуль в котором сделан фьюжен ptam и гироскопоакцелерометров.

кроме того есть открытая библиотека для игр с инерционками http://www.instk.org/ по их графикам приемлемая ошибка 3 секунды на смартофонном железе держится

вот ещё обсуждение http://stackoverflow.com/questions/7829097/android-accelerometer-accuracy-ine...

psv1967 ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Раздельные интегралы от углов не обязаны сходится в ноль для произвольного движения. Надо по хорошему считать.

Здесь можно почитать про уравнения связывающие угловую скорость и ориентацию. teormech.mipt.ru/f_booklets/rigid_body

amaora ★★ ()
Ответ на: комментарий от amaora

Спасибо за ссылку, буду читать!

Вот новые данные: поднимается датчик вверх, крутится, кладется вниз в начальном положении. Формат плоский - три значения гироскоп, три акселерометр. У гироскопа помимо того 0.02 / 14.375 надо еще на 8 поделить чтобы 90 градусов было 90.

Попробовал визуализировать кубик при помощи Qt/OpenGL - вижу как я его крутил, и даже встает почти в исходное положение. И действительно не попадает на место. (я пока только повороты отображаю, перемещения по акселерометру пока еще не прорюхал как считать)

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от amaora

Здесь можно почитать про уравнения связывающие угловую скорость и ориентацию.

Почитал книгу, но не до конца, ибо надо внимательно вдумываться в формулы и сравнивать.

Надо по хорошему считать.

Разобрался как применять кватернионы для вращения объекта (смотрю оси и куб в OpenGL - просто делаю glLoadMatrixf для матрицы перемещения объекта, а Qt предоставляет классы для кватерниона).

Сделал так:

vis_gac vd;                                                    
QQuaternion quat;                                              
quat = QQuaternion::fromAxisAndAngle(1, 0, 0, f_xyz[0]) * quat;
quat = QQuaternion::fromAxisAndAngle(0, 1, 0, f_xyz[1]) * quat;
quat = QQuaternion::fromAxisAndAngle(0, 0, 1, f_xyz[2]) * quat;
vd.q = quat;                                                   
vis_data.append(vd);
где fromAxisAndAngle принимает значения в градусах.

Кубик крутится, но в конце всё равно не возвращается в изначальное положение (а должен).

Вопрос: так как же правильно считать? Где конкретно это описано?

Я правильно понимаю, что сам факт того что я раздельно делаю движения по осям - неверно? Что гироскоп дает связанные данные о движении? Как же тогда загрузить это в кватернион? Показания гироскопа задать как вектор, а каков же скаляр?

Прощу прощения, но как было непонятно, пока и остается.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от I-Love-Microsoft

Уравнения Пуассона. В моем коде вот этот фрагмент.

		dq = qmul(q, w) / 2 + (1 - qnorm(q)) * q;

В книге страница 25-27. Я ещё добавил слагаемое для нормализации кватерниона, в исходном уравнении его нет.

Если дальше упрощать, то можно объясниить так: Для каждого полученного значения угловой скорости формируется приращение ориентации (ортогональное преобразование, можно представлять матрицей, кватернионом, углами). Из-за малости углов можно посчитаь его как последовательность поворотов по осям за шаг дискретизации. Дальше текущая ориентация поворачивается на полученное приращение.

Естественно алгебра перемножения поворотов в углах не сводится к их раздельному сложению, и это не верно. Но и не очень нужно, гораздо проще использовать ортогональные матрицы, или нормированные кватернионы. А углы получить уже на выходе, преобразуя матрицу или кватернион в них, если они нужны (для визуализации не нужны).

amaora ★★ ()
Ответ на: комментарий от I-Love-Microsoft

http://paste.org.ru/?love1q

http://postimg.org/image/3kdlnsthh/ http://postimg.org/image/j6lnkhsur/ http://postimg.org/image/3qtggugaz/

Перемещения считать просто, ускорение надо преобразовать в неподвижную систему координат (датчик дает в связанной с ним системе) и там раздельно по осям.

amaora ★★ ()
Ответ на: комментарий от amaora

Спасибо! Прогнал еще несколько файлов этой программой - графики показывают правильные движения - именно такие как я и выполнял.

По остальному понял - раз есть готовое решение в Octave и оно реально работает, то в разы проще будет разобраться, изучая литературу!

P.S. Можно поинтересоваться, если не секрет, где Вы работаете? В какой области?

И еще... как я могу отблагодарить? Какой-нибудь YandexMoney или что-то в этом роде есть?

И можете ли Вы небезвозмездно посотрудничать над подобными задачами? Есть ли скайп, или другой способ связи?

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

P.S. Можно поинтересоваться, если не секрет, где Вы работаете? В какой
области?

Здесь всегда обходились без «Вы» и мне это нравится. Навигация и управление ЛА.

И еще... как я могу отблагодарить? Какой-нибудь YandexMoney или что-то
в этом роде есть?

Не за что.

И можете ли Вы небезвозмездно посотрудничать над подобными
задачами? Есть ли скайп, или другой способ связи?

Сомневаюсь, что соглашусь, но если хочется то можно в жаббер, тот же ник на jabber.ru.

amaora ★★ ()

ТС, если вы что-то напишите, заопенсорсишь? мне через полгода надо будет похожим заниматься для хобби проекта, помог бы.

val-amart ★★★★★ ()
Ответ на: комментарий от val-amart

Разумеется :) Я не жид, обязательно поделюсь и расскажу. И спасибо amaora, уже тот код в Octave это уже большой шаг в решении задачи, потому что уже работает и углы «почти» в ноль возвращаются.

Да, у меня будет модульчик, который будет делать расчет на Qt (сори, чего-то более универсальное не сделаю, ибо пишу на Qt - мне удобно). Специальный выделенный модуль - пусть он будет открыт.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

всё таки надо избегать написания велосипедов :), надо «стоять на плечах гигантов» (С)

есть прекрасная ахритектура для всех таких работ, вот например такая стартовая точка

http://wiki.ros.org/ssf_core?distro=groovy

трудно ли этим пользоваться? ну у меня работало :) на старт уйдет пара недель разборок. но в результате в руках не велосипед, а платформа индустриального класса.

psv1967 ★★★★★ ()
Ответ на: комментарий от psv1967

Надо подумать, но для меня всё это избыточно. И на ARM архитектуре это работать будет?

Ну хорошо, по приведенной ссылке там всё именно то что мне надо? У Вас есть реальный опыт работы с каким-либо модулем ROS и этим в частности?

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

0) напомните, не должен ли я Вам случайно денег? :)

1) у меня есть реальный опыт запуска модулей ROS (и по моему я это чётко написал). в том числе в распределенной среде. Это живой рабочий код, а не велосипед который будет держать точку в течении не более 5 секунд :).

2) ROS и собирают, и используют под ARM. http://wiki.ros.org/ROS/Installation

для экспериментов например можно подключать внешний узел на андроид. и работать просто с данными его сенсоров со стационарного компа. но это конечно всё глупости, лучше писать свой велосипед. :)

3) Инерционные модули в ROS

http://wiki.ros.org/imu_drivers

но все они в конечном счете _маршрут_ считают за счет фьюжена

http://wiki.ros.org/robot_pose_ekf (вот для 2D, раз неустраивает для 3D)

просто «позу в пространстве» все эти модули отдают сразу.

psv1967 ★★★★★ ()
Ответ на: комментарий от psv1967

Прошу прощения, упустил момент про реальный опыт... Просто я ОЧЕНЬ боюсь потерять еще больше времени, разбираясь с тем, что потом не подойдет, мне на эти вещи фатально не везет.

С чего лучше начинать изучение?

Репозиторий не открывается... https://code.ros.org/svn/ros-pkg/stacks/imu_drivers/trunk/

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

1) скачивается _готовый_ образ виртуалки с убунтой в которой всё уже установлено. как и написано http://wiki.ros.org/ROS/Installation Весь дополнительный софт ставится (да и выкачивается обычно) интегрированной системой сборки ROS (для этого есть соответствующий тур туториалов http://wiki.ros.org/ROS/Tutorials ).

2) выполняются простые туториалы, которые объясняют типовые действия по запуску мастера и нод. читается вики с примерами http://wiki.ros.org/ . (у меня затраты составили 2 недели до появления приложения с подъемом дешевых usb-камер с собранным драйвером-франкенштейном из сторонних не поддерживаемых ROS официально драйверов). после этого запустить ноду на андроиде с подключением по wifi к стационарному компу было вообще детским заданием :).

Хороший источник информации ответы-вопросы http://answers.ros.org/questions/ , там овер 12000 ранее заданных вопросов с ответами.

при рассматривании документации по конкретной ноде или стеку полезно посмотреть на версии для разных релизов ROS, иногда информация сильно отличается полнотой.

3) подбирают нужный набор нод для своего проекта. если нужно пишут свою ноду.

4) у меня отвечает

ros-pkg — Revision 40422 /stacks/imu_drivers/trunk [Parent Directory] microstrain_3dmgx2_imu/ CMakeLists.txt Makefile stack.xml Powered by Subversion 1.6.6 (r40053)

5) Это смешно... изучение pcl, opencv и платформы всё это интегрирующей с биндингом в самые популярные языки и чтоб не было пользы? :)

psv1967 ★★★★★ ()
Ответ на: комментарий от psv1967

скачивается _готовый_ образ виртуалки с убунтой в которой всё уже установлено

Ясно, ключевой момент... Жаль пока не могу скачать 3.3+ Гб, ибо на мопеде сижу.

ЗЫ Польза - понятие ох какое относительное ;)

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

ну почему? я собирал и сам. но это упирается в необходимость качать многие комерческие (патентованные) либы на моём дебиане для наиболее интересных практически применимых алгоритмов.

я просто предлагаю (как и страница инсталла) наименее геморойный путь быстро научиться использовать ROS.

_любой_ собственный код (на питоне, лиспе, с++) оформленный в виде узла ROS превращается из велосипеда в практически готовый к работе в распределенной среде продукт.

psv1967 ★★★★★ ()
Ответ на: комментарий от psv1967

_любой_ собственный код (на питоне, лиспе, с++) оформленный в виде узла ROS превращается из велосипеда в практически готовый к работе в распределенной среде продукт.

Хм... Интересно. Надо бы и мне попробовать собрать, по любому это будет не 3 Гб а в разы меньше (надеюсь).

ЗЫ Виртуалка это интересней, но мне еще две недели на нестабильных мобильных 128 кбит/с сидеть...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от val-amart

amaora

Хотелось бы еще раз выразить благодарность пользователю amaora! Едва ли бы я самостоятельно решил бы такую задачу...

Нашел время и перевел представленные в GNU/Octave вычисления на C++/Qt. Углы вычисляются 100% правильно после любых вращений!

Если кому-то надо, скажите как и куда выслать мою тестовую программулю. Пока нет времени сделать это в виде удобной библиотечки.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

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

val-amart ★★★★★ ()
Ответ на: комментарий от val-amart

Малость поторопился я...

Пока еще не могу понять как получать координаты по акселеромету, то что есть в примере от amaora выдает странные результаты, я пока не понял. У меня такие же результаты вычислений, но если углы понятны, то координаты пока нет.

В моих экспериментах датчик поднимается, крутится, кладется обратно. Значит координата должна возвращаться в ноль + погрешность и ошибка. В процессе...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

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

И ещё, в моем коде было интегрирование Эйлера с шагом 1/10 от периода прихода информации с датчиков. Это не хорошо, я бы исправил на метод второго или даже четвертого порядка.

amaora ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.