Вход в Aeronet: запуск автономного квадрокоптера в виртуальной среде / Хабр

File transmission between two computers via ssh

When using subprocess.call, you don’t need to add extra quotes because spaces are not delimiters. Also, since the shell is not involved locally, output redirection with > doesn’t work. The > will be sent to remote host and will run remotely. To redirect the actual local command to a file, you must use subprocess PIPE output capturing by passing a parameter named stdout:

with open('telemetry', 'wb') as f:
    subprocess.call(["ssh", "pi@B", "cat telemetry"], stdout=f)

That should fix your issue and answer your question «What am I doing wrong?» — however, as others have pointed out in the comments, you should consider using scp, sshfs or even a paramiko session instead of running a remote cat to copy files.

Ros — урок 14 — написание простого сервиса и клиента (python) / технологии / robocraft. роботы? это просто!

1. Написание простого сервиса и клиента (Python)

Описание: Этот урок описывает, как писать узлы сервиса/службы и клиента (Service and Client) на питоне.

1.1 Написание узла Сервиса (Service Node)

Здесь мы создадим узел сервиса («add_two_ints_server»), который будет получать два целых числа и возвращать их сумму.

Перейдите в каталог пакета beginner_tutorials, который вы создали на :

roscd beginner_tutorials

Пожалуйста, убедитесь, что вы следовали инструкциям на уроках, т.к. для создания сервиса необходимо наличие файла AddTwoInts.srv

1.1.1 Код

Создайте файл nodes/add_two_ints_server.py в пакете beginner_tutorials и вставьте внутрь следующий код:

#!/usr/bin/env python
import roslib; roslib.load_manifest('beginner_tutorials')

from beginner_tutorials.srv import *
import rospy

def handle_add_two_ints(req):
    print "Returning [%s   %s = %s]"%(req.a, req.b, (req.a   req.b))
    return AddTwoIntsResponse(req.a   req.b)

def add_two_ints_server():
    rospy.init_node('add_two_ints_server')
    s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
    print "Ready to add two ints."
    rospy.spin()

if __name__ == "__main__":
    add_two_ints_server()

Не забудьте сделать файл узла исполняемым:

chmod  x nodes/add_two_ints_server.py

1.1.2 Разъяснение кода

Теперь давайте разберём код.

Для написания сервиса с помощью rospy требуется совсем немного. Мы заявляем о своём узле с помощью init_node() и затем объявляем наш сервис:

s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)

Это объявление имени нового сервиса add_two_ints с типом услуги — AddTwoInts. Все запросы, передаются функции handle_add_two_ints. handle_add_two_ints вызывается с экземплярами AddTwoIntsRequest и возвращает экземпляры AddTwoIntsResponse.

Так же, как с примером подписчика, rospy.spin() удерживает ваш код от выхода, пока сервиса не будет отключён.

1.2 Написание клиентского узла (Client Node)

1.2.1 Код

Создайте файл nodes/add_two_ints_client.py в пакете beginner_tutorials и вставьте в него следующий код:

#!/usr/bin/env python
import roslib; roslib.load_manifest('beginner_tutorials')

import sys

import rospy
from beginner_tutorials.srv import *

def add_two_ints_client(x, y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        resp1 = add_two_ints(x, y)
        return resp1.sum
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

def usage():
    return "%s [x y]"%sys.argv[0]

if __name__ == "__main__":
    if len(sys.argv) == 3:
        x = int(sys.argv[1])
        y = int(sys.argv[2])
    else:
        print usage()
        sys.exit(1)
    print "Requesting %s %s"%(x, y)
    print "%s   %s = %s"%(x, y, add_two_ints_client(x, y))

Не забудьте сделать файл узла исполняемым:

chmod  x nodes/add_two_ints_client.py

1.2.2 Разъяснение кода

Теперь давайте разберём код.

Смотрите про коптеры:  Калибровка квадрокопрета – как настроить и откалибровать квадрокоптер |

Клиентский код для вызова сервиса также прост. Для клиентов, вам не нужно вызывать init_node(). Первым идёт вызов:

rospy.wait_for_service('add_two_ints')

— это удобный метод, который блокирует выполнение скрипта, пока сервис с именем add_two_ints не станет доступен. Далее, мы создаем дескриптор (handle) для вызова сервиса:

add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)

Мы можем использовать этот дескриптор так же, как нормальную функцию и просто вызовем его:


	resp1 = add_two_ints(x, y)
	return resp1.sum

Так как, мы объявили тип сервиса, как тип, который принимает AddTwoInts, то вызов add_two_ints осуществляет генерацию запроса AddTwoIntsRequest. Возвращаемое значение — это объект AddTwoIntsResponse. Если вызов не удался, то возможно возникновение ислючение rospy.ServiceException, так что вы можете установить соответствующий блок try/except.

1.3 Сборка ваших узлов

Мы используем CMake в качестве нашей системы сборки, да, вы должны использовать его даже для узлов Python. Это делается для того, чтобы убедиться, что создается автоматически сгенерированный Python-код для сообщений и сервисов. Мы также используем Makefile для удобства.

roscreate-pkg автоматически создаёт Makefile, так что вам не придется его редактировать.

Для сборки запустите:

$ make

Теперь, когда вы написали простой сервис и клиента, давайте .

Ссылки:

Ros import srv message — relative import jump issue

I am currently having some issue importing .srv files i’ve defined somewhere which i can’t import into my service_def.py file.. Why is that not possible?

I made it as a rosnode, my src folder of the catkin_workspace looks like this

.
├── CMakeLists.txt -> /opt/ros/indigo/share/catkin/cmake/toplevel.cmake
└── service
    ├── CMakeLists.txt
    ├── include
    │   └── service
    │       ├── __init__.py
    │       ├── service_def.py
    │       └── service_def.pyc
    ├── package.xml
    ├── setup.py
    ├── src
    │   └── service_node.py
    └── srv
        ├── get.srv
        ├── set.srv
        └── __init__.py

service_def.py is defined as such

from ..srv import *

And my service_node.py which i rosrun imports service_def.py

import service.service_def

So why cant I import my service messages in service_def.py?

error message:

k@k:~/python_service/src$ rosrun service service_node.py 
Traceback (most recent call last):
  File "/home/k/python_service/src/service/src/service_node.py", line 5, in <module>
    import service.service_def
  File "/home/k/python_service/src/service/include/service/service_def.py", line 1, in <module>
    from ..srv import *
ValueError: Attempted relative import beyond toplevel package

My setup.py looks like this:

## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
# fetch values from package.xml
setup_args = generate_distutils_setup(
packages=['service'],
package_dir={'': 'include'},
)
setup(**setup_args)

Systemd-сервис clever переименован в clover

Для перезапуска платформы теперь вместо команды:

sudo systemctl restart clever

используется команда:

sudo systemctl restart clover

The camera orientation configuration changed

See details in the «Camera setup» article.

Wi-fi network configuration

Wi-Fi networks’ SSID is changed to clover-XXXX (where X is a random number), password is changed to cloverwifi.

Включение и выключение raspberry pi

Установленная операционная система хранится на SD-карте, поэтому для работы Raspberry Pi всегда будем использовать эту карту.

Смотрите про коптеры:  Квадрокоптер DJI Phantom 2. - Мир коптеров

Где купить raspberry pi

Raspberry Pi и наборы с ней можно купить у официальных дилеров и их партнеров и в многочисленных интернет-магазинах. Наиболее привлекательные цены, постоянные спецпредложения и бесплатная доставка на сайтах китайских магазинов AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазин Амперка.

Будьте аккуратны при выборе – в продаже имеются разные модели A, A , B, B , Raspberry Pi 2 и Raspberry Pi Zero.

Для первого урока нам понадобится:

  • плата Raspberry Pi;
  • кабель питания с выходом micro USB и напряжением 5V, минимальный ток 700 мА (такой кабель можно купить специально или использовать зарядное устройство с выходом micro USB от телефона, планшета и других гаджетов);
  • USB-клавиатура;
  • USB-мышь;
  • монитор или телевизор с HDMI/RCA/DVI интерфейсом;
  • кабель, один конец которого RCA или HDMI, а другой соответствует вашему монитору;
  • SD-карта от 4 Гб и классом скорости от 4;
  • любой «обычный» компьютер с подключенным интернетом и ридером SD-карт.

Итак, если вы имеете это все, начнем действовать.

Есть три способа установить ос на raspberry pi:

  1. Покупка SD-карты с уже установленной Raspbian или NOOBS. Особого смысла в этом нет. Хотя по цене такая карта выйдет не намного дороже обычной SD-карты того же размера, но ее придется ждать (если заказываете по почте).
  2. Скачивание NOOBS на SD-карту и установка ОС Raspbian с нее.
  3. Монтирование изображения ОС Raspbian прямо на SD-карту, в этом случае можно будет приступать к использованию сразу после включения

Операционные системы для raspberry pi и программа noobs

Плата не имеет предустановленной операционной системы, поэтому первое, что придется сделать — установить ее.

Производитель рекомендует 6 операционных систем (по ссылкам — официальные сайты систем):

Из перечисленных ОС производителем рекомендуется использовать Raspbian, в наших уроках мы будем придерживаться этой рекомендации. По специфике других ОС еще поговорим в дальнейших уроках. Raspbian и остальные перечисленные операционные системы включены в NOOBS. Самый простой способ установить ОС на Raspberry Pi — использовать NOOBS.

Пакет clever переименован в clover

Необходимо заменить все импорты модуля в Python-скриптах.

Было:

import rospy
from clever import srv
from std_srvs.srv import Trigger

rospy.init_node('flight')

get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
land = rospy.ServiceProxy('land', Trigger)


navigate(x=, y=, z=1, frame_id='body', auto_arm=True)

Стало:

import rospy
from clover import srv
from std_srvs.srv import Trigger

rospy.init_node('flight')

get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
land = rospy.ServiceProxy('land', Trigger)


navigate(x=, y=, z=1, frame_id='body', auto_arm=True)

Передача файлов между двумя компьютерами через ssh — python, linux, ssh

При использовании subprocess.call вам не нужно добавлять дополнительные кавычки, потому что пробелы не являются разделителями. Кроме того, поскольку оболочка не задействована локально, перенаправление вывода с помощью > не работает. > будет отправлен на удаленный хост и будет работать удаленно. Чтобы перенаправить действительную локальную команду в файл, необходимо использовать захват вывода PIPE для подпроцесса, передав параметр с именем stdout:

with open('telemetry', 'wb') as f:
    subprocess.call(["ssh", "pi@B", "cat telemetry"], stdout=f)

Это должно исправить вашу проблему и ответить на ваш вопрос»Что я делаю не так?» — однако, как отмечали другие в комментариях, вы должны рассмотреть возможность использования scp, sshfs или даже сеанса paramiko вместо запуска удаленного cat для копирования файлов.

Смотрите про коптеры:  Настройка и пробный полет моего коптера — Паркфлаер

Полёты с помощью программы наземной станции qgroundcontrol

Программа QGroundControl позволяет полностью настраивать дроны на платформах PX4 или ArduPilot, а также планировать и выполнять автономные полёты вне помещений по GPS.

Программы для raspberry pi

В ОС Raspbian имеются различные предустановленные программы, которые можно открыть из меню “Пуск”. Многое предустановленное ПО предназначено для программирования: Scratch, Python, Wolfram и другие. Также представлено около 10 игр, которые можно открыть из программы Python Games. Ну и конечно есть такие стандартные программы, такие как калькулятор, текстовый редактор, браузер и другие.

Путь к файлам платформы изменен

Каталог ~/catkin_ws/src/clever/ переименован в ~/catkin_ws/src/clover. Таким образом, файлы конфигурации (.launch) необходимо редактировать по новому пути.

Например, файл ~/catkin_ws/src/clever/clever/launch/clever.launch теперь называется ~/catkin_ws/src/clover/clover/launch/clover.launch.

Способ настройки ориентации камеры изменен

Подробнее читайте в статье про настройку камеры.

Теперь рассмотрим по шагам альтернативный третий способ.

  1. Скачиваем архив с изображением с сайта.
  2. Распаковываем его, должен получиться файл .img.
  3. Вставляем SD-карту в компьютер (не в Raspberry Pi, в «обычный»)
  4. Монтируем установленный файл (производитель рекомендует Win32DiskImager).
  5. Выполняем пункты 4-6 предыдущей инструкции.
  6. Выполняем пункты 10-12 предыдущей инструкции

Операционная система Raspbian установлена! Можно работать дальше.

Установка и запуск jmavsim на linux ubuntu

Разработчики PX4 в качестве стандартной системы рекомендуют Linux Ubuntu 16.04 LTS. Linux позволяет производить сборку пакета PX4 под все поддерживаемые системы (аппаратные платформы на базе NuttX, Qualcomm Snapdragon Flight, Linux, среды симуляции, ROS).

Первым делом добавляем пользователя в группу «dialout»:

Установка и запуск jmavsim на windows

Набор инструментов PX4 Cygwin появился в 2020 году. Это наиболее производительный способ для компиляции/разработки PX4 под Windows. Для установки – качаем и запускаем установочный файл с Гитхаба или Амазона.

По умолчанию toolchain устанавливается в папку C:PX4.

На последнем шаге инсталлятора можно отметить галочку «clone the PX4 repository, build and run simulation with jMAVSim» (клонировать репозиторий PX4, скомпилировать и запустить симулятор jMAVSim).

Запуск среды разработки в Cygwin осуществляется с помощью файла run-console.bat в каталоге установки (по умолчанию, C:PX4).

Если забыли отметить галочку запуска jMAVSim в процессе установки – в Cygwin можно клонировать репозиторий и запустить симулятор с помощью команд:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector