This is an old revision of the document!
Vajalikud teadmised: [HW] Kommunikatsiooni moodul, [HW] Kasutajaliidese moodul, [LIB] Jadaliides, [LIB] Graafiline LCD, [LIB] Andurid
LIDAR (LIght Detection And Ranging) on optiline kaugseire süsteem, mis kaardistab ümbrust. Lidareid kasutatakse autonoomsete autode ja robotite peal, kuid ka erinevates koobaste ja keskkonna kaardistamise süsteemides ning tööstusrobootikas. Lidar võimaldab saada küllaltki täpse kujutise ruumist ja takistustest.
Lidar koosneb laserist, mis saadab kiire objektini ja vastuvõtjast. Vastuvõtja on võimeline mõõtma valguse tagasipeegeldunud komponenti objektilt, mis on samasihiline saadetud laserkiirega. Selle järgi arvutatakse kaugus. Mõõtmisi tehakse paljudes punktides. Laserkiire juhtimine toimub mehhaaniliselt liigutatava peegli abil. Tasapinnalist skaneerimist võimaldavad lidarid on odavamad. Nende puhul katab kiir tasapinna, näiteks 180 kraadi ulatuses. Võimalik on skaneerida veel ruumiliselt, kus laserkiire katvus on osa sfäärist. Kiire liigutamine toimub sellisel juhul kahe telje ümber. Skanneritud ala mõõtmisandmete järgi saab luua kas tasapinnalise kaardi või kolmemõõtmelise mudeli keskkonnast.
Valguse tagasipeegeldunud komponendi mõõtmiseks on kaks erinevat viisi. Esimesel juhul saadetakse välja infrapuna laseri impulss ja oodatakse, kuni see tagasi peegeldub. Tagasipeegeldumise aja järgi saab arvutada antud suunas oleva objekti kauguse. Kuna mõõtmine toimub pikosekundites, siis selliste seadmete hind on väga kõrge.
Teine odavam võimalus on kasutada moduleeritud infrapuna laserkiirt ja mõõta saadetava ja objektilt tagasipeegelduva valguse faasinihet. Faasinihke suurus on sõltuv objekti kaugusest. Moduleeritud signaali lainepikkus on leitav valemist:
c = f ∙ τ
kus c on valguse kiirus, f modulatsioonisagedus ja τ tuntud moduleerimiseks kasutatud lainepikkus.
Summaarne kaugus D', mille kiiratud valgus läbib on:
D' = B + 2A = B + (θ * τ) / 2π
kus A on mõõdetav kaugus ja B on faasinihkesensori vahemaa kiirejagajast. Soovitud kaugus D kiirtejagaja ja takistuse vahel on avaldatav järgmiselt:
D = τ * θ / 4π
kus θ on elektrooniliselt mõõdetav faasi erinevus kiiratud ja tagasipeegeldunud valguskiire vahel.
In autonomous robotics as well as industrial robotics SICK laser rangers are very widely used. The SICK LMS 200 can easily be interfaced through RS-232 or RS-422, providing distance measurements over a 180 degree area up to 80 meters away. This lidar is based on a time-of-flight measurement principle. The example output of one scan measurement result is shown in the picture on the right.
To make the SICK operational, it must be wired for power and communication. On the back of the SICK there are two connectors that looks like serial port connectors. The connector with the female end is for power and the connector with the male end is for communications. The power and the serial cable should be wired as shown in the picture. Lidar can be connected with Robotic HomeLab Communication module using one of the RS-232 connectors. Power must be taken from external power source and this is not included in Robotic HomLab kit. Required dc power voltage is 24 V.
The SICK receives commands as streams of bytes through the serial port. When transmitting data, it sends back streams of bytes corresponding to distance measurements at a given angle.
To grab data from the SICK, you must first send a start string to tell the sensor to start sending data. This string is:
Hexadecimal Form: 02 00 02 00 20 24 34 08
Decimal Form: 2 0 2 0 32 36 52 8
If the start string is successfully sent, Lidar will begin streaming data over RS232. Incoming data from a scan is sent sequentially as the sensor scans through 180°. For example if the sensor is set to scan 180° with resolution of 0.5° the first data point which was sent will correspond to 0°, the next will correspond to 0.5°, the following to 1°, and so on. This means there is total of 361 data points. Each distance measurement is sent in the form of two bytes. The least signifficant byte is sent first followed by the most signifficant byte. Operating in metric mode the unit for the measurements is in milimeters.
Finally to stop the sensor from sending data a stop string must be sent. This string is:
Hexadecimal Form: 02 00 02 00 20 25 35 08
Decimal Form: 2 0 2 0 32 37 53 8
Following example shows how to initiate Lidar and get the count of package.
#include <stdio.h> #include <homelab/delay.h> #include <homelab/pin.h> #include <homelab/module/lcd_gfx.h> #include <homelab/usart.h> // USART liidese seadistamine usart port = USART(0); // Nuppude viikude määramine pin button1 = PIN(C, 0); pin button2 = PIN(C, 1); // Riistvara seadistamine static inline void init() { // Nupu viikude sisendiks määramine pin_setup_input_with_pullup(button1); pin_setup_input_with_pullup(button2); // LCD ekraani seadistamine lcd_gfx_init(); // LCD ekraani puhastamine lcd_gfx_clear(); // LCD ekraani taustavalgustuse tööle lülitamine lcd_gfx_backlight(true); // Programmi nime kuvamine lcd_gfx_goto_char_xy(3, 1); lcd_gfx_write_string("Lidar"); // USART liidese seadistamine usart_init_async ( port, USART_DATABITS_8, USART_STOPBITS_ONE, USART_PARITY_NONE, USART_BAUDRATE_ASYNC(9600) ); } // Põhiprogramm int main(void) { unsigned char new_value1, new_value2, old_value1 = 0, old_value2 = 0; char c; int i = 0; int count = 0; char text[16]; // Seadista riistvara init(); // Lõputu tsükkel while (1) { // Nupu oleku lugemine new_value1 = pin_get_debounced_value(button1); new_value2 = pin_get_debounced_value(button2); // Nupp S1 on alla vajutatud if((!new_value1) && (old_value1)) { //Saada lidarile "02 00 02 00 20 24 34 08", et alustada skanneerimist usart_send_char(port, 0x02); usart_send_char(port, 0x00); usart_send_char(port, 0x02); usart_send_char(port, 0x00); usart_send_char(port, 0x20); usart_send_char(port, 0x24); usart_send_char(port, 0x34); usart_send_char(port, 0x08); } // Nupp S2 on alla vajutatud if((!new_value2) && (old_value2)) { //Saada lidarile "0x 02 00 02 00 20 25 35 08", et lõpetada //skanneerimine usart_send_char(port, 0x02); usart_send_char(port, 0x00); usart_send_char(port, 0x02); usart_send_char(port, 0x00); usart_send_char(port, 0x20); usart_send_char(port, 0x25); usart_send_char(port, 0x35); usart_send_char(port, 0x08); } // Mäleta nupu viimast olekut old_value1 = new_value1; old_value2 = new_value2; // Jadaliidesest märgi lugemine if (usart_try_read_char(port, &c)) { // Paketi päise "0x 02 81 D6 02 B0 69 41" otsimine if(c == 0x02) i++; if(c == 0x81) i++; if(c == 0xD6) i++; if(c == 0x02) i++; if(c == 0xB0) i++; if(c == 0x69) i++; if(c == 0x41) i++; // Päise olemasolu kontroll if(i >= 7) { //Paketi loenduri suurendamine count++; //LCD ekraanil pakettide arvu kuvamine lcd_gfx_goto_char_xy(0, 3); sprintf(text, "Pakette: %i", count); lcd_gfx_write_string(text); i=0; } } } }