使用人工智能避障
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
| ||||
| ||||
| ||||
| ||||
| ||||
|
应用和在线服务
|
关于这个项目
使用人工智能/强化学习避免机器人的障碍
问题说明: 主要目标是学习在“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制造工艺