Технический форум по робототехнике.
chinga » 12 окт 2011, 13:46
задача только найти направление, а координаты не обязательно. надо просто повернуть камеру с центра датчика туда, откуда будет издаваться звук)
Добавлено спустя 5 минут 14 секунд:Известно лишь разница по времени прихода звука
пока и это не известно. по теорий работать должно, но это даже не выходит на практике.
вот только что попытался находить с АЦП, то есть включить АЦП и выводить на ЖК данные, но АЦП даже не может найти с лева или справа звук.
вот код:
- Код: Выделить всё • Развернуть
/*****************************************************
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
#define ADC_VREF_TYPE 0x60
unsigned int adc1 = 0;
unsigned int adc2 = 0;
unsigned char read_adc(unsigned char adc_input){
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void){
unsigned char ch1[20];
unsigned char ch2[20];
int i;
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 16
lcd_init(16);
lcd_gotoxy(2,0);
lcd_puts("loading...");
delay_ms(1000);
for(i = 0; i<16; i++){
lcd_gotoxy(i,1);
lcd_putchar(0xff);
delay_ms(500);
}
lcd_clear();
lcd_gotoxy(3,0);
lcd_puts("start test");
delay_ms(1000);
lcd_clear();
while (1){
adc1 = read_adc(0);
adc2 = read_adc(1);
sprintf( ch1,"adc1=%u", adc1 );
lcd_gotoxy(9,0);
lcd_puts(ch1);
sprintf( ch2,"adc2=%u", adc2 );
lcd_gotoxy(0,0);
lcd_puts(ch2);
if(adc1 > adc2 && adc1 > 5){
lcd_gotoxy(9,1);
lcd_puts("------>");
delay_ms(2000);
}
if( adc2 > adc1 && adc2 > 5){
lcd_gotoxy(0,1);
lcd_puts("<------");
delay_ms(2000);
}
delay_ms(100);
lcd_clear();
}
}
вопрос такой возник, вот в этом строчке
- Код: Выделить всё • Развернуть
adc1 = read_adc(0);
adc2 = read_adc(1);
он сначала берет данные с ножки А0, потом с ножки А1? а в это время когда он будет брать данные с А0, А1 не исчезнет? или он сохранит до следующего вызова? прост звук слишком быстро двигается, и хватит ли мига что бы взять точные данные с обоих ножек?
Radist » 12 окт 2011, 13:55
Попробую доказать без математики. Берем два кола, вбиваем их в землю, расстояние между ними обзываем базой. Берем три веревки, две одинаковой длины (звук распространяется во все стороны одинаково), а третья веревка - это дельта (она превращается в длину умножением полученного времени на скорость звука). Одну веревку удлинняем, привязываем каждую к своему колу и смотрим где веревки сойдутся. Там был источник звука. Помечаем это место. Теперь берем другие две одинаковые веревки, привязываем ту же самую третью - и получаем другой источник звука. То есть есть куча точек, в которых может находиться источник звука, при этом разность по времени между ушами будет одинаковая.
Про координаты вроде доказал, теперь про направление.
Кто раньше услышал - с той стороны и звук. Но насколько повернуть башку? Можно это делать итеррационно, если звук будет звучать периодически. С одного раза уставиться на источник звука не получится. Зато известен критерий что источник звука прямо спереди - разность равна нулю. А по программе не подскажу, не знаю почему не получается.
chinga » 12 окт 2011, 14:04
нужно просто. хлопок, и повернул голову туда, откуда хлопок. кто первый услышал, с его стороны звук. это я уже делал, но тут проблема, время не можем находить точное. глючит странно. то 10, то 1000 может показать. код есть, самый первый код в теме. с АЦП что то не получается, не можем находить даже с какой стороны звук.
Добавлено спустя 3 минуты 25 секунд:
кстати, еще что то, узнал при эксперименте: точнее находит, то есть выводит реальный результаты(это не 0, и не миллион) когда звук издается долго) ну когда просто хлопок быстрый, время покажет 0, а когда ну звук по дольше, типа "аааааааааа", выводит результаты более близкие к точным результатам) но и то глючить начнет после 2-3 раза.
Radist » 12 окт 2011, 14:14
Путем графических построений я смог получить направление на источник звука. Поэтому отзываю свои возражения. Действительно, разности достаточно. А если разность нулевая - значит направление прямо спереди.
chinga » 12 окт 2011, 14:22
Radist писал(а): А если разность нулевая - значит направление прямо спереди.
да.
по теорий, да, должно работать. на улице нужно было проверить, но щас ветер то сё, есть еще виновник, эхо, отраженные звуки)
Добавлено спустя 3 минуты 5 секунд:Strijar писал(а):А мне вот не понятно зачем там 3 датчика? Разве 2-х не достаточно? Пришел сначало в правый - ждем пока появиться в левом, пришел в левый - ждем правый. А может проще - записывать звук постоянно через АЦП и делать свертку между двумя каналами?
неа. не получается) даже не может определить с какой стороны звук
Vovan » 12 окт 2011, 14:22
Звук - штука очень не точная. Даже человек с его суперкомпом в голове определяет источник единичного звука с точностью чуть больше 50%. У животных (с тоже неслабыми возможностями) этот показатель несколько выше, но все равно не превышает 70%. С продолжающимся звуком (или повторными звуками) картина естесно другая (почитать про бинаруальный слух ИМХО иногда полезно)...
кто первый услышал, с его стороны звук. это я уже делал
А теперь просто: нужно не просто повернуться в сторону ПРОТЯЖНОГО звука, а уравнять (поворотом "головы") время прихода звука на оба уха - это и будет искомое направление
ИМХО точная ориентировка, или выведение показаний ориентировки при одиночном звуке - обречено на провал...
chinga » 12 окт 2011, 14:26
Vovan писал(а):А теперь просто: нужно не просто повернуться в сторону ПРОТЯЖНОГО звука, а уравнять (поворотом "головы") время прихода звука на оба уха - это и будет искомое направление
не понял
можете step by step?
Роботов » 12 окт 2011, 14:31
Radist писал(а): А если разность нулевая - значит направление прямо спереди.
Или прямо сзади
chinga » 12 окт 2011, 14:33
Роботов писал(а):Или прямо сзади
ну мы пока только спереди смотрим))
Vovan » 12 окт 2011, 14:48
можно и <постепенно>:
1.
кто первый услышал, с его стороны звук. это я уже делал
и поворачиваемся* в сторону звука, например на 30град.
2. снова scan
3. "кто первый услышал" в эту сторону поворот на 15град
4. снова scan
5. "кто первый услышал" в эту сторону поворот на 5град
6. снова scan
7. слышим одновременно, поворачиваться не нужно - звук впереди.
*если поворот производить медленно, то следующие пункты происходят во время поворота.
Я описал алгоритм по которому действуют не только люди, но и животные - методом уточнения при определении направления источника звука.
ЗЫ: а ещё, многие из нас, примерно по такому принципу, выводят своих роботов к зарядной станции, только вместо ушей ИК датчики: видим одним датчиком - поворачиваемся до тех пор пока не увидим вторым и тогда прямо
, а если при движении прямо с одного датчика сигнал исчезает - соответствующий доворот. До этого же, просто беспорядочно ездим-вертимся до тех пор пока не увидим хоть что-то...
chinga » 12 окт 2011, 15:01
тут каждый раз надо издавать звук пока он не найдет? а если просто один хлопок?
Vovan » 12 окт 2011, 15:08
Вот поэтому существует правило которое придумал один очень уважаемый всеми роботостроителями человек.
Сказал он примерно так: поведение робота предсказать несложно, достаточно оснастить себя его (робота) возможностями и датчиками и посмотреть что будет.
Конечно, он имел ввиду наше воображение.
Т.е. нужно представить, в данном случае, что я имею только два микрофона и мне нужно точно повернуться в сторону хлопка. Вот и фсё
chinga » 12 окт 2011, 15:12
ну я тоже использую два микрофона))
и не могу повернуть голову туда откуда издается звук)
или я вас не понимаю)
Vovan » 12 окт 2011, 15:30
"))" - надо понимать как "." ?
а ")" - как "?" ? Да?
Ну во-первых у нас (у людей) есть не только два микрофона, но и много других помощников (зрение, опыт, интелект... да и возможности нашего мозга намного превышают возможности несчастного МК...). Если глаза закроем, то остальное отключить то мы не можем, а если всё же попытаться как-то заблокировать свой опыт и интелект, то ведь ничто не мешает попробовать: с закрытыми глазами точно определить откуда раздался хлопок.
Ну, а во-вторых даже если это и удастся 1 раз, то 2-й, 3-й,... n-й разы - уверен будут мимо кассы, а точнее - я писал выше - чуть больше 50%
Добавлено спустя 8 минут:Да, забыл ещё добавить, что для чистоты эксперемента, нам нужно в ухо вставить и АЦП, чтобы мы могли оценивать ТОЛЬКО время прихода звука на наши "микрофоны" и исключить оценку по интенсивности (т.е. по амплитуде), ведь очевидно, что ухо повернутое в сторону звука лучше (громче) его слышит
chinga » 12 окт 2011, 15:35
и "))" и ")" ничего не означает, можно и поставить просто точку)
но теперь какой способ можно применить?
человек, не может повернуть голову точно туда откуда издастся звук. примерно может определить. есть и типа тарелка антенны
который определяет явно и точно сзади или спереди, и справа или слева. но точно градус не может определить. ну так приблизительно может. а мое устройство может только находить слева или справа. и надо чуть поточнее откуда именно)
и еще, человек может определить звук самого хлопка и его отраженные сигналы, и мк все сигналы.