亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

使用人工智能避障

组件和用品

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
超声波传感器 - HC-SR04(通用)
× 1
SparkFun 双 H 桥电机驱动器 L298
× 1
直流电机(通用)
60 RPM 直流电机
× 2
轮子
× 4
跳线(通用)
× 1
SparkFun 可焊面包板 - 迷你
× 1
可充电电池,锂离子
7.2 伏锂离子电池
× 1
9V 电池(通用)
× 1
9V 电池夹
× 1
PCBWay 定制 PCB
× 1
C&K Switches JS 系列开关
× 1

必要的工具和机器

烙铁(通用)
焊锡丝,无铅
助焊剂,焊接
脱焊泵,豪华 SOLDAPULLT®
剥线钳和切割机,18-10 AWG / 0.75-4mm²容量线
热胶枪(通用)
双面胶带

应用和在线服务

Arduino IDE

关于这个项目

使用人工智能/强化学习避免机器人的障碍

问题说明: 主要目标是学习在“N”集中躲避障碍并学习最佳动作。在这种情况下,假设我们需要机器人学习“正确”的最佳动作。

使用的强化算法: Q学习

L298N 如何驱动两个直流电机:

HC-SR04 传感器如何计算距离:

强化学习中的重要术语:

1.状态: 这就是机器人所处的情况。这里对于一个基本的避障机器人,总共有 2 种状态……第一种状态是当它附近没有障碍物时,第二种状态是它前面有障碍物。(当我编写代码时,我假设有 10 个不同的状态可以是预期相同的动作。我这样做的原因是为了说明一个更复杂的环境。)

2.行动: 在特定状态下,机器人执行特定动作。机器人在第二状态下可以执行 4 个动作:“前进”、“后退”、“左转”、“停止”。 在第一种状态下,机器人可以执行 4 个动作,但为了使事情更容易,我假设机器人只能执行一个动作,即 “FORWARD”( 这是因为考虑诸如 LEFT 之类的操作是蹩脚的 或向后 当附近没有障碍物时。

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

/* HERE :
0 =FORWARD
1 =BACKWARD
2 =停止
3 =RIGHT*/

3.下一状态: 这是机器人在执行特定“动作”时进入的状态 在其当前的“状态”。 在机器人避障案例中,NEXT STATE 可以是 “CRASHED” 状态或“幸存” 状态。 (此处的SURVIVE状态与机器人在其情节开始时所处的起始状态相同。)

/*在这种情况下,机器人在执行一个动作后进入下一个状态
避免机器人*/

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

4. Q 表/Q 矩阵: 该表由“状态”数和“动作”数组成。在避障机器人案例中,该表由:

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 }};

此处 N_STATES =10 AND N_ACTIONS =4。此处“0.0”表示可以从 4 个可能的操作中的任何一个执行任何操作。但是,如果您想消除微粒 状态中的操作只是将矩阵中的“0.0”替换为“-1.0”。 “-1.0”表示无法在该状态下执行操作。这里假设我们有 10 个不同的状态,每个状态都期待相同的动作。如果你想让你的机器人学习在每个状态下不同的动作,那么改变代码中奖励矩阵的奖励

5.终端状态: 这是机器人可以进入的最后一个状态。对于避障机器人,这个状态不存在,因为我们没有任何终端状态,想要让我们的机器人永远学习。

6.奖励矩阵: 该表或矩阵用于为机器人的某些动作提供奖励。奖励是积极的还是消极的,取决于行动的质量。

int REWARDS[STATES][NUMBER_OF_ACTIONS] ={{-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.环境: 这也可以假设或视为机器人的世界。例如,我们人类生活在地球上,所以基本上地球就是我们的环境。

强化学习中的超参数:

1.学习率(ALPHA): 学习率或步长决定了新获取的信息覆盖旧信息的程度。因子 0 使代理什么都不学习(仅利用先验知识),而因子 1 使代理仅考虑最近的信息(忽略先验知识以探索可能性)。在完全确定的环境中,ALPHA =1.0 的学习率是最佳的。当问题是随机的时,算法在某些技术条件下收敛于要求其减小到零的学习率。在实践中,通常使用恒定的学习率,例如所有场景的 ALPHA =0.1。

float ALPHA =0.2; 

2.折扣因子(伽马): 0 的折扣因子决定了未来奖励的重要性。系数为 0 将使代理仅考虑当前的奖励“近视”(或短视),而接近 1 的系数将使其争取长期的高奖励。如果折扣因子达到或超过 1,则操作值可能会发散。对于 GAMMA =1.0,如果没有终止状态,或者如果智能体从未达到终止状态,则所有环境历史都会变得无限长,并且具有可加性、未折扣奖励的效用通常会变得无限。即使折扣因子仅略低于 1,Q 当用人工神经网络近似值函数时,函数学习会导致错误和不稳定性的传播。在这种情况下,从较低的折扣因子开始,然后将其增加到最终值可以加速学习。

float GAMMA =0.9; 

3.探索率(EPSILON): 这个参数决定了机器人应该在多大程度上探索环境。探索环境意味着执行随机动作并通过 Q 值分析结果。通常,在 Q Learning(与 SARSA 不同)中,随着 Robot 越来越多地学习,我们最终会摆脱这个参数。但是在这个项目中,我们不会摆脱 Epsilon,因为我们没有任何终止状态。在这种情况下,Epsilon 会降低到一定程度,然后在低于阈值时再次重置。这将确保机器人像我们人类一样不断探索直到它的生命周期。

float EPSILON =0.75; 

Q 学习算法:

  • 初始化 Q 值表,Q(s, a) .我已将这些值初始化为 0.0。
  • 观察当前状态,s .
  • 选择一个动作,a ,对于基于上一页中解释的操作选择策略之一的状态(📷-soft、📷-greedy 或 softmax)。
//////////////////////////Epsilon贪婪策略////////////// ///////////////

PROB =RANDOM(EPSILON);
if (PROB<=EPSILON) //探索动作
{
ACTION =random(0,4);
FLAG =2;
}
else //利用Q TABLE中的动作
{
ACTION =ARGMAX(Q,STATE);
标志 =2;
}
  • 采取行动,观察奖励,r ,以及新状态,s' .
  • 使用观察到的奖励和下一个状态可能的最大奖励更新状态的 Q 值。根据上述公式和参数进行更新。
  • 将状态设置为新状态,并重复该过程直到达到最终状态。
  • 了解Q-learning 更好地访问此链接:https://towardsdatascience.com/a-beginners-guide-to-q-learning-c3e2a30a653c
///////////////////Q_Learning公式的实现//////////////////// ////

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;

工作视频:别忘了查看AI Robot的工作视频:)


代码

  • 使用 Q-LEARNING 的避障机器人
使用Q-LEARNING的避障机器人C/C++
这是一个基于人工智能的避障机器人的主要代码。
/* 这是一个使用强化学习/AI的避障机器人本项目作者:Varun Walimbe 本项目中使用的算法:Q learningHow Obstacle Avoidance Works?1.Ultrasonic传感器使用其 Echo 和 Trig Pins 测量与障碍物的距离。2.当测量距离时,如果距离小于 20cm,则附近有障碍物,否则机器人是安全的并继续前进。3.如果检测到障碍物,则机器人采取根据情况左转或右转。基于AI的避障如何工作?(Q学习)1.这里从上一篇文章的第1步保持不变。但是第2步不同。2.机器人的动作列表是首先初始化。例如在这种情况下机器人的动作是:向左、向前、向后、停止。3.当机器人靠近障碍物时,需要执行一个动作。但是请注意,在这种情况下,机器人不知道要采取哪个动作,因为它没有预先编程并会自行学习以避免障碍物。4.当机器人在它面前有障碍物时停止时,它会获得奖励0 当机器人停止并后退时获得-5 奖励当机器人无视障碍继续向前移动时获得-10 奖励当机器人在检测到障碍物后立即向左移动时获得+105 奖励。这样机器人通过奖励机制自行学习避开障碍物。*///////////机器人的硬件参数//////////////////int TRIG_PIN =7;int ECHO_PIN =8;int 持续时间;浮动距离;int M1 =13;int M2 =12;int M3 =11;int M4 =10;bool Obstacle =false;int FLAG;////////// ///////////////结尾////////////////////////////////// /////////////////////////////Q 学习参数////////////// //////////////////////////浮动ALPHA =0.1; //学习率浮动 GAMMA =0.5; //折扣因子浮动EPSILON =0.90; //探索参数int REWARD; //执行动作的奖励int EPISODES =100;int STATE; // 机器人动作的当前状态 =0; //机器人执行的动作(0:FORWARD,1:Backward,2;STOP,3:LEFT)float PROB; //用于EPSILON DECAY bool ACTION_TAKEN =false; //这个变量告诉我们是采取了行动还是不采取了NEXT_STATE; // 机器人的下一个状态const int STATES =10; //环境中的状态数 int ACTIONS[4] ={1,2,3,4};const int NUMBER_OF_ACTIONS =4; //我们总共有 4 个动作向前、向后、向左和停止/*这是 Q 矩阵或 Q 表。这基本上是机器人在执行操作之前会查看的日记。基于该操作,机器人将获得奖励并且 Q 值将在此 Q 表中更新。这里我考虑了 10 个州。我已经假设所有状态都是不同的,即使它们是相同的。基本上障碍避免机器人只包含两个状态。即: 1:当它远离障碍时 2:当它接近障碍物时10 个不同的状态在这里期待相同/不同的动作。*/float Q[STATES][NUMBER_OF_ACTIONS] ={{0.0,0.0,0.0,0.0}, //最重要的是 Q 表。 {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}};/*这是一个奖励矩阵或奖励表。这是对执行特定动作的机器人给予奖励的责任。它存储在国家采取的每项行动的奖励。如果执行的操作是好的,则奖励为正,如果操作产生不好的结果,则为负。*/int REWARDS[STATES][NUMBER_OF_ACTIONS] ={{-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}}; ////////////////////////////////////////////结尾///// ////////////////////////////////////////////////// ///////////Q 学习更新参数////////////float Q_OLD;float Q_NEW;float Q_MAX;//////////// /////////////END////////////////////////void setup() { Serial.begin(9600 ); pinMode(TRIG_PIN,OUTPUT); pinMode(ECHO_PIN,INPUT);引脚模式(M1,输出); pinMode(M2,输出); pinMode(M3,输出); pinMode(M4,输出);随机种子(模拟读取(A0));状态 =0; Serial.println("训练将在 5 秒后开始:");延迟(5000);} ////////////////////////////机器人的功能////////////// /////////////////void Forward(){ digitalWrite(M1,LOW);数字写入(M2,高);数字写入(M3,低);数字写入(M4,高); }void Backward(){ digitalWrite(M1,HIGH);数字写入(M2,低);数字写入(M3,高); digitalWrite(M4,LOW);}void Left(){ digitalWrite(M1,HIGH);数字写入(M2,低);数字写入(M3,低); digitalWrite(M4,HIGH);}void Right(){ digitalWrite(M1,LOW);数字写入(M2,高);数字写入(M3,高); digitalWrite(M4,LOW);}void Stop(){ digitalWrite(M1,LOW);数字写入(M2,低);数字写入(M3,低); digitalWrite(M4,LOW);}bool Obstacle_Avoider(){ digitalWrite(TRIG_PIN, HIGH);延迟微秒(10);数字写入(TRIG_PIN,低);持续时间 =pulseIn(ECHO_PIN,HIGH);距离=(持续时间/2)/29.1; if(distance<15) { 障碍物 =true; } if(distance>15) { 障碍物 =false; } 延迟(10);返回障碍;}//////////////////////////////////////////END/ ////////////////////////////////////////////////// //////////////////////////机器人的Q学习功能////////////////// ////////////////float RANDOM(float EXPLORATION_PARAMETER){ /*此函数查找随机数,该数决定要采取的操作是随机的还是来自Q_TABLE*/ float RANDOM_VARIABLE;浮动概率; RANDOM_VARIABLE =随机(0,100);概率 =RANDOM_VARIABLE/100; return PROBABILITY;}float DECAY(float PARAMETER){ /*此功能用于随时间减少EPSILON(探索参数)。最终,您将摆脱EPSILON,机器人学会避免自己遇到障碍*/ PARAMETER =*0.98; //这里的参数是EPSILON return PARAMETER;}int GET_STATE(){ int STATE_NUMBER; STATE_NUMBER =随机(0,10); return STATE_NUMBER;}float MAX(float Q_Table[][4],int NEXT_S){ /*这个函数在 Q_TABLE[NEXT_STATE] 中找到最大的数字。该函数的主要作用是查找 Q_MAX PARAMETER*/ float LIST[4];浮动N1;浮动N2;浮动 MAX_VALUE =0.0;浮动差异; 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 =LIST[j]; } N2 =列表[j+1];差异 =N1-N2;如果(差异> 0){ MAX_VALUE =N1; } else { MAX_VALUE =N2; } } return MAX_VALUE;}int ARGMAX(float Q_Table[][4],int S){ /*THIS FUNCTION FINDS THE INDEX OF BIGGEST Q VALUE IN Q TABLE[STATE]*/ float ARRAY[4];浮动N1;浮动N2;浮动 MAX_VALUE =0.0;浮动差异;浮点数; 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; } else { N1 =ARRAY[p]; } N2 =数组[p+1];差异 =N1-N2;如果(差异> 0){ MAX_VALUE =N1; } else { MAX_VALUE =N2; } } for(int r =0; r<=3;r++) { NUMBER =ARRAY[r]; if(NUMBER ==MAX_VALUE) { MAX_INDEX =r;休息; } } return MAX_INDEX;}void Update(float Q_TABLE[][4] , int S, int NEXT_S, int A, int ACTIONS[], int R, float LEARNING_RATE, float DISCOUNT_FACTOR){ /*这个函数更新Q表和Q值。此更新一直持续到主循环结束。在每一集的结尾,Q 表被填满了不同的值。价值越大,该行动在该特定状态下的重要性越大。 “Q_OLD”是 Q 矩阵具有的旧值。这是最终会更新的值。 Q_NEW 是由 Q 学习公式计算的新 Q_VALUE。这里使用的 Q 学习公式基于 BELLMAN 方程使用时间差分学习方法。(蒙特卡洛方法在这种情况下将无法避免机器人的障碍。*/ Q_OLD =Q_TABLE[S] [A], Q_MAX; 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; }////////////////////////////////////////////// ///////////结尾////////////////////////////////////// ////////////////////////////////////////////////// ///////////////主循环的开始////////////////////////////// ///////////////////void loop() { ////////////////////////// ///////////////训练////////////////////////////////// ////////// for(int I =0; I 

示意图

barrier_avoiding_robot_using_ai_DcoMCWIOFm.fzz

制造工艺

  1. Arrow Electronics 宣布人工智能体验之旅
  2. 具有基于视觉的避障功能的移动机器人
  3. 博世将人工智能添加到工业 4.0
  4. 人工智能是小说还是时尚?
  5. 人工智能获得巨大的 Kubernetes 提升
  6. 人工智能在物联网中扮演重要角色
  7. 人工智能在 ICS 网络安全领域尚处于早期阶段
  8. 人工智能预测量子系统的行为
  9. 使用人工智能追踪森林砍伐
  10. 人工智能机器人
  11. 人工智能不是应用程序;这是一种方法
  12. 人工智能的优缺点