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

Op kunstmatige intelligentie (AI) gebaseerde robot die de robot volgt

Componenten en benodigdheden

Arduino Nano
× 1
Seeed Draadloze Bluetooth RF Transceiver Master Slave
× 1
Amazon Web Services IR-infraroodsensormodule Reflecterend foto-elektrisch licht
× 1
Sony continue rotatieservo
× 1
Android 4,8 volt batterij
× 1

Apps en online services

Arduino IDE

Over dit project

Na de ontwikkeling van de op Arduino gebaseerde Pick &Place Robot was het idee om een ​​op kunstmatige intelligentie gebaseerde lijnvolgende robot te ontwikkelen. Het ontwikkelen van een eenvoudige lijnvolgende robot was goed voor de beginner, precies wat het nodig had om een ​​soort infraroodsensoren toe te voegen in plaats van servomotoren in mijn recente project. "Het idee was om mijn vaardigheden te testen bij geavanceerd niveau".

Hoewel het een moeilijke taak was, heeft een soort online onderzoek me enorm geholpen.

Waarom is er behoefte aan een op AI gebaseerde lijnvolgrobot?

Als het gaat om AI het is de recente technologie die het potentieel heeft om de wereldomgeving te veranderen en zo het menselijk leven effectief te maken. Een droom die kan uitkomen door intelligentie aan onze robots te geven om echte problemen te begrijpen en dienovereenkomstig op te lossen, die droom kan alleen uitkomen door Kunstmatige intelligentie daarom heeft iedereen het erover.

  • Het kan worden gebruikt in de assemblage-/productielijn.
  • Ophaalbussen voor passagiers.

Hoewel mijn prototyperobot een beetje intelligentie kan zijn, is het voor mij nog maar het begin om mijn projecten naar AI te verplaatsen. Daarom zal ik hier proberen stap voor stap de ontwikkeling van lijnvolgende robot met behulp van kunstmatige intelligentie in een vrij eenvoudige taal uit te leggen. Vanwege een gebrek aan middelen zal ik geen robot bouwen, maar ik kan heel goed uitleggen hoe je het kunt bouwen door een soort van onderzoek te doen. Ik zal proberen nauwkeurige codes te leveren die werken op je Arduino IDE, zodat je kan vrij eenvoudig uw eerste AI-robot ontwikkelen.

Je kunt me vanaf hier steunen op Patreon :http://bit.ly/31NfQ6A

"U kunt het goedkoopste tariefapparaat in de VS vinden in de beschrijving van deze video, klik gewoon op de video ."

Laten we nu naar het project gaan "Een op AI gebaseerde lijnvolgende robot! ".

GEBRUIK VAN INFRAROOD SENSOREN

Onze project omvat 7 infraroodsensoren zoals weergegeven in het diagram.

  • 5 voor PID-regeling
  • 1 voor linkerdetectie
  • een andere voor detectie aan de rechterkant.

De rol van 5 PID-regelsensoren :Deze 5 sensoren zullen worden gebruikt om respectievelijk hoog of laag (1, 0) digitale output te genereren.

De sensor gecentreerd ten opzichte van de zwarte lijn, alleen die sensor zal HOOG (1) produceren. De vergelijkbare mogelijke uitkomst van die sensor zou kunnen zijn:-

  • 10000
  • 11000
  • 01000
  • 01100
  • 00100
  • 00110
  • 00010
  • 00011
  • 00001
  • 00000
  • 11111

Nu komen er nog twee andere sensoren voor links en rechts mogelijke uitkomsten zijn

Uiterst linkse sensor:analoge uitgang hoog of laag

Uiterst linkse sensor:analoge uitgang hoog of laag

Om de waarde van 5 sensoren op te slaan, kunnen we een arrayvariabele maken.

in LFSensor[5]={1,1,1,1,1}; 

Om de waarde van de linker- en rechtersensor op te slaan, gebruiken we integer

int farleft_sensor=0; 

Zoals we weten, hebben we 5 sensoren die kunnen worden gebruikt om het linker- en het rechterpad op te slaan dat door een robot in een array wordt genomen. Dus

LFSensor[0] =digitalRead(lineFollowSensor0);
LFSensor[1] =digitalRead(lineFollowSensor1);
LFSensor[2] =digitalRead(lineFollowSensor2);
LFSensor[ 3] =digitalRead(lineFollowSensor3);
LFSensor[4] =digitalRead(lineFollowSensor4);
farRightSensor =analogRead(farRightSensorPin);
farLeftSensor =analogRead(farLeftSensorPin);

MAZE LINKER REGEL:

kijk deze video om de doolhofregel voor de linkerhand te begrijpen

Kortom, de Linkerhandregel kan worden omschreven als:

  • Plaats je linkerhand op de muur.
  • Begin vooruit te lopen
  • Houd bij elke kruising en in het doolhof je linkerhand tegen de muur aan je linkerhand.
  • Uiteindelijk bereik je het einde van het doolhof. Je gaat waarschijnlijk niet de kortste en meest directe weg, maar je komt er wel.

De sleutel hier is dus om de kruispunten te identificeren , bepalen welke cursus te volgen op basis van de bovenstaande regels. In ons soort 2D-doolhof kunnen we met name 8 verschillende soorten kruispunten vinden (zie de eerste afbeelding hierboven):

Als we naar de foto kijken, kunnen we ons realiseren dat de mogelijke acties op kruispunten zijn:

Bij een "Kruis "

  • Ga naar links, of
  • Ga naar rechts, of
  • Ga rechtdoor
  • Bij een "Kruis "Ga naar links, of ga naar rechts, of ga rechtdoor

Bij een "T ":

  • Ga naar links, of
  • Ga naar rechts
  • Op een "T ":Ga naar links of Ga naar rechts

Op een "Alleen Rechts ":

  • Ga naar rechts
  • Bij een "Alleen Rechts ":Ga naar rechts

Bij een "Alleen links ":

  • Ga naar links
  • Bij een "Alleen links ":Ga naar links

Bij "Recht of Links ":

  • Ga naar links, of
  • Ga rechtdoor
  • Bij "Recht of Links ":Ga naar links of ga rechtdoor

Bij "Recht of Rechts ":

  • Ga naar rechts, of
  • Ga rechtdoor
  • Bij "Recht of Rechts ":Ga naar rechts of ga rechtdoor

Op een "Doodlopende weg ":

  • Ga terug ("U draait")
  • Op een "Doodlopende weg ":Ga terug ("U draait")

Bij "Einde van het doolhof ":

  • Stop
  • Bij "Einde van het doolhof ":Stop

Maar door de "Linkerhandregel" toe te passen, worden de acties teruggebracht tot elk één optie:

  • Bij een "kruis":ga naar links
  • Bij een "T":ga naar links
  • Bij een "Alleen Rechts":Ga naar Rechts
  • Bij een "Alleen links":ga naar links
  • Bij een "Recht of Links":Ga naar Links
  • Bij een "Straight or Right":ga rechtdoor
  • Bij een "doodlopende weg":ga terug ("U-bocht")
  • Aan het "Einde van het doolhof":stop

We zijn er bijna! "Wees kalm!"

Wanneer de robot een "doodlopend einde" of het "einde van een doolhof" bereikt, is het gemakkelijk om ze te identificeren, omdat er geen dubbelzinnige situaties bestaan ​​(we hebben die acties al geïmplementeerd op de lijnvolgerrobot, weet je nog?). Het probleem is wanneer de robot een "LIJN" vindt, bijvoorbeeld omdat een lijn een "Kruis" (1) of een "T" (2) kan zijn. Ook wanneer het een "LINKS of RECHTS TURN" bereikt, kan dat een simpele bocht zijn (optie 3 of 4) of opties om rechtdoor te gaan (5 of 6). Om te ontdekken wat voor soort kruising de robot precies is, moet er een extra stap worden gezet:de robot moet een "extra inch" rennen en zien wat de volgende stap is (zie de tweede afbeelding hierboven als voorbeeld).

Dus, in termen van stroom, kunnen de mogelijke acties nu worden beschreven als:

Op een "DEAD END":

  • Ga terug ("U draait")
  • Bij een "DEAD END":ga terug ("U turn")

Bij een "LINE":

  • Loop een centimeter extra
  • Als er een regel is:het is een "Kruis" ==> Ga naar LINKS
  • Als er geen regel is:het is een "T" ==> Ga naar LINKS
  • Als er nog een regel is:het is de "End of Maze" ==> STOP
  • Op een "LIJN":Run een extra centimeter Als er een regel is:Het is een "Kruis" ==> Ga naar LINKSAls er geen regel is:het is een "T" ==> Ga naar LINKSAls er een andere regel is:het is het "Einde van het doolhof" ==> STOP

Bij een "RECHTS TURN":

  • Loop een centimeter extra
  • als er een lijn is:Het is een Recht of Rechts ==> Ga STRAIGHT
  • Als er geen regel is:het is alleen een Rechts ==> Ga naar RECHTS
  • Bij een "RECHTS TURN":Run een extra centimeter als er een lijn is:Het is een Recht of Rechts ==> Ga RECHTS Als er geen lijn is:het is alleen een Rechts ==> Ga naar RECHTS

Bij een "LEFT TURN":

  • Loop een centimeter extra
  • als er een lijn is:Het is een Rechte of LEFT ==> Ga naar LINKS
  • Als er geen regel is:het is alleen een LEFT ==> Ga naar LINKS
  • Bij een "LEFT TURN":Run een extra centimeter als er een lijn is:Het is een Rechte of LEFT ==> Ga naar LEFTAls er geen lijn is:het is alleen een LEFT ==> Ga naar LEFT

Merk op dat in het geval van een "LEFT TURN", u de test kunt overslaan, omdat u toch LINKS gaat. Ik heb de uitleg alleen voor de duidelijkheid algemener gelaten. Bij de echte code sla ik deze test over.

Hier zijn enkele problemen die kunnen optreden tijdens het maken van dit project.

Verwant onderwerp

Probleem met Arduino-STUURPROGRAMMA OPLOSSEN

kijk deze video om het probleem met het Arduino-stuurprogramma op te lossen:


Code

  • RoBot_Maze_Solve_2
  • Functies
  • Algemene Functies.
  • sensorFuntions
  • RobotDefines.h
  • Motorfuncties
RoBot_Maze_Solve_2C/C++
/*--------------------------------------------- ---------------------7 sensoren Smart Robot - Maze Solver en Line Follower met programmeerbare PID-controller via BT==> Basisbeweging gebaseerd op Nano Mouse Robot, ontwikkeld door Michael Backus (http://www.akrobotnerd.com/ )==> Lijn volgen op basis van http://samvrit.tk/tutorials/pid-control-arduino-line-follower-robot/?ckattempt=1==> CREDIT aan Patrick McCabe voor het pad Solving Code, bezoek patrickmccabemakes.com!!Marcelo Jose Rovai - 23 april 2016 - Bezoek:http://mjrobot.org---------------- -------------------------------------------------- -*/#include #include "robotDefines.h"String commando;String device;// BT Module#include SoftwareSerial BT1(10, 11); // El pin 10 es Rx y el pin 11 es Tx//----------------------------------- ---------- ongeldige setup () { Serial.begin (9600); BT1.begin (9600); pinMode (ledPin, UITGANG); pinMode (knopPin, INPUT_PULLUP); // lijnvolgsensoren pinMode (lineFollowSensor0, INPUT); pinMode(lineFollowSensor1, INPUT); pinMode(lineFollowSensor2, INPUT); pinMode (lineFollowSensor3, INPUT); pinMode (lineFollowSensor4, INPUT); // servo's leftServo.attach (5); rightServo.attach (3); BT1.print("controleer de PID-constanten die naar Robot moeten worden verzonden"); Serial.print ("controleer de PID-constanten die naar Robot moeten worden verzonden"); BT1.println('\n'); while (digitalRead(buttonPin) &&!mode) { checkBTcmd(); // controleer of een commando is ontvangen van BT-afstandsbediening manualCmd (); commando =""; } checkPIDwaarden(); modus =GESTOPT; status =0; // 1e pas} ongeldige lus () { ledBlink (1); BT1.println("Start First Pass"); Serial.println("Start First Pass"); leesLFSsensoren(); doolhofOplossen(); // Eerste pas om het doolhof op te lossen ledBlink(2); BT1.println("Einde eerste doorgang"); Serial.println("Einde eerste doorgang"); while (digitalRead(buttonPin) &&!mode) { checkBTcmd(); // controleer of een commando is ontvangen van BT-afstandsbediening manualCmd (); commando =""; } BT1.println("Begin 2e doorgang"); Serial.println("Begin 2e doorgang"); padIndex =0; status =0; doolhofoptimalisatie(); // voer het doolhof zo snel mogelijk uit ledBlink (3); BT1.println("Einde 2e doorgang"); Serial.println("Einde 2e doorgang"); while (digitalRead(buttonPin) &&!mode) { checkBTcmd(); // controleer of een commando is ontvangen van BT-afstandsbediening manualCmd (); commando =""; } modus =GESTOPT; status =0; // 1e doorgang pathIndex =0; pathLength =0;}
FunctiesC/C++
void mazeSolve(void){ while (!status) { readLFSsensors(); schakelaar (modus) {geval NO_LINE:motorStop(); goAndTurn (LINKS, 180); recIntersection('B'); pauze; geval CONT_LINE:runExtraInch(); leesLFSsensoren(); if (modus!=CONT_LINE) {goAndTurn (LINKS, 90); recIntersection('L');} // of het is een "T" of "Cross"). Ga in beide gevallen naar LEFT else mazeEnd(); pauze; case RIGHT_TURN:runExtraInch(); leesLFSsensoren(); if (modus ==NO_LINE) {goAndTurn (RECHTS, 90); recIntersection('R');} else recIntersection('S'); pauze; case LEFT_TURN:goAndTurn (LEFT, 90); recIntersection('L'); pauze; case FOLLOWING_LINE:volgendeLine(); pauze; } }}//--------------------------------------------- void recIntersection(char richting){ path[pathLength] =richting; // Sla de kruising op in de padvariabele. padLengte ++; vereenvoudigPad(); // Vereenvoudig het geleerde pad.}//---------------------------------------- ------void mazeEnd(void){ motorStop(); BT1.print("Het einde ==> Pad:"); for(int i=0;i "); Serial.println(padlengte); toestand =1; modus =GESTOPT;}//------------------------------------------- ---void volgendeLine(void){ //readLFSsensors(); berekenPID(); motorPIDcontrol(); }//----------------------------------------------- -------------------------------------------// Padvereenvoudiging. De strategie is dat wanneer we een // reeks xBx tegenkomen, we het kunnen vereenvoudigen door de doodlopende weg te verwijderen. Voor// bijvoorbeeld LBL -> S, omdat een enkele S de doodlopende weg omzeilt// vertegenwoordigd door LBL.void simplePath(){ // vereenvoudig het pad alleen als de voorlaatste bocht een 'B' was if( pathLength <3 || path[pathLength-2] !='B') return; int totaalHoek =0; int ik; for(i=1;i<=3;i++) { switch(path[pathLength-i]) { case 'R':totalAngle +=90; pauze; geval 'L':totaalAngle +=270; pauze; geval 'B':totaalAngle +=180; pauze; } } // Verkrijg de hoek als een getal tussen 0 en 360 graden. totale hoek =totale hoek % 360; // Vervang al die beurten door een enkele. switch(totalAngle) { case 0:path[pathLength - 3] ='S'; pauze; geval 90:path[pathLength - 3] ='R'; pauze; geval 180:path[pathLength - 3] ='B'; pauze; geval 270:path[pathLength - 3] ='L'; pauze; } // Het pad is nu twee stappen korter. padLengte -=2; } //----------------------------------------------- -----------------------------------------------void mazeOptimization ( void){ while (!status) { readLFSsensors(); switch (modus) { case FOLLOWING_LINE:volgendeLine(); pauze; case CONT_LINE:if (pathIndex>=pathLength) mazeEnd (); else {mazeTurn (pad [padIndex]); pathIndex++;} pauze; case LEFT_TURN:if (pathIndex>=pathLength) mazeEnd (); else {mazeTurn (pad [padIndex]); pathIndex++;} pauze; case RIGHT_TURN:if (pathIndex>=pathLength) mazeEnd (); else {mazeTurn (pad [padIndex]); pathIndex++;} pauze; } } }//--------------------------------------------- --------void mazeTurn (char dir) { switch (dir) { case 'L':// Sla linksaf goAndTurn (LEFT, 90); pauze; case 'R':// Sla rechtsaf goAndTurn (RECHTS, 90); pauze; geval 'B':// Draai terug goAndTurn (RECHTS, 800); pauze; case 'S':// Ga rechtdoor runExtraInch(); pauze; }}
Algemene Functies.C/C++
void ledBlink(int times){ for (int i =0; i 0) { Serial.print("Opdracht ontvangen van BT ==> "); Seriële.println(apparaat); commando =apparaat; apparaat =""; // Reset de variabele BT1.flush(); } }//---------------------------------------------- --------------------------void manualCmd(){ switch (command [0]) { case 'g':mode =FOLLOWING_LINE; pauze; geval 's':motorStop(); // schakel beide motoren uit; geval 'f':motorForward(); pauze; geval 'r':motorTurn(RIGHT, 30); motorStop(); pauze; geval 'l':motorTurn(LEFT, 30); motorStop(); pauze; geval 'b':motorBackward(); pauze; geval 'p':Kp =commando[2]; pauze; geval 'i':Ki =commando[2]; pauze; geval 'd':Kd =commando[2]; pauze; }}//---------------------------------------------- -------------------------- void sendBTdata (int data) // stuur data naar BT {digitalWrite (ledPin, HIGH); BT1.print("Gegevens van Arduino"); BT1.print(gegevens); BT1.print(" xx"); BT1.println('\n'); digitalWrite (ledPin, LOW);}//---------------------------------------- ----------------ongeldig berekenenPID(){ P =fout; ik =ik + fout; D =fout-vorigeError; PID-waarde =(Kp*P) + (Ki*I) + (Kd*D); previousError =fout;}//------------------------------------------- ------------- ongeldig checkPIDvalues(){ BT1.print("PID:"); BT1.print(Kp); BT1.print(" - "); BT1.print(Ki); BT1.print(" - "); BT1.println(Kd); Serial.print("PID:"); Seriële.afdruk (Kp); Serieel.print(" - "); Seriële.afdruk (Ki); Serieel.print(" - "); Seriële.println(Kd); }//----------------------------------------------- void testLineFollowSensors(){int LFS0 =digitalRead(lineFollowSensor0); int LFS1 =digitalRead (lineFollowSensor1); int LFS2 =digitalRead (lineFollowSensor2); int LFS3 =digitalRead (lineFollowSensor3); int LFS4 =digitalRead (lineFollowSensor4); Serial.print ("LFS:L 0 1 2 3 4 R ==> "); Serieafdruk (LFS0); Serieafdruk (" "); Serieafdruk (LFS1); Serieafdruk (" "); Serieafdruk (LFS2); Serieafdruk (" "); Serieafdruk (LFS3); Serieafdruk (" "); Serieafdruk (LFS4); Serie.afdruk (" ==> "); Serieafdruk ("P:"); Serieafdruk (P); Serieafdruk (" I:"); Serieafdruk (I); Serieafdruk ("D:"); Serieafdruk (D); Serial.print (" PID:"); Serial.println (PID-waarde);}
sensorFuntionsC/C++
//--------------------------------------------- ----------------/* lees lijn sensoren waarden Sensor Array Error Waarde 0 0 0 0 1 4 0 0 0 1 1 3 0 0 0 1 0 2 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 -1 0 1 0 0 0 -2 1 1 0 0 0 -3 1 0 0 0 0 -4 1 1 1 1 1 0 Robot gevonden doorlopende lijn - test of een kruising of einde is van doolhof0 0 0 0 0 0 Robot heeft geen regel gevonden:draai 180o*/void readLFSsensors(){LFSensor[0] =digitalRead(lineFollowSensor0); LFSensor [1] =digitalRead (lineFollowSensor1); LFSensor [2] =digitalRead (lineFollowSensor2); LFSensor [3] =digitalRead (lineFollowSensor3); LFSensor [4] =digitalRead (lineFollowSensor4); farRightSensor =analogRead (farRightSensorPin); farLeftSensor =analoogRead (farLeftSensorPin); if ((LFSensor[0]==1 )&&(LFSensor[1]==1 )&&(LFSensor[2]==1 )&&(LFSensor[3]==1 )&&(LFSensor[4]==1 )) {modus =CONT_LINE; error =0;} else if((LFSensor[0]==0 )&&(farRightSensor  "); Serial.print (farRightSensor); Serial.print ("modus:"); Serieafdruk (modus); Serial.print ("fout:"); Serial.println (fout); }//----------------------------------------------- ------------void readLateralSensors(void){ }
RobotDefines.hC/C++
int mode =0;# definiëren GESTOPT 0# definiëren FOLLOWING_LINE 1# definiëren NO_LINE 2# definiëren CONT_LINE 3# definiëren POS_LINE 4# definiëren RIGHT_TURN 5# definiëren LEFT_TURN 6const int power =250;const int iniMotorPower =250;const int adj =0;float adjTurn =8;int extraInch =200;int adjGoAndTurn =800;const int ledPin =13;const int buttonPin =9;// LFSensor meer naar links is "0" const int lineFollowSensor0 =12; const int lineFollowSensor1 =18; const int lineFollowSensor2 =17; const int lineFollowSensor3 =16;const int lineFollowSensor4 =19;const int farRightSensorPin =0; // Analoge pin A0const int farLeftSensorPin =1; // Analoge pin A0const int THRESHOLD =150;int farRightSensor =0;int farLeftSensor =0;int LFSensor[5]={0, 0, 0, 0, 0};// PID-controllerfloat Kp=50;float Ki=0;float Kd=0;float error=0, P=0, I=0, D=0, PIDvalue=0;float previousError=0, previousI=0;#define RIGHT 1#define LEFT -1Servo leftServo;Servo rightServo; //------------------------------------------------ -//Specifieke Maze Phase 2 (optimalisatie) definities en variabelen unsigned char dir; // De padvariabele slaat het pad op dat de robot heeft genomen:// 'L' voor links// 'R' voor rechts// 'S' voor rechtdoor (rechtdoor gaan door een kruising)// 'B' voor terug (U-bocht)char path[100] ="";unsigned char pathLength =0; // de lengte van de pathint pathIndex =0; unsigned int status =0; // oplossen =0; bereik einde =1
MotorFuntionsC/C++
void motorStop(){ leftServo.writeMicroseconds(1500); rightServo.writeMicroseconden (1500); vertraging (200);}//------------------------------------------ --- void motorForward(){ leftServo.writeMicroseconds(1500 - (power+adj)); rightServo.writeMicroseconden (1500 + vermogen);}//-------------------------------------- -------void motorBackward(){ leftServo.writeMicroseconds (1500 + vermogen); rightServo.writeMicroseconds (1500 - vermogen);}//-------------------------------------- -------void motorFwTime (unsigned int time){ motorForward(); vertragingstijd); motorStop();}//------------------------------------------- --void motorBwTime (unsigned int time){ motorBackward(); vertragingstijd); motorStop();}//------------------------------------------- -----void motorTurn (int richting, int graden) { leftServo.writeMicroseconds(1500 - (iniMotorPower+adj)* richting); rightServo.writeMicroseconden (1500 - iniMotorPower*richting); vertraging (ronde(adjTurn*graden+20)); motorStop();}//------------------------------------------- --------void motorPIDcontrol(){int leftMotorSpeed ​​=1500 - (iniMotorPower+adj) - PIDvalue; int rightMotorSpeed ​​=1500 + iniMotorPower - PID-waarde; // De motorsnelheid mag de maximale PWM-waardebeperking niet overschrijden (leftMotorSpeed, 1000, 2000); beperking (rightMotorSpeed, 1000, 2000); leftServo.writeMicroseconden(linksMotorSpeed); rightServo.writeMicroseconden(rightMotorSpeed); //Serial.print (PID-waarde); //Serial.print (" ==> Links, Rechts:"); //Serial.print (leftMotorSpeed); //Serial.print (" "); //Serial.println (rightMotorSpeed);}//------------------------------------- ------------- ongeldig runExtraInch(void){ motorPIDcontrol(); vertraging (extra inch); motorStop();}//------------------------------------------- --------void goAndTurn (int richting, int graden){ motorPIDcontrol(); vertraging (adjGoAndTurn); motorTurn(richting, graden);}

Schema's


Productieproces

  1. Raspberry Pi-gebaseerde muur vermijdende robot – FabLab NerveCentre
  2. Een mobiele robot met op zicht gebaseerde obstakelvermijding
  3. ‘Artistieke’ robot bij NPE
  4. Automatisering:opnieuw ontworpen robotlijn
  5. Bosch voegt kunstmatige intelligentie toe aan industrie 4.0
  6. SCARA Robotlijn uitgebreid
  7. Is kunstmatige intelligentie fictie of rage?
  8. Kunstmatige intelligentie helpt robot objecten te herkennen door aanraking
  9. Kunstmatige Intelligentie Robots
  10. Voor- en nadelen van kunstmatige intelligentie
  11. Big data versus kunstmatige intelligentie