Управление через интернет

baychi
Korogodsky:

Если б китайцы туда дальнобойное видео воткнули на 70км

Загрузка точек, слежение и т.п. там есть. Видео можете передавать любым способом (собственно АП с видео не связан, OSD - внешний модуль). Программа жесткая, да. Но и цена 250$ всего. 😃

Korogodsky
cstrike:

вот на этом компе есть акселель wiki.ladyada.net/chumbyhackerboard

Интересная вещь, акселерометров я так понимаю не достаточно…

baychi:

Загрузка точек, слежение и т.п. там есть. Видео можете передавать любым способом (собственно АП с видео не связан, OSD - внешний модуль). Программа жесткая, да. Но и цена 250$ всего.

Управления сервоприводами нет и вообще управления 😉 полет исключительно по точкам, хотелось бы рулить, к тому же это должно работать и на земле. В общем я хочу сказать FY-21AP всех задач не решает, хотя и хорошая штука видимо, я про него еще не дочитал, но сложилось впечатление, что работает не всегда стабильно.

Я конечно понимаю, что буду вглядеть странно, но скажите как может повести себя FY-21AP при скажем 3х часовом полете, накопится ли ошибка определения положения в пространстве, можно ли реинициализировать с компьютера в полете, на сколько его вообще хватит работать без ошибки?

Frr
Korogodsky:

Хотелось бы услышать мысли по расчету азимута,

Азимут, направление движения выдает gps в строчке GPRMC. (или он не подходит?)

Korogodsky

Встроил получение текущих GPS координат с приемника и передачу/прием с борта на базу, теперь текущая позиция показывается на карте в реальном времени, можно еще заняться вычислением направления движения, чтобы крутить камеру в 3D режиме в GoogleEarth в соответствии с тем в каком направлении движется модель. Но хочется уже заняться железом для наземных испытаний, подготовить шоссейное авто к тому моменту как сойдет снег. И еще нужно оптимизировать передачу видео.

Frr:

Азимут, направление движения выдает gps в строчке GPRMC. (или он не подходит?)

Спасибо за совет, я еще не разобрался полностью 😉

Korogodsky
Frr:

Азимут, направление движения выдает gps в строчке GPRMC. (или он не подходит?)

Это то что надо!

baychi

В FY21Ap управление серввоприаодами есть (иначе как он моделью управляет? 😉). Коробочка пполностью управляется через UART. Фактически в Вашем случае это полностью упроавляемый PPM контролер, источник информации о об ориентации и положении в пространстве (горизонт, курс, координаты, 2 вида высоты, напревление на цель с воозможностью смены цели в любой ммомент) и готовый алгоритм авттопилота. Причем Вы можете упралять им как угодно… Можете сами выдавать воздействич на сервы, можете включить стабилизацию и рулить только курсом, а можете вообще лишь задавать кооррдинатыиего АП.

Korogodsky
baychi:

В FY21Ap

Со временем я думаю можно встроить поддержку FY21AP. Мне самому ситуация с единственным поддерживаемым серво-контроллером не нравится 😃 Но и зацикливаться на FY я бы не стал (например вполне могут прекратить его производство). А как быть с реинициализацией в воздухе и многочасовым полетом?

baychi

Проблем с многочасовым полетом нет. Горизонт фишка держит по гироскопам и акселям - то есть постоянно корректирует. Просто детально рассматрев Инет, как канал сязи, вы еще не касались детально собственно управленя ЛА. А фишка имеет все что для этого требуется. 😃

Korogodsky
baychi:

детально рассматрев Инет, как канал сязи, вы еще не касались детально собственно управленя ЛА

Уже сейчас можно начать разрабатывать автопилот и он будет управлять моделью, но вопрос в том, что первый порыв ветра перевернет ее, и модель разобьется. Смущает то что в FY21 есть много “лишнего”, что у меня уже и так есть, но с другой стороны есть например вот такое изделие www.pololu.com/catalog/product/1263 и к нему www.pololu.com/catalog/product/1254 , что в сумме получается еще дороже, в то время как FY21 имеет все что нужно, в общем я пока в раздумьях.

Frr
Korogodsky:

На что нужно обратить внимание

А оно нужно?
Машинке, вроде, не нужен горизонт, хватит и одного gps’а.
Получается управление +обратная телеметрия, +адаптивное rt-видео через интернет, +еще и своя инерциалка, все это обновременно для земли и полета - не много фич?
Проект рискует остаться не завершенным (имхо) 😃 .

Stas#

Ну дак он же хочет сделать АП для самолета, а на машинке только провести первые опыты. Для машинки действительно не надо.
А чего проект будет незавершен. У него уже для установки на машинку все +/- готово.

Павел_Б
Korogodsky:

Уже сейчас можно начать разрабатывать автопилот и он будет управлять моделью

А мне кажется надо подумать об альтернативном варианте системы в принципе.
Передача видео и управление ЛА в реальном времени через интернет - это конечно круто, но в большинстве случаев работать не будет.
А вот если сделать систему по типу Гугл локатор? Модель летит сама, на автопилоте, по заданным точкам, записывает себе видео в HD, а вы видите её на карте, кстати наверное не сложно
использовать тот же Гугл, и управлять полётом исключительно по карте, меняя маршрут. Для передачи координат новой точки маршрута достаточно любого канала совтовой связи, и скорость здесь не требуется. Видео правда посмотрите только после приземления, зато получается полноценный UAV. Можно добавить передачу фото высокого разрешения с выбранных точек маршрута.

Stas#

Ну так я понимаю, что данный режим тоже будет реализован. Не даром же гугл-карту лепили в прогу.

Korogodsky
Павел_Б:

а вы видите её на карте

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

Кстати нашел баг, теперь наверное получится поднять FPS.
На следующих выходных планирую прокатиться на машине (за рулем) со всем этим хозяйством, дома будет записываться видео, на записи посмотрю как на ходу работает.

Z_Z_Z

Респект топикстартеру! Еще полгода назад мучали мысли реализации данной идеи. Только при отсутствии йоты пытался сделать с 3G-модемом, про видео сразу пришлось забыть, и идея потухла.
UncleSam, по поводу использования ARM и платы Mini2440, у меня есть эта плата, есть камера, есть вафля.
Что хочется сказать, вайля из комплекта не имеет драйверов под линукс.
Транслировал через MJpeg-Streamer картинку с родной камеры в линухе - задержка 0,5+секунд.
Если использовать без ОС- задержки нет, но и сети тоже нет.
Подключить сервы напрямую к платке не получится в линухе (не RTOS)
В общем если хотите, проконсультирую по наработкам в области этой платы.

По теме,

Korogodsky:

На что нужно обратить внимание при выборе подобного устройства?

3D компасс не нужен.
вот www.sparkfun.com/products/10010 по сути дела представляет из себя датчиковую основу того же FY20, тот же аксель, те же гиры.
Останется софтовая составляющая.
Есть под ЮСБ www.toradex.com/En/…/3_Axes_Acceleration
И вообще можно собрать что то свое.
Самое дешевое что можно найти по подобной теме:
cgi.ebay.com/…/190478609162
тот же аксель, гироскоп получше, но только 2-осевой… в теории такое устройство незаметит только вращения в горизонтальной плоскости без изменения направления, что сложно себе представить в масштабах реальной модели.

Korogodsky
Z_Z_Z:

У этого устройства есть и акселерометры и гироскопы или только гироскопы?

А что еще можете хорошего/плохого сказать про устройство с компасом по моей ссылке?

И как можно использовать показания компаса?

Z_Z_Z:

в теории такое устройство незаметит только вращения в горизонтальной плоскости без изменения направления, что сложно себе представить в масштабах реальной модели

такое можно себе представить, если модель способна зависать в воздухе.

Z_Z_Z
Korogodsky:

У этого устройства есть и акселерометры и гироскопы или только гироскопы?

Конкретно у этого устройства только аксель, там на сайте отдельно есть гиры, компасс, датчик давления, тока, и прочее…
Но не советую связываться с этим сайтом, интересовался их компьютером размером с пластиковую карту:
www.toradex.com/Robin-Z530L
однако доставка у них не самая дешевая, да и отправляют они DHL’ом, да и есть еще нюансы…

Korogodsky:

А что еще можете хорошего/плохого сказать про устройство с компасом по моей ссылке?

Лишний компас, как использовать его показания непонятно, цена не гуманная, и нет описания использованных датчиков, хотя параметры вроде ниче.
Вот этот:
robotshop.com/sfe-imu-16g-triple-axis-accel-three-…
по крайней мере на всем известной базе, с известными датчиками, и с последовательным выходом информации.

msv

Компас поможет АП разобраться, что модель летит против ветра хвостом вперед (случай не надуман…).
В последней ссылке, как понял, на плате есть проц, но нет софта…
Вот все жду, надеюсь, может хоть в какой ветке появится обсуждение реальных алгоритмов авиагоризонта…

RW9UAO
Z_Z_Z:

Подключить сервы напрямую к платке не получится в линухе

ну прямо как дети. используйте один из таймеров процессора напрямую.


#include <time.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/neutrino.h>
#include <gulliver.h>
#include <inttypes.h>
#include <unistd.h>
#include <float.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#include "main.h"
#include "AT91SAM9260.h"


static const struct sigevent * TC1_intr (void *area, int id){
  unsigned int a;
  a = ((AT91PS_TCB)TC_base)->TCB_TC1.TC_SR;

    if(inPPMchannel < MAX_CH){
    inPPMvalues[inPPMchannel] = ((AT91PS_TCB)TC_base)->TCB_TC1.TC_RA;
    inPPMvalues_ms[inPPMchannel] = inPPMvalues[inPPMchannel] * 1280 / 1000;
    if(inPPMvalues_ms[inPPMchannel] < 1000 || inPPMvalues_ms[inPPMchannel] > 2000){
      inPPMchannel = 0;
      return 0;
    }
    inPPMchannel++;
  }

  if(inPPMchannel == MAX_CH){
    values_ms[0] = inPPMvalues_ms[0];
    values_ms[1] = inPPMvalues_ms[1];
    values_ms[2] = inPPMvalues_ms[2];
    values_ms[3] = inPPMvalues_ms[3];
    values_ms[4] = inPPMvalues_ms[4];
    values_ms[5] = inPPMvalues_ms[5];
  }

//это пауза между посылками
  if( ((AT91PS_TCB)TC_base)->TCB_TC1.TC_RB > 5000){
    inPPMchannel = 0;
//    ll++;
  }
  return 0;
}
//------------------------------------------------------------------------------------
static const struct sigevent * TC0_intr (void *area, int id){
  unsigned int a;
  int temp;
//read for reset flags
  a = ((AT91PS_TCB)TC_base)->TCB_TC0.TC_SR;

//переведем длинну пакета из мСек в тики таймера
  if(channel < MAX_CH){
  if(values_ms[channel] > 2000) values_ms[channel] = 2000;
  if(values_ms[channel] < 1000) values_ms[channel] = 1000;
  values[channel] = values_ms[channel] * 1000 / 1280;
  }

  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_RA = pause_len;
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_RC = values[channel] - pause_len;

#ifndef SUM_PPM
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_RC = values[channel];
  ((AT91PS_PIO)PIOA_base)->PIO_CODR = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
  switch(channel){
  case 0:
    ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH1;
  break;
  case 1:
    ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH2;
  break;
  case 2:
    ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH3;
  break;
  case 3:
    ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH4;
  break;
  case 4:
    ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH5;
  break;
  case 5:
//    ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH6;
  break;
  }
#endif

  channel++;
  if(channel >= MAX_CH + 1){
  channel = 0;
  temp = total_len - values[0] - values[1] - values[2] - values[3] - values[4] - values[5];
#ifdef SUM_PPM
  temp += pause_len * MAX_CH;
#endif
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_RA = pause_len;
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_RC = temp;
  }
  return 0;
}
//------------------------------------------------------------------------------------
void timers_init(void){
int errvalue;
int TC0_int;

// PPM формирование
    errno = EOK;
    PIOA_base = mmap_device_memory( 0, 0x100, PROT_READ|PROT_WRITE|PROT_NOCACHE,
           MAP_PHYS|MAP_SHARED, (uint64_t)0xFFFFF400 );//AT91C_BASE_PIOA
    errvalue = errno;
    if (PIOA_base == (unsigned char *) MAP_DEVICE_FAILED){
        fprintf(stderr, "Unable to map AT91C_BASE_PIOA\r\n");
        fprintf(stderr, "The error generated was %d\r\n", errvalue );
        fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
        exit(1);
    }
#ifdef SUM_PPM
  // Configure PIO controllers to periph mode
  fprintf(stderr, "UAV: summary PPM output\r\n");
  ((AT91PS_PIO)PIOA_base)->PIO_ASR = AT91C_PA26_TIOA0 | AT91C_PA27_TIOA1;
  ((AT91PS_PIO)PIOA_base)->PIO_BSR = 0;
  ((AT91PS_PIO)PIOA_base)->PIO_PDR = AT91C_PA26_TIOA0 | AT91C_PA27_TIOA1; // Set in Periph mode
#else
  // Configure PIO controllers to output
  fprintf(stderr, "UAV: channel PPM output\r\n");
  ((AT91PS_PIO)PIOA_base)->PIO_PER = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
  ((AT91PS_PIO)PIOA_base)->PIO_OER = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
  ((AT91PS_PIO)PIOA_base)->PIO_CODR = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
  ((AT91PS_PIO)PIOA_base)->PIO_ASR = AT91C_PA27_TIOA1;
  ((AT91PS_PIO)PIOA_base)->PIO_BSR = 0;
  ((AT91PS_PIO)PIOA_base)->PIO_PDR = AT91C_PA27_TIOA1; // Set in Periph mode
#endif
//-------------------------------------
//TC0 Configure
    errno = EOK;
    TC_base = mmap_device_memory( 0, 0x100, PROT_READ|PROT_WRITE|PROT_NOCACHE,
           MAP_PHYS|MAP_SHARED, (uint64_t)0xFFFA0000 );//AT91C_BASE_TC0
    errvalue = errno;
    if (TC_base == (unsigned char *) MAP_DEVICE_FAILED){
        fprintf(stderr, "Unable to map AT91C_BASE_TC\r\n");
        fprintf(stderr, "The error generated was %d\r\n", errvalue );
        fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
        exit(1);
    }
  //TC Block Mode Register
  ((AT91PS_TCB)TC_base)->TCB_BMR = 0;//TCLK0, TCLK1, TCLK2

  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_IDR = 0xFFFFFFFF;    //disable all ints
  // MCK/128
#ifdef SUM_PPM
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE
    | AT91C_TC_ACPA_SET | AT91C_TC_ACPC_CLEAR;
#else
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE;
#endif
  errno = EOK;
  if(ThreadCtl( _NTO_TCTL_IO, 0 ) == -1){
  errvalue = errno;
        fprintf(stderr, "Unable to ThreadCtl( _NTO_TCTL_IO, 0 );\r\n");
        fprintf(stderr, "The error generated was %d\r\n", errvalue );
        fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
  }
  // Attach interrupt
  errno = EOK;
  fprintf(stderr, "UAV: InterruptAttach TC0 ");
  TC0_int = InterruptAttach(AT91C_ID_TC0, TC0_intr, NULL, 0, 0);
  if(TC0_int == -1){
  fprintf(stderr, "\r\nCan`t attach interrupt 0x%x\r\n", AT91C_ID_TC0);
        fprintf(stderr, "The error generated was %d\r\n", errvalue );
        fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
  }else{
  fprintf(stderr, "OK\r\n");
  }
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_IER = AT91C_TC_CPCS;// RC Compare
  ((AT91PS_TCB)TC_base)->TCB_TC0.TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
//-------------------------------------
// разрешим вывод TIOA1 на вход in a TC0 init
//TC1 Configure
  ((AT91PS_TCB)TC_base)->TCB_TC1.TC_IDR = 0xFFFFFFFF;    //disable all ints
  // MCK/128
  ((AT91PS_TCB)TC_base)->TCB_TC1.TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_ABETRG |
  AT91C_TC_ETRGEDG_RISING | AT91C_TC_LDRB_RISING | AT91C_TC_LDRA_FALLING | AT91C_TC_CPCTRG;
// установим обработчик прерывания на TC1 для захвата РРМ пакета
  errno = EOK;
  if(ThreadCtl( _NTO_TCTL_IO, 0 ) == -1){
  errvalue = errno;
        fprintf(stderr, "Unable to ThreadCtl( _NTO_TCTL_IO, 0 );\r\n");
        fprintf(stderr, "The error generated was %d\r\n", errvalue );
        fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
  }
  errno = EOK;
  fprintf(stderr, "UAV: Interrupt Attach TC1 ");
  TC0_int = InterruptAttach(AT91C_ID_TC1, TC1_intr, NULL, 0, 0);
  if(TC0_int == -1){
  fprintf(stderr, "\r\nCan`t attach interrupt 0x%x\r\n", AT91C_ID_TC1);
        fprintf(stderr, "The error generated was %d\r\n", errvalue );
        fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
  }else{
  fprintf(stderr, "OK\r\n");
  }
// установим уровень срабатывания
  ((AT91PS_TCB)TC_base)->TCB_TC1.TC_IER = AT91C_TC_ETRGS;// External Trigger
  ((AT91PS_TCB)TC_base)->TCB_TC1.TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}