Robot Eksperimentarium: Tips Exercise 2

From ImageWiki

Jump to: navigation, search

Contents

Aflæsning af sensorer

"Hardware Abstraction Layer" afsnittet i "UserGuide.pdf" og "ERSP-API.pdf" er nyttige her. Det er let at finde ud af at man skal have fat i en IRangeSensor, men det er ikke s� let at finde ud af hvilket resource_id der skal bruges til obtain_interface kaldet. Dette ID kan findes i "resource_config.xml". Den ene af frontsensorerne har feks id: "IR_bn_n".

Kommentar af Hauberg: Det er aldrig sjovt at se i XML filer -- det er meget sjovere at kigge p� et fint billede. Det er efter min mening nemmere at finde navnene p� sensorerne ved at kigge i 'ERSP_Scorpion_Manual.pdf' der findes blandt dokumentationen. Mere specifikt anbefales det at kigge p� side 29 (A-7).

Angående termerne p� figuren, s� er Roll, Pitch og Yaw defineret her

OBS: De bagudpegende sensorer virker ikke med den standardopsætningen i resource-config.xml. Spørg allernådigst Søren meget pænt om i m� rette i config-filen. Problemet er at sensorerne står som bump-sensor og ikke rangesensor. Det drejer sig mindst om "IR_be_s" og "IR_bw_s".

Problem med kommunikationen mellem server og klient

I forbindelse med øvelse 2, kan der opst� (og det vil opst� i længden) et problem hvor klienten "hænger".

Problemet opstår fordi serveren foretager to "println()" til dens socket lige i rap. Tilmed beder den TCP om at flushe disse lige efter skrivningen (det er angivet i constructoren p� FileWriter). I klienten findes f?lgende linje to steder:

"... sock.recv(buffer, buffer_size)"

Dette vil modtage op til buffer_size (100) bytes fra klientens socket. Den udleverede klient er skrevet med henblik p� kun at modtage data svarende til et "println()" fra serveren pr. kald af ovenstående type, men det kan naturligvis ske at begge skrivninger fra serveren (Velocity og Angular_velocity) bliver modtaget i forbindelse med det samme kald. I dette tilfælde vil klienten foretage endnu et (blokerende) kald af ovenstående type som aldrig returnerer da serveren ikke svarer før den får endnu nogle argumenter.

Jeg har skrevet et hack som sørger for kun at læse et tal fra serveren (der læses indtil '\n' - og i øvrigt ikke inkl. '\n' som i skabelonen.). Følgende funktion bruges istedet for sock.recv(). Eksempel følger.

int recvFixed(char* buffer, int len, TCPSocket *sock)
{
	int index = 0;
	char data[1];
	int totalBytes = 0;
	int bytes_received;
	while(index < len)
	{
		bytes_received = sock->recv(data, 1);
		if(bytes_received < 0)
			return -1;
		if(data[0] == 10)
			break;
		totalBytes += bytes_received;
		buffer[index] = data[0];
		index++;
	}
	return totalBytes;
}

Funktionen kan bruges analogt til den som er brugt i skabelonen:

if((bytes_received = recvFixed(buffer, buffer_size, &sock)) < 0)
	break;
buffer[bytes_received] = '\0';
float Velocity = atof(buffer);
printf("Velocity = %.6f\n", Velocity);

Jacob

jFuzzyLogic

jFuzzyLogic er tilsyneladende ikke helt standard compliant.

  • Det ser ud som om "Default" ikke virker.
  • If?lge IEC 1131-7 CD1 skal RULEBLOCK indeholde "ACCU", Men jFuzzyLogic accepterer det ikke - tilgeng?ld vil den gerne have "ACCU" i "DEFUZZIFY"
  • conclusion kan ikke indeholde AND - Man skal bruge ",". Det er korrekt i BNF formen i IEC spec - men der er eksempler i IEC spec med AND - der alts� ikke virker :(
  • When building the FCL script and testing it make sure that the variables that fuzzy.java tries to map to your VAR_INPUT in the FCL script are identical. Otherwise you risk getting NaN.

Lille java-app til test af FCL scriptet

Lille mapping fra grundl?ggende teori jFuzzyLogic

Makefile problemer

Den udleverede Makefil kan ikke oversætte serveren. Der er en del ting i make-filen som forekommer os temmeligt forvirrende. Nedenfor er koden til en make-fil som oversætter serveren. Bla.a. var jar-filen jFuzzyLogic.jar helt unødvendig.

## Compilers
JAVAC = javac

## Paths and files
wd := $(shell pwd)
CLASSPATH = $(wd)/jFuzzyLogic:$(wd)/jFuzzyLogic/lib/jfreechart-1.0.0-rc1.jar:$(wd)/jFuzzyLogic/lib/jcommon-1.0.0-rc1.jar:$(wd)/jFuzzyLogic/lib/antlr-2.7.5.jar
JAVA = $(wd)/jFuzzyLogic/FuzzyAvoidanceServer.java

## Entries
all: FAC

FAZ: $(JAVA)
	$(JAVAC) -cp $(CLASSPATH) $(JAVA)

Problemer med JNI_solution

Har du problemer med at f� indholdet i Exercise2/JNI_solution/ til at virke?

Der var et problem med filen Avoidance.fcl som nu er rettet i SVN. Koden er ligeledes opdateret til at virke med jFuzzyLogic_1_2_1.jar.

For at benytte dette skal du blot lave et svn update og kopiere koden over i gruppe kataloget.


/JNI_Solution Makefile does not work out of the box if you are working on your own machine and have a newer kernel/java-jdk. I needed to modify following to get it compiled.

LIBS = -I/usr/lib/jvm/java-6-sun-1.6.0.06/include

JNI = -I/usr/lib/jvm/java-6-sun-1.6.0.06/include -I/usr/lib/jvm/java-6-sun-1.6.0.06/include/linux -L/usr/lib/jvm/java-6-sun-1.6.0.06/lib -L/usr/lib/jvm/java-6-sun-1.6.0.06/lib/i386/client

JVM = -L/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/i386/client/ -ljvm

If executing ./main complains about no libjvm.so, add its path to /etc/ld.so.conf and run ldconfig as root.<2008, /ali>

Personal tools