Mavros: Дистанционное управление джойстиком

Созданный на 25 авг. 2014  ·  72Комментарии  ·  Источник: mavlink/mavros

В переплете. Потребуется помощь в части переопределения RC.

extras feature request

Самый полезный комментарий

@vooon сейчас проводит тест. Моя карта осей другая, ее легко изменить, но я вижу, что некоторые каналы перевернуты. Вы должны добавить параметр также в обратный канал, без необходимости переходить в режим управления и делать что-то вроде z=-yaw .

Примечание: в моем случае моя карта осей:

axes_map = {
    'roll': 3,
    'pitch': 2,
    'yaw': 0,
    'throttle': 1
}

и в режиме управления vel:

twist.twist.linear = Vector3(x=-roll, y=pitch, z=throttle)
twist.twist.angular = Vector3(z=-yaw)

Все 72 Комментарий

Думаю, лучше не плагин, а узел скрипта, использующий плагин rc_io.

Будет ли это включать в себя заданные значения?

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

Просто мне не нужен дублированный код, который уже существует (и работает).

Я считаю, что этот узел должен подписаться на тему джойстика и выдавать сообщения отмены rc (или заданное значение).
Пришлите мне, пожалуйста, какие данные я должен отправить на rc / setpoint и написать скрипт (карту каналов и т. Д.).

Хорошо, я бы сделал это прямо сейчас

@vooon отправил вам письмо сейчас;)

Хорошо, посмотрю завтра.

Конечно: +1: Спасибо!

Я мог бы добавить аналогичный узел, который у меня есть для этого, если он понадобится. @ TSC21

@tonybaltovski пришлите, пожалуйста, мне. Думаю, это полезный пример, но, возможно, он должен быть в массовке.

@tonybaltovski Я уже запустил плагин, который отправил на @vooon, чтобы он мог адаптироваться так, как он хочет. Он был почти готов для управления уставкой, но часть переопределения RC я оставил на @vooon.

Какой статус по этому поводу? Я бы очень хотел разобраться в этом, чтобы проверить и уставки :)

Может быть завтра...

@ TSC21 Это просто

Я попробую, спасибо! :) Но мой приоритет - проверить уставки с помощью джойстика. Если вы можете добавить возможность управления положением и скоростью, буду признателен.

Для скорости отправьте cmd_vel как TwistStamped чтобы подписался на setpoint_velocity ;

Управление положением простое: вместо cmd_vel он отправляет position как PoseStamped но это должен быть частный случай - он должен суммировать предыдущее отправленное значение позиции, чтобы оно может увеличивать или уменьшать позицию (поэтому значения x , y , z не ограничиваются -1..1; что ограничено, так это значение, которое добавляется к последнее значение; поэтому, если джойстик всегда отправляет +1 , на каждой итерации он суммирует +1 -> единственное сомнение, которое у меня есть здесь, это то, что нам нужно ограничить скорость в этом случае, поэтому итерации не слишком быстро увеличивают значения).
На этот подписан setpoint_position .

Обновление: по теме /joy : я не могу получить какие-либо данные с джойстика с помощью сценария mavteleop . Но с запуском universal_teleop я могу. Значит, в сценарии чего-то не хватает.

Вы запускаете joy_node?

rosrun joy joy_node

2014-08-27 18:17 GMT + 04: 00 TSC21 [email protected] :

Обновление: по теме / joy: я не могу получить данные из
мой джойстик с использованием скрипта mavteleop. Но с помощью universal_teleop
запустить могу. Значит, в сценарии чего-то не хватает.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/vooon/mavros/issues/133#issuecomment -53578566.

Нет! Да, теперь работает. Забыл joy_node . Разве это нельзя включить в запускаемый скрипт?

Хорошо, теперь о самом переопределении: повторение /mavros/rc/override не получало никаких данных, потому что вы забыли префикс / здесь:

override_pub = rospy.Publisher(args.mavros_ns + "/rc/override", OverrideRCIn, queue_size=10)

Нужно это исправить, или я сделаю пиар.
Но все же на FCU нет RC-переопределения, поскольку двигатели даже не меняют скорость. Продолжу проверять, что происходит.

@vooon RC не работает. Скрипт публикуется на /rc/override , на который подписывается rc_io.cpp . Эхо /mavros/rc/override дает мне изменение значений каналов, но на стороне FCU ничего не происходит (вращение двигателя не меняется).

Моим приоритетом не является переопределение RC, хотя я бы хотел его настроить. Но я не могу найти, в чем проблема. Между тем, не могли бы вы установить заданную скорость и управление положением, пожалуйста? (на основе вышеприведенного комментария, который я сделал относительно спецификаций этого типа управления)
Спасибо!

У меня такая же проблема с переопределением RC. FCU не использует его.

@tonybaltovski может попробовать отладить причину? Я занят другими вещами, касающимися POSCTL.

Когда я тестировал переопределения с помощью APM, я обнаружил, что он автоматически отключается, если сообщение о переопределении приходит от system_id! = SYSID_MYGCS (по умолчанию: 255).

Поэтому я меняю его на 1 (по умолчанию mavros), и он работает. Или мы можем изменить mavros system_id.

Так что же не так? system_id или comp_id ? Что нужно в случае PX4?

Возможно, PX4 не обрабатывает сообщения переопределения RC, я не могу найти обработчик для сообщения MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE .

Возможно, PX4 не обрабатывает сообщения переопределения RC, я не могу найти обработчик для сообщения MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE .

Да вроде нет. Что ж, очень плохо, я думаю, мы можем попросить реализацию, но я бы предпочел, чтобы уставки работали. Не могли бы вы подать руку @vooon, пожалуйста?
Заранее спасибо!

@vooon Я попробую еще раз на своем APM завтра и дам вам знать.

Я попробую сделать это завтра.

Большое спасибо @vooon!

@ TSC21 Я почти закончил, но управление положением очень грязное. Необходимо переделать это для интегрирования в постоянное время.

Спасибо @vooon! : D, когда вы все сделаете, пожалуйста, предупредите меня! Буду рад это протестировать!

Вы уже можете протестировать все режимы, кроме -pos (и, возможно, -vel ).

@vooon сейчас проводит тест. Моя карта осей другая, ее легко изменить, но я вижу, что некоторые каналы перевернуты. Вы должны добавить параметр также в обратный канал, без необходимости переходить в режим управления и делать что-то вроде z=-yaw .

Примечание: в моем случае моя карта осей:

axes_map = {
    'roll': 3,
    'pitch': 2,
    'yaw': 0,
    'throttle': 1
}

и в режиме управления vel:

twist.twist.linear = Vector3(x=-roll, y=pitch, z=throttle)
twist.twist.angular = Vector3(z=-yaw)

Для реверса используйте параметр ~axes_scale/<name> (установите значение -1,0).

Ну ладно, не проверял. Спасибо!

Можете ли вы интегрировать rosrun joy joy_node при запуске скрипта вместо добавления его в файл launch ?

@vooon еще одна вещь, которая должна работать: узел должен всегда отправлять данные, даже если они равны 0,0, т.е., например, cmd_vel всегда должен публиковать, даже если мы не перемещаем переключатели на джойстик, потому что режим OFFBOARD имеет тайм-аут 0,5 секунды, и чтобы постоянно получать данные, чтобы оставаться в этом режиме, или он возвращается в предыдущий режим!

Я вижу, что когда мы устанавливаем для канала значение, cmd_vel просто отправляет это значение один раз. Реализация PX4 должна постоянно получать данные, поэтому я думаю, что можно сделать следующее: cmd_vel всегда отправляет предыдущее значение канала, за исключением случаев, когда он получает новое значение. Это новое значение сохраняется и отправляется постоянно, пока не будет установлено новое значение канала (с использованием аналоговых джойстиков, отклоняющихся от курса).

Добавьте это в свой файл запуска для узла радости <param name="~autorepeat_rate" value="5" />

Спасибо @tonybaltovski, что сработало! Но все равно не могу изменить параметры с помощью файла запуска. Вот как выглядит мой файл запуска:

<launch>
    <!-- vim: ft=roslaunch -->
    <!-- example launch script for PX4 teleop -->

    <arg name="fcu_url" default="serial:///dev/ttyACM0:57600" />
    <arg name="gcs_url" default="" />
    <arg name="tgt_system" default="1" />
    <arg name="tgt_component" default="50" />

    <node pkg="mavros" type="mavros_node" name="mavros" required="true" clear_params="true" output="screen">
        <param name="fcu_url" value="$(arg fcu_url)" />
        <param name="gcs_url" value="$(arg gcs_url)" />
        <param name="target_system_id" value="$(arg tgt_system)" />
        <param name="target_component_id" value="$(arg tgt_component)" />

        <!-- px4 blacklist -->
        <rosparam command="load" file="$(find mavros)/launch/px4_blacklist.yaml" />

        <!-- enable heartbeat send and reduce timeout -->
        <param name="conn_heartbeat" value="5.0" />
        <param name="conn_timeout" value="10.0" />
        <!-- enable mavlink autostart on USB port -->
        <param name="startup_px4_usb_quirk" value="true" />

        <!-- joystick axis parameters -->

        <!-- joystick axis map -->
        <param name="~axes_map/roll" value="3" />
        <param name="~axes_map/pitch" value="2" />
        <param name="~axes_map/yaw" value="0" />
        <param name="~axes_map/throttle" value="1" />

        <!-- joystick axis scale -->
        <param name="~axes_scale/roll" value="-1.0" />
        <param name="~axes_scale/pitch" value="" />
        <param name="~axes_scale/yaw" value="-1.0" />
        <param name="~axes_scale/throttle" value="" />

    </node>

    <node pkg="joy" type="joy_node" name="joy" required="true">
        <param name="~/autorepeat_rate" value="50" />
    </node> 
</launch>

Может быть, потому что это сценарий mavros_extras ? Но выдав rosparam list / я получаю:

/joy/autorepeat_rate
/mavros/axes_map/pitch
/mavros/axes_map/roll
/mavros/axes_map/throttle
/mavros/axes_map/yaw
/mavros/axes_scale/pitch
/mavros/axes_scale/roll
/mavros/axes_scale/throttle
/mavros/axes_scale/yaw

Поэтому я не могу понять, почему это не меняет параметр.

Кстати, @vooon , это должно быть axis а не axes ;) Я сделаю это исправление и сделаю пиар, если хотите.

Обновление: боже, мое невежество. оси - это множественное число от оси (так что все в порядке)

Обновление: если я сделаю rosparam get /mavros/axes_map/pitch я получу 2 как и предполагалось, поэтому я думаю, что это может быть что-то на mavteleop .

Если я сделаю это вместо этого:

load_map(axes_map, '/mavros/axes_map/')
load_map(axes_scale, '/mavros/axes_scale/')
load_map(button_map, '/mavros/button_map/')

на rosrun mavteleop :

[ERROR] [WallTime: 1409327711.720875] bad callback: <function joy_cb at 0xa5ce9cc>
Traceback (most recent call last):
  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/topics.py", line 682, in _invoke_callback
    cb(msg)
  File "/home/vision/vision_ros_ws/src/mavros/mavros_extras/scripts/mavteleop", line 187, in joy_cb
    pitch = get_axis(joy, 'pitch')
  File "/home/vision/vision_ros_ws/src/mavros/mavros_extras/scripts/mavteleop", line 92, in get_axis
    return j.axes[axes_map[n]] * axes_scale[n]
TypeError: can't multiply sequence by non-int of type 'float'

Хорошо, проблема решена! Вот что я сделал:
В файле запуска у меня было:

<!-- joystick axis scale -->
        <param name="~axes_scale/roll" value="-1.0" />
        <param name="~axes_scale/pitch" value="" />
        <param name="~axes_scale/yaw" value="-1.0" />
        <param name="~axes_scale/throttle" value="" />

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

<!-- joystick axis scale -->
        <param name="~axes_scale/roll" value="-1.0" />
        <param name="~axes_scale/pitch" value="1.0" />
        <param name="~axes_scale/yaw" value="-1.0" />
        <param name="~axes_scale/throttle" value="1.0" />

Подписка решилась изменением mavteleop на это:

load_map(axes_map, '/mavros/axes_map/')
load_map(axes_scale, '/mavros/axes_scale/')
load_map(button_map, '/mavros/button_map/')

Скоро сделаю пиар.

PR сделан в №143.

Меня смутила форма множественного числа топоров.

Вы применяете параметры не к тому узлу. Я толком скрипт запуска делал.

Вы применяете параметры не к тому узлу. Я толком скрипт запуска делал.

Да теперь я понимаю! Спасибо! Отменим тогда пиар.

Использование:

  1. начать соединение FCU: roslaunch mavros px4.launch
  2. начать дистанционную операцию: roslaunch mavros_extras teleop.launch

Или создайте свой собственный запуск с <include file="..."> для обоих файлов.

Использование:
запустить соединение FCU: roslaunch mavros px4.launch
начать дистанционную операцию: roslaunch mavros_extras teleop.launch

Спасибо! Тогда попробую!

Теперь все работает нормально :) Просто нужно было изменить yaml и все готово (проверьте 289fa6c - должно быть roll bot poll ). Сейчас я буду тестировать это на GCS HIL, чтобы посмотреть, как это пойдет. Что нужно сделать с частью position @vooon?

Я готовлюсь к вылетам на выходных, так что все в порядке ..

Я готовлюсь к вылетам на выходных, так что все в порядке ..

Если вы укажете myabe, я могу попробовать

Исправлю опечатку.
Также необходимо добавить ограничения загрузки RC из параметров FCU.

Кстати только что заметил, что в прошивке PX4 стоит 500 вилок!

Кстати только что заметил, что в прошивке PX4 стоит 500 вилок!

: D Неудивительно, учитывая огромное сообщество, использующее производные от Pixhawk и PX4 проекты.

Просто хотел это прокомментировать. Я собирался написать что-то вроде того, как увидел эту проблему. Это похоже на то, что сообщество прочитало мои мысли: D. Протестировал, работает отлично.

@pmukherj Не могли бы вы вкратце описать, как это работает в чистой системе. Я буду расширять, тестировать и адаптировать, чтобы добавить это в вики.
Спасибо.

@mhkabir Я думаю, лучшее место на вики-страницах с учебниками (в настоящее время не существует в пространстве mavros).

@vooon Я имел в виду PX4 wiki :) Я могу добавить заметку в README.

Конечно! Я хочу убедиться, что не предпринял никаких лишних шагов (обновление прошивки до версии для разработчиков могло не потребоваться и т. Д.). Я сегодня кое-что напишу.

@mhkabir Я не мог летать сегодня из-за плохой погоды в Канаде, но во время стендовых испытаний заметил, что при отправке ненулевой команды r, p, y (с помощью джойстика) слышимого изменения мощности двигателя не происходит. Когда я управляю тягой (с помощью джойстика f710), я слышу, как двигатели завывают вверх-вниз. Когда я поворачиваю корпус квадрокоптера, я слышу завывание двигателей и пытаюсь компенсировать это. Однако, когда я даю ему большую команду ar, p, y на цель через команду уставки / отношения, такая компенсация не слышна. Реализованы ли какие-либо сообщения обратной связи как часть mavros, что-то, что подтверждает выполнение команды (может быть, отдельные мощности двигателя или что-то в этом роде?).
Я действительно хочу убедиться, что это работает, прежде чем задокументировать это, и предпочитаю доказать это на стенде, а не в аварии: P.

@pmukherj Не могли бы вы
Есть сообщение LOCAL_POSITION_TARGET_NED и сообщение ATTITUDE_TARGET, которых нет в mavros. Я исправлю это как часть рефакторинга кода, который мы хотим провести для подключаемых модулей задания. Также для этих целевых потоков контроллера вам необходимо явно передать их на стороне PX4.
Внешнее управление является экспериментальным, и этот плагин не тестировался, поэтому я еще не уверен, где что-то пошло не так. Мне нужно больше данных.

Извините, верно, я был занят выполнением нескольких DAQ-полетов.
Итак, ATTITUDE_TARGET звучит именно так, как мне нужно, чтобы убедиться, что pixhawk пытается выполнить команды джойстика, которые я ему отправляю. У меня есть 3DR, pixhawk с установленным на нем компьютером большего размера (стек px4, кстати, работает потрясающе, просто отсутствуют некоторые режимы полета).

Я могу изучить это, или у вас есть вилка с этим реализованным?

@pmukherj Я собираюсь
Какой бортовой компьютер-компаньон вы используете?
Что касается целей, вам действительно не нужно ничего реализовывать. Просто используйте мост UDP, который есть на mavros, и пропатчите ссылку на QGC на вашем компьютере разработчика. Там можно все просмотреть и нанести на карту.

Извините! Переезд офисов на новый год.
Тестирую на всех компьютерах (odroids, TK1 и т. Д.). Я попробую использовать мост UDP.
Я предполагаю, что могу использовать любое из телеметрических подключений к pixhawk? В дополнение к компьютеру-компаньону у меня также есть беспроводное соединение с одним из портов телеметрии (стандартно для 3DR pixhawk).

Ага. Проверено, что уставки действительно работают! Внутренние уставки принимают его, и выходы контроллера также видны. Теперь о летных испытаниях :). Пожелай мне удачи.

@pmukherj Вы можете подключить спутник к порту TELEM2 и запустить его через extras.txt на карте microSD.
Хорошо, что уставки работают. Удачи с полетами.
Пожалуйста, проверьте: http://www.pixhawk.org/dev/ros/mavros_offboard
Внизу есть пустая строка кода, где вы должны добавить команду mavros, которую вы использовали для перехода в автономный режим (как вариант для людей, если они хотят)

Также можете добавить сюда заказ на летные испытания: http://www.pixhawk.org/dev/offboard_control/testing

Просто поставь точки, а я уберу.

@vooon Плагин джойстика работает нормально, но слишком сильно вылетает, если одна из осей не найдена или находится вне диапазона и т. д.

Мы можем добавить ограничение min / max.

Обратите внимание, что это не был плагин, node.

Правда ;)
Я думаю, что сделаю это как плагин, так как скрипт / питон кажется довольно запутанным + ненадежным.

Мне не нужен плагин, потому что он изобретает колесо. Максимальное переписывание с питона на C ++.
Но на самом деле это не нужно, когда mavteleop работает на десктопе и контролирует mavros OBC.

@vooon вы думали, как решить эту проблему ?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги