Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  1 3510
Hei,

Litt vagt beskrevet, mod må gjerne endre tittel til noe hensiktsmessig. Fagspråket mitt er dårlig på Norsk.

Dette dreier seg om persepsjon av omgivelser, denne spesifikke funksjonen skal brukes til å finne litt info om strukturer.

Første mål er å identifisere grensesjiktet der hele eller deler av strukturen tar slutt.

Forarbeidet er gjort, det vil si at vi nå kun trenger å forholde oss til ferdig prosessert persepsjon av omgivelsene. Måten jeg har gjort dette på er som følger:

3 koordinatsystem er aligned langs z-aksen, vi har scan_down, scan_mid og scna_up. Disse er skilt med 1 meter.

For hver av disse hører det til én "melding" av typen sensor_msgs::LaserScan. (Konvensjonell meldingsdefinisjon finner du her: http://docs.ros.org/melodic/api/sens...LaserScan.html )

Siden dette er noe jeg har generert gjennom prosesseringen av persepsjonen så er ikke dette faktiske sensordata, det er bare structen jeg bruker fordi den er jævlig smart, effektv og lett å bruke.

sensor_msgs::LaserScan forklart:

Dette er en melding som bruker polarkoordinater til å fremstille resultatene av en laserscanner som scanner i planet. Det er altså 2D. Essensen er at at punktene fremstilles med én vinkel og en avstand.

[code]
sensor_msgs::LaserScan min_scan;
Vi bruker hele 360 grader, selvfølgelig. Dette defineres som følger:

Kode

min_scan.angle_min = -M_PI;
min_scan.angle_max = M_PI;
Hvor mange målinger vi trenger avhenger jo av presisjonsbehov og hvor stort område det er snakk om (desto større rekkevidde, desto mindre nøyaktighet ved endepunktene). Derfor definerer vi først:

Kode

min_scan.range_min = 1.0; 
min_scan.range_max = 30.0;
Erfaringsmessig holder dette for dette formåelet:

int antall_målinger = 72;
Målinger lagres som en vektor som vi finner ved:
min_scan.ranges <-ranges er altså vektoren som kan arbeides med som en konvensjonell C++ vektor.
Følgelig kan vi: (Vi kunne jo også brukt push_back, men det er faktisk snakk om opptil 75% effektøkning om du allokerer plass til vektoren på forhånd).

min_scan.ranges.resize(antall_målinger);

Nå har vi det vi trenger fro å beregne vinkeløkningen mellom hver iterasjon:

Kode

min_scan.angle_increment = 
(min_scan.angle_max - min_scan.angle_min) / min_scan.ranges.size();
(Her kunne vi selvsagt bare: = 2*M_PI/antall_målinger. Ville bare vise hvordan det gjøres ellers).

De øvrige verdiene, eksempelvis min_scan.time_increment, brukes for høypresisjonsberegninger når det er bevegelser, såkalt "high_fidelity"-prosessering. Insane presisjon, men bare en digresjon her.

For å gå gjennom polarkoordinatene og finne rad og range:

Kode

for(int i = 0; i < min_scan.ranges.size(); i++) {
    float rad = min_scan.angle_min+min_scan.angle_increment * i; 
    float range= min_scan.ranges[i];
}
Enten kan beregninger gjøres her på rad og lengde...

Eller så kan, som gjerne er det enkleste utgangspunktet, scan'eme fremstilles som polygoner.

Kode

geometry_msgs::PolygonStamped poly; 
poly.header.frame_id = "map";
poly.header.stamp     = ros::Time::now();
poly.polygon.points.resize(antall_målinger);

for(int i = 0; i < min_scan.ranges.size(); i++) {
    float rad = min_scan.angle_min+min_scan.angle_increment * i; 
    float range= min_scan.ranges[i];
    geometry_msgs::Point32 p; 
    poly.polygon.points[i].x = range* cos(rad ); 
    poly.polygon.points[i].y = range* sin(rad ); 
}
Det jeg er ute etter er å finne ut hvor høy ting og hvor stor denne høyden er.

Dersom øverste scan er uten hindre og de to under er, så har vi et tak., Dette taket vil jeg gjerne ha som et eget polygon.

Føler deftte ble litt uforståellig av meg. Jeg er veldig giret på å komme i gang med den endelige revisjonen av en annen modul, men ta gjerne å se på det og se om det er noe jeg kan gjøre for å bedre forklare hvordan det funker og hva jeg trenger.

Definer gjerne polygon på konvensjonell c++ måte, skjønner at det blir knotete med ROS sitt system for dem som ikke har jobbet en evighet med deft. Snakket med en professor ved UiB som hadde hatt én bacheloroppgave knyttet til ROS.

Konklusjonen var at det var såp vanskelig å bruke at de tvilte på at det hadde en fremtid.. Utover det finnes det en doktorgradsstipendiat som fordyper seg i ROS ved UiO og noen få ildesjeler ved NTNU i trondheim....Er en digresjon, men ja, hvis noen her med forutsetningene på plass ønsker å dykke litt dypere i ROS så er jeg enn så lenge åpen for å hjelpe itt til. Det er tross alt snakk om kompetanse som er i ferd ed å bli blant den mest verdifulle du kan..
Sist endret av Tøffetom; 31. januar 2020 kl. 15:00. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
En enkel tegning hadde nok hjulpet litt. Jeg ser for meg en trekant, for så vidt et polygon, hvor ene hjørne er på sensoren og de to andre øverst og nederst på objektet som måles. Er det en feiltolkning? Hva mener du med tak, toppen av en bygning?

Hvis selve objektet som måles skal "polygoniseres", la oss si i 2D, en fasade av en bygning, må du vel ha 3D målinger; to vinkler og en lengde?