Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Obstakel vermijden met behulp van kunstmatige intelligentie

Componenten en benodigdheden

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Ultrasone sensor - HC-SR04 (algemeen)
× 1
SparkFun Dual H-Bridge motordrivers L298
× 1
DC-motor (generiek)
60 RPM DC-MOTOREN
× 2
wielen
× 4
Jumperdraden (algemeen)
× 1
SparkFun Soldeerbaar Breadboard - Mini
× 1
Oplaadbare batterij, lithium-ion
7,2-volt lithium-ionbatterij
× 1
9V-batterij (algemeen)
× 1
9V batterijclip
× 1
PCBWay Custom PCB
× 1
C&K Switches JS Series Switch
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Soldeerdraad, loodvrij
Soldeervloeistof, solderen
Desoldeerpomp, Deluxe SOLDAPULLT®
Draadstripper en snijder, 18-10 AWG / 0,75-4 mm² Capaciteit Draden
Hot lijmpistool (algemeen)
Tape, dubbelzijdig

Apps en online services

Arduino IDE

Over dit project

OBSTAKEL VERMIJDEN ROBOT MET GEBRUIK VAN AI/REINFORCEMENT LEREN

Probleemstelling: Het belangrijkste doel is om te leren obstakels in "N" afleveringen te vermijden en de optimale actie te leren. Laten we in dit geval aannemen dat we onze robot nodig hebben om optimale actie als 'juist' te leren.

Gebruikt versterkingsalgoritme: Q leren

Hoe L298N twee gelijkstroommotoren aandrijft:

Hoe de HC-SR04-sensor afstand berekent:

Belangrijke termen in versterkend leren:

1. STAAT: Dit is de situatie waarin de Robot zich bevindt. Hier voor een basisrobot die obstakels ontwijkt, zijn er in totaal 2 toestanden ... 1e staat is wanneer er geen obstakel in de buurt is en 2e staat waarin er een obstakel voor staat. (toen ik de code schreef, nam ik 10 verschillende aan toestanden kunnen zijn waarin dezelfde actie wordt verwacht. De reden dat ik dit deed om een ​​complexere omgeving te illustreren.)

2. ACTIE: In een bepaalde staat voert de robot een bepaalde actie uit. Er zijn 4 acties die de robot kan uitvoeren in de 2e staat:“VOORUIT”, “ACHTERUIT”, “LINKS”, “STOP”. In de 1e staat kan de robot 4 acties uitvoeren, maar om het u gemakkelijker te maken, ben ik ervan uitgegaan dat de robot slechts één actie kan uitvoeren, namelijk “FORWARD”( Dit komt omdat het flauw is om acties als LEFT . te overwegen of ACHTERUIT wanneer er geen obstakels in de buurt zijn.

int ACTIES =[0,1,2,3]

/* HIER :
0 =VOORUIT
1 =ACHTERUIT
2 =STOP
3 =RECHTS*/

3. VOLGENDE STAAT: Dit is de staatsrobot die binnenkomt wanneer hij een bepaalde 'ACTIE' . uitvoert in zijn huidige “STATE”. Bij obstakels die de robotbehuizing ontwijken, zal de VOLGENDE STAAT kan een “CRASHED” . zijn staat of een “OVERLEVEN” Staat. (Hier is de OVERLEVEN-status hetzelfde als de startstatus waarin de robot zich bevindt wanneer zijn aflevering begint.)

/*NA HET UITVOEREN VAN EEN ACTIE GAAT DE ROBOT IN DE VOLGENDE STAAT IN DIT GEVAL VAN OBSTAKEL 
VERMIJD ROBOT*/

int NEXT_STATE;
int STATE =0;
NEXT_STATE =STATE+1;

4. Q TABEL / Q MATRIX: Deze tabel wordt gevormd door het aantal "STATEN" en het aantal "ACTIES". In het geval van een robot om obstakels te vermijden, wordt deze tabel gegeven door:

float Q[N_STATES][NUMBER_OF_ACTIONS] ={{0.0,0.0,0.0,0.0}, 
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0 ,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0 }};

Hier N_STATES =10 AND N_ACTIONS =4. hier geeft "0.0" aan dat elke actie kan worden uitgevoerd vanuit een van de 4 mogelijke acties. als u echter een fijnstof wilt verwijderen actie in een staat vervang gewoon "0.0" door "-1.0" in de matrix. "-1.0" geeft aan dat de actie in die staat niet kan worden uitgevoerd. hier wordt aangenomen dat we 10 verschillende staten hebben waarbij elke staat dezelfde actie verwacht. als je wilt dat je robot acties leert die in elke staat anders zijn, verander dan de beloningen uit de beloningsmatrix in de code

5. TERMINAL STAAT: Dit is de laatste toestand waarin de robot zich kan bevinden. Voor obstakel vermijdende robot bestaat deze toestand niet omdat we geen eindtoestand hebben en onze robot voor altijd willen laten leren.

6. BELONINGSMATRIX: Deze tafel of matrix wordt gebruikt om de robot te belonen voor bepaalde acties. De beloning is positief of negatief, afhankelijk van de kwaliteit van de actie.

int REWARDS[STATES][NUMBER_OF_ACTTIONS] ={{-10,-2,-1,10}, 
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10}};

7. OMGEVING: Dit kan ook worden aangenomen of beschouwd als de wereld voor de robot. Wij mensen leven bijvoorbeeld op aarde, dus eigenlijk is de aarde onze omgeving.

Hyperparameters bij leren van bekrachtiging:

1. LEERGRAAD (ALPHA): De leersnelheid of stapgrootte bepaalt in welke mate nieuw verworven informatie oude informatie overschrijft. Een factor 0 zorgt ervoor dat de agent niets leert (uitsluitend gebruikmakend van voorkennis), terwijl een factor 1 ervoor zorgt dat de agent alleen de meest recente informatie in overweging neemt (voorkennis negeert om mogelijkheden te verkennen). In volledig deterministische omgevingen is een leersnelheid van ALPHA =1,0 optimaal. Wanneer het probleem stochastisch is, convergeert het algoritme onder bepaalde technische omstandigheden op de leersnelheid die het nodig heeft om tot nul te dalen. In de praktijk wordt vaak een constant leertempo gehanteerd, zoals ALPHA =0.1 voor alle scenario's.

float ALPHA =0.2; 

2. KORTINGSFACTOR (GAMMA): De kortingsfactor 0 bepaalt het belang van toekomstige beloningen. Een factor 0 maakt de agent "bijziend" (of bijziend) door alleen de huidige beloningen in overweging te nemen, terwijl een factor die de 1 benadert ervoor zorgt dat hij streeft naar een hoge beloning op de lange termijn. Als de kortingsfactor gelijk is aan of groter is dan 1 kunnen de actiewaarden afwijken. Voor GAMMA =1.0, zonder een terminale toestand, of als de agent er nooit een bereikt, worden alle omgevingsgeschiedenissen oneindig lang en worden hulpprogramma's met additieve, niet-gedisconteerde beloningen over het algemeen oneindig. Zelfs met een kortingsfactor die slechts iets lager is dan 1, Q functieleren leidt tot de verspreiding van fouten en instabiliteiten wanneer de waardefunctie wordt benaderd met een kunstmatig neuraal netwerk. In dat geval versnelt het leren door te beginnen met een lagere kortingsfactor en deze te verhogen naar de uiteindelijke waarde.

float GAMMA =0,9; 

3. VERKENNINGSGRAAD (EPSILON): Deze parameter bepaalt in hoeverre de robot de omgeving moet verkennen. De omgeving verkennen betekent willekeurige acties uitvoeren en de resultaten analyseren via Q Values. Meestal zullen we in Q Learning (in tegenstelling tot SARSA) deze parameter uiteindelijk kwijtraken naarmate Robot steeds meer leert. Maar in dit project gaan we Epsilon niet verwijderen omdat we geen terminale status hebben. Epsilon zal in dit geval tot op zekere hoogte verminderen en dan opnieuw worden gereset wanneer het onder een drempelwaarde komt. Dit zorgt ervoor dat de robot zijn leven lang blijft verkennen, net als wij mensen.

float EPSILON =0,75; 

Q-LEARNING ALGORITHM:

  • Initialiseer de tabel met Q-waarden, Q(s, a) . Ik heb deze waarden geïnitialiseerd op 0.0.
  • Bekijk de huidige staat, s .
  • Kies een actie, een , voor die staat op basis van een van de actieselectiebeleidslijnen die hier op de vorige pagina zijn uitgelegd (📷-soft, 📷-greedy of softmax).
//////////////////////////Epsilon Greedy Policy/////////////// ///////////////

PROB =RANDOM(EPSILON);
if (PROB<=EPSILON) //ONTDEK DE ACTIES
{
ACTIE =willekeurig(0,4);
VLAG =2;
}
else //EXPLOIT DE ACTIES VANUIT Q TABLE
{
ACTIE =ARGMAX(Q,STATE);
VLAG =2;
}
  • Onderneem actie en observeer de beloning, r , evenals de nieuwe staat, s' .
  • Werk de Q-waarde voor de staat bij met behulp van de waargenomen beloning en de maximaal mogelijke beloning voor de volgende staat. Het bijwerken gebeurt volgens de hierboven beschreven formule en parameters.
  • Stel de status in op de nieuwe status en herhaal het proces totdat een eindstatus is bereikt.
  • Om Q-learning te begrijpen bezoek deze link beter:https://towardsdatascience.com/a-beginners-guide-to-q-learning-c3e2a30a653c
///////////////////Implementatie van Q_Learning Formula///////////////////// ////

Q_OLD =Q_TABLE[S][A];
Q_MAX =MAX(Q_TABLE, NEXT_S);
Q_NEW =(1-LEARNING_RATE)*Q_OLD + LEARNING_RATE*(R + DISCOUNT_FACTOR*Q_MAX);
Serial.print("Q VALUE:");
Serial.println(Q_NEW);
Q_TABLE[S][A] =Q_NEW;

Werkvideo:vergeet niet de werkvideo van AI Robot te bekijken :)


Code

  • Obstakel vermijden Robot met Q-LEARNING
Robot voor het vermijden van obstakels met Q-LEARNINGC/C++
DIT IS EEN OP KUNSTMATIGE INTELLIGENTIE GEBASEERDE OBSTAKELVERMIJDING ROBOT'S HOOFDCODE.
/* Dit is een obstakel vermijdende robot met behulp van Reinforcement Learning/AI Auteur van dit project:Varun Walimbe Algoritme gebruikt in dit project:Q learningHoe obstakel vermijden werkt?1.Ultrasoon sensor wordt gebruikt, meet de afstand tot het obstakel met behulp van de Echo- en Trig-pinnen. 2. Wanneer de afstand wordt gemeten en als deze minder dan 20 cm is, is er een obstakel in de buurt, anders is de robot veilig en gaat vooruit. 3. Als een obstakel wordt gedetecteerd, neemt de robot draai naar links of rechts, afhankelijk van de situatie. Hoe werkt het vermijden van obstakels op basis van AI? (Q-leren) 1. Hier blijft de 1e stap van het bovenste artikel hetzelfde. De 2e stap is echter anders. 2. Een lijst met acties van de robot is eerst geïnitialiseerd. In dit geval zijn acties van de robot bijvoorbeeld:Links, Vooruit, Achteruit, Stop. 3. Wanneer de robot in de buurt van een obstakel komt, moet hij een actie uitvoeren. Houd er echter rekening mee dat de robot in dit geval niet weet welke actie hij moet ondernemen, omdat deze niet voorgeprogrammeerd is en uit zichzelf leert om obstakels te vermijden. 4. Wanneer de robot stopt wanneer er een obstakel voor hem staat, krijgt hij een beloning als 0 Wanneer de robot stopt en achteruit gaat, ontvangt hij een beloning van -5. Wanneer de robot vooruit blijft gaan en de obstakels negeert, ontvangt hij een beloning van -10. Wanneer de robot net naar links beweegt zodra een obstakel wordt gedetecteerd, krijgt hij een beloning van +105. Op deze manier krijgt de robot leert zelfstandig obstakels te vermijden door beloningsmechanisme.*///////////ROBOT'S HARDWARE PARAMETERS////////////////////int TRIG_PIN =7;int ECHO_PIN =8;int duur;float distance;int M1 =13;int M2 =12;int M3 =11;int M4 =10;bool Obstacle =false;int FLAG;////////// ///////////////EINDE////////////////////////////////// ////////////////////////////////Q LEERPARAMETERS/////////////// ////////////////////////////float ALPHA =0,1; // LEERSNELHEIDfloat GAMMA =0,5; // KORTINGSFACTORfloat EPSILON =0,90; //EXPLORATIE PARAMETERint BELONING; // BELONING VOOR HET UITVOEREN VAN EEN ACTIE in EPISODES =100; int STATE; // HUIDIGE STAAT VAN DE ROBOTint-ACTIE =0; //ACTIE UITGEVOERD DOOR DE ROBOT (0:FORWARD,1:BACKWARD,2;STOP,3:LEFT)float PROB; //GEBRUIKT VOOR EPSILON DECAY bool ACTION_TAKEN =false; //DEZE VARIABELEN VERTELLEN ONS OF EEN ACTIE IS GENOMEN OF NIET IN NEXT_STATE; // VOLGENDE STAAT VAN DE ROBOTconst int STATES =10; // AANTAL STATEN IN OMGEVING int ACTIES [4] ={1,2,3,4};const int NUMBER_OF_ACTIES =4; //TOTAAL WE HEBBEN 4 ACTIE VOORUIT, ACHTERUIT, LINKS EN STOP/*DIT IS DE Q MATRIX OF Q-TABEL. DIT IS IN BASIS HET DAGBOEK DAT DE ROBOT ZAL BEKIJKEN ALVORENS EEN ACTIE UIT TE VOEREN. GEBASEERD OP DE ACTIE ZAL DE ROBOT BELONING VERDIENEN EN DE Q-WAARDE WORDT IN DEZE Q-TABEL BIJGEWERKT. HIER HEB IK 10 STATEN BESCHOUWD. IK BEN AANGESTELD DAT ALLE STATEN VERSCHILLEND ZIJN, OOK AL ZIJN ZE HETZELFDE. IN BASIS OBSTAKEL VERMIJDEN ROBOT BEVAT SLECHTS TWEE STATEN. Bijvoorbeeld:1:WANNEER HET OBSTAKEL VERWIJDERT 2:WANNEER HET DICHTBIJ HET OBSTAKEL BENT, HIER OM MEER TE ILLUSTREREN 10 VERSCHILLENDE STATEN DIE DEZELFDE/VERSCHILLENDE ACTIE VERWACHTEN.*/float Q[STATES][NUMBER_OF_ACTTIONS] ={{0.0,0.0,0.0,0.0}, // HET BELANGRIJKSTE VAN ALLES IS DE Q-TABEL. {0.0,0.0,0.0,0.0}, //HET WORDT GEVORMD DOOR STATEN ALS HAAR RIJEN {0.0,0.0,0.0,0.0}, //EN COLLUMNS ALS HET AANTAL ACTIES {0.0,0.0,0.0,0.0}, / /INITIALISEERD NAAR NUL IN HET BEGIN {0.0,0.0,0.0,0.0}, // DIT WORDT IN DE TOEKOMST BIJGEWERKT. {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}};/*DIT IS EEN BELONINGSMATRIX OF BELONINGSTABEL. DIT IS VERANTWOORDELIJK VOOR HET GEVEN VAN BELONING AAN ROBOT VOOR HET UITVOEREN VAN BEPAALDE ACTIE. HET BEWAART DE BELONING VOOR ELKE ACTIE DIE IN DE STAAT WORDT GENOMEN. DE BELONING ZAL POSITIEF ZIJN INDIEN DE UITGEVOERDE ACTIE GOED EN NEGATIEF IS ALS DE ACTIE SLECHTE RESULTATEN OPLEIDT.*/int REWARDS[STATES][NUMBER_OF_ACTTIONS] ={{-10,-2,-1,10}, {-10,-2 ,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {-10, -2,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {- 10,-2,-1,10}}; ////////////////////////////////////////////EINDE///// ////////////////////////////////////////////////// ////////////Q LEREN UPDATE PARAMETERS////////////float Q_OLD;float Q_NEW;float Q_MAX;///////////// /////////////END//////////////////////////void setup() { Serial.begin (9600 ); pinMode (TRIG_PIN, UITGANG); pinMode(ECHO_PIN,INPUT); pinMode (M1, UITGANG); pinMode (M2, UITGANG); pinMode (M3, UITGANG); pinMode (M4, UITGANG); randomSeed (analogRead (A0)); STAAT =0; Serial.println("TRAINING BEGINT OVER 5 SECONDEN:"); vertraging (5000);} ////////////////////////////ROBOT'S FUNCTIES////////////// ///////////////////void Forward(){digitalWrite(M1,LOW); digitalWrite (M2, HOOG); digitalWrite (M3, LAAG); digitalWrite (M4, HOOG); }void Backward(){ digitalWrite(M1,HIGH); digitalWrite (M2, LAAG); digitalWrite (M3, HOOG); digitalWrite(M4,LOW);}void Left(){ digitalWrite(M1,HIGH); digitalWrite (M2, LAAG); digitalWrite (M3, LAAG); digitalWrite(M4,HIGH);}nietig Rechts(){ digitalWrite(M1,LOW); digitalWrite (M2, HOOG); digitalWrite (M3, HOOG); digitalWrite(M4,LOW);}void Stop(){ digitalWrite(M1,LOW); digitalWrite (M2, LAAG); digitalWrite (M3, LAAG); digitalWrite(M4,LOW);}bool Obstacle_Avoider(){ digitalWrite(TRIG_PIN, HIGH); vertraging Microseconden (10); digitalWrite(TRIG_PIN, LAAG); duur =pulseIn(ECHO_PIN, HOOG); afstand =(duur/2)/29.1; if (afstand <15) { Obstakel =waar; } if(distance>15) { Obstacle =false; } vertraging(10); terugkeer Obstakel;}////////////////////////////////////////////END/ ////////////////////////////////////////////////// ////////////////////////////ROBOT'S Q LEERFUNCTIES////////////////// //////////////////float RANDOM(float EXPLORATION_PARAMETER){ /*DEZE FUNCTIE VINDT EEN WILLEKEURIG NUMMER DAT BESLIST OF EEN ACTIE WILLEKEURIG IS OF VANAF Q_TABLE*/ float RANDOM_VARIABLE; zweven WAARSCHIJNLIJKHEID; RANDOM_VARIABLE =willekeurig (0,100); KANS =RANDOM_VARIABLE/100; return PROBABILITY;}float DECAY(float PARAMETER){ /*DEZE FUNCTIE WORDT GEBRUIKT OM EPSILON(EXPLORATION PARAMETER) MET TIJD TE VERMINDEREN. AAN HET EINDE KRIJG JE EPSILON EN DE ROBOT LEERT OBSTAKELS OP ZIJN EIGEN PARAMETER TE VERMIJDEN */ PARAMETER =*0,98; //PARAMETER HIER IS DE EPSILON return PARAMETER;}int GET_STATE(){int STATE_NUMBER; STATE_NUMBER =willekeurig (0,10); return STATE_NUMBER;}float MAX(float Q_Table[][4],int NEXT_S){ /*DEZE FUNCTIE VINDT HET GROOTSTE AANTAL IN Q_TABLE[NEXT_STATE]. DE BELANGRIJKSTE ROL VAN DEZE FUNCTIE IS HET VINDEN VAN Q_MAX PARAMETER*/float LIST[4]; vlotter N1; vlotter N2; zweven MAX_VALUE=0.0; zweven DIFF; for(int b =0; b<=3; b++) { LIST[b] =Q[NEXT_S][b]; } for(int j =0; j<=2; j++) { if(MAX_VALUE>LIST[j]) { N1 =MAX_VALUE; } else { N1 =LIJST[j]; } N2 =LIJST[j+1]; DIFF =N1-N2; if (DIFF> 0) { MAX_VALUE =N1; } else { MAX_VALUE =N2; } } return MAX_VALUE;}int ARGMAX(float Q_Table[][4],int S){ /*DEZE FUNCTIE VINDT DE INDEX VAN DE GROOTSTE Q-WAARDE IN Q TABLE[STATE]*/ float ARRAY[4]; vlotter N1; vlotter N2; zweven MAX_VALUE =0.0; zweven DIFF; vlotter NUMMER; int MAX_INDEX; for(int u=0; u<=3; u++) { ARRAY[u] =Q_Table[S][u]; } for(int p =0; p<=2; p++) { if(MAX_VALUE>ARRAY[p]) { N1 =MAX_VALUE; } anders { N1 =ARRAY[p]; } N2 =ARRAY[p+1]; DIFF =N1-N2; if (DIFF> 0) { MAX_VALUE =N1; } else { MAX_VALUE =N2; } } for(int r =0; r<=3;r++) { AANTAL =ARRAY[r]; if(NUMBER ==MAX_VALUE) { MAX_INDEX =r; pauze; } } return MAX_INDEX;}void Update(float Q_TABLE[][4] , int S, int NEXT_S, int A, int ACTIES[], int R, float LEARNING_RATE, float DISCOUNT_FACTOR){ /*DEZE FUNCTIE UPDATES DE Q-TABEL EN Q-WAARDEN. DEZE UPDATE BLIJFT GEBEUREN TOT DE HOOFDLUS EINDIGT. AAN HET EINDE VAN DE EPISODEN IS DE Q-TABEL GEVULD MET VERSCHILLENDE WAARDEN. HOE HOGER DE WAARDEN, HOE GROTERE BELANG DE ACTIE IN DIE BEPAALDE STAAT HEEFT. "Q_OLD" IS OUDE WAARDE DIE DE Q MATRIX HEEFT. DIT IS DE WAARDE DIE EVENTUEEL WORDT BIJGEWERKT. Q_NEW IS DE NIEUWE Q_VALUE DIE WORDT BEREKEND DOOR DE Q LEERFORMULE. DE HIER GEBRUIKTE Q LEERFORMULE IS GEBASEERD OP DE BELLMAN-VERGELIJKING GEBRUIKT EEN TEMPORAL VERSCHIL LEERAANPAK. NEXT_S); Q_NEW =(1-LEARNING_RATE)*Q_OLD + LEARNING_RATE*(R + DISCOUNT_FACTOR*Q_MAX); Serial.print("Q VALUE:"); Serial.println(Q_NEW); Q_TABLE[S][A] =Q_NEW }//////////////////////////////////////////////// ///////////EINDE////////////////////////////////////// ////////////////////////////////////////////////// ////////////////BEGIN VAN HOOFDLUS////////////////////////////// ///////////////////void loop() { ////////////////////////// ///////////////OPLEIDING////////////////////////////////// ////////// for(int I =0; I  

Schema's

obstakel_avoiding_robot_using_ai_DcoMCWIOFm.fzz

Productieproces

  1. Arrow Electronics kondigt Artificial Intelligence Experience Tour aan
  2. Een mobiele robot met op zicht gebaseerde obstakelvermijding
  3. Bosch voegt kunstmatige intelligentie toe aan industrie 4.0
  4. Is kunstmatige intelligentie fictie of rage?
  5. Kunstmatige intelligentie krijgt enorme Kubernetes-boost
  6. Kunstmatige intelligentie speelt een grote rol in het IoT
  7. Het is vroeg voor kunstmatige intelligentie in ICS Cybersecurity
  8. Kunstmatige intelligentie voorspelt het gedrag van kwantumsystemen
  9. Kunstmatige intelligentie gebruiken om ontbossing te volgen
  10. Kunstmatige Intelligentie Robots
  11. Kunstmatige intelligentie is geen app; Het is een methodologie