机器学习中的人工神经网络:机器人应用案例解析
立即解锁
发布时间: 2025-08-29 10:15:23 阅读量: 3 订阅数: 6 

# 机器学习中的人工神经网络:机器人应用案例解析
## 1. 霍普菲尔德网络的数据存储与识别能力
霍普菲尔德网络在数据存储和识别方面表现出色。通过测试发现,一个归一化向量与数字 8 的输入数据向量完全匹配,这再次证明了霍普菲尔德网络确实能够存储数据,并且可以帮助识别未知或扭曲的输入数据集,前提是这些数据是网络的一部分。相关研究表明,这类网络在从扭曲或复杂的输入向量中识别正确字符时,成功率通常超过 90%。不过,实际成功率取决于输入数据的数量和质量,以及网络中创建的节点数量。在简单且有限的演示中,成功率能超过 70%就已经相当不错了。
## 2. 基于人工神经网络的自主机器人汽车演示
### 2.1 演示背景
使用之前介绍过的机器人汽车 Alfie 进行新的演示。在之前的项目中,Alfie 被编程为尽可能避免所有墙壁和门,并在行驶过程中尽可能节省能源。而本次项目有很大不同,机器人汽车会主动接近障碍物并尝试绕过它们,同时不再考虑能源节约方案。为了更好地检测和避免障碍物,Alfie 还配备了另一个超声波传感器。此外,还实现了一个霍普菲尔德网络,帮助机器人记住过去的行动,从而在其穿越环境的过程中选择更好的行动和行为。
### 2.2 输入数据向量
该网络使用一个五元素的输入数据向量,具体元素如下:
- 左传感器
- 右传感器
- 双传感器
- 左电机
- 右电机
这些元素足以进行初始演示,并且可以根据需要轻松增加更多元素。这五个元素意味着应该使用一个 5×5 的霍普菲尔德网络来支持机器人汽车控制系统。与之前的示例一样,使用标称值 1 和 -1 来表示各元素的状态。具体定义如下:
- **传感器**:1 表示传感器未检测到物体;对于“双传感器”,1 表示每个传感器都报告前方有障碍物。目前尚未定义超声波传感器的阈值距离,后续会进行说明。
- **电机**:1 表示电机正在运行,-1 表示电机停止。需要注意的是,电机只有运行和停止两种状态,没有中间功率设置。
例如,输入向量 $\begin{Bmatrix}1\\1\\1\\1\\1\end{Bmatrix}$ 表示传感器未检测到障碍物,并且两个电机都在运行,即汽车正在直线行驶。然而,汽车不能仅仅遵循一组存储的规则,它需要学习什么是好的规则或行为,什么不是。这意味着汽车必须尝试不同的动作,确定哪些是好的并应该被记住,哪些是不好的并应该被丢弃。
### 2.3 允许的运动方式
机器人汽车允许的运动方式如下:
- 左转
- 右转
- 直行
- 停止
与之前的演示不同,本次允许汽车停止。此外,转弯方式也有所不同。之前是转弯一侧的轮子停止,另一侧轮子继续旋转;而这次是转弯一侧的轮子反向旋转,另一侧轮子停止,这种方式可以实现近似零半径转弯。
### 2.4 区分好坏行为
机器人学习过程中更困难的部分是区分好的行为和不好的行为。由于没有外界帮助,机器人必须自行完成这一任务。可以通过编程让机器人接受那些“改善”其整体进展的动作,即不检测到障碍物的动作。每当遇到墙壁或门时,之前的演示会稍微降低适应度值;而这次没有适应度值,只有输入数据向量,根据机器人是否“认为”情况有所改善来决定是否存储这些向量。当机器人再次遇到相同的情况时,它会回忆起存储的动作并重复执行。
### 2.5 识别新情况
假设机器人传感器未检测到任何物体,并且电机的运行状态未知,此时输入数据向量为 $\begin{Bmatrix}1\\1\\1\\0\\0\end{Bmatrix}$。需要将这个扭曲的输入向量乘以权重矩阵,权重矩阵的创建方式如下:
```python
import numpy as np
vInput = np.array([1,1,1,1,1])[:,None]
wtg = vInput.T*vInput
```
新向量乘以权重矩阵的结果为:
```python
new_vector = np.array([1,1,1,0,0])[:,None]
result = np.dot(new_vector.T, wtg)
result = np.array(result).tolist()
# 归一化
tv = np.array([0,0,0,0,0])[:,None]
for i in range(0,4):
if result[0][i] >= 0:
tv[i][0] = 1
else:
tv[i][0] = -1
print(tv)
```
最终结果为 $\begin{Bmatrix}1\\1\\1\\1\\1\end{Bmatrix}$,这表明网络将这个未知向量与已知的传感器未检测到物体的向量相关联,存储的动作是打开两个电机并直线行驶。由此得出结论:如果已知数据是正确的,那么可以假设未知数据也是正确的。但如果存储的向量本身存在错误,可能会导致错误的动作,就像人类的错误记忆一样。
## 3. 避障机器人汽车的 Python 控制脚本
### 3.1 脚本结构
机器人汽车控制程序 `annRobot.py` 采用了与 `robotRoulette.py` 类似的结构。电机控制和超声波传感器模块相同,但随机动作选择代码进行了修改,并增加了几个新的矩阵计算模块来支持霍普菲尔德网络。以下是完整的代码:
```python
import RPi.GPIO as GPIO
import time
from random import randint
import numpy as np
global pwmL, pwmR
threshold = 25.4
# 使用 BCM 引脚编号
GPIO.setmode(GPIO.BCM)
# 设置电机控制引脚
GPIO.setup(18, GPIO.OUT)
GPIO.setup(19, GPIO.OUT)
pwmL = GPIO.PWM(18,20) # 引脚 18 是左轮 pwm
pwmR = GPIO.PWM(19,20) # 引脚 19 是右轮 pwm
# 以 0 旋转速度启动电机
pwmL.start(2.8)
pwmR.start(2.8)
# 超声波传感器引脚
TRIG1 = 23 # 输出
ECHO1 = 24 # 输入
TRIG2 = 25 # 输出
ECHO2 = 27 # 输入
# 设置输出引脚
GPIO.setup(TRIG1, GPIO.OUT)
GPIO.setup(TRIG2, GPIO.OUT)
# 设置输入引脚
GPIO.setup(ECHO1, GPIO.IN)
GPIO.setup(ECHO2, GPIO.IN)
# 初始化传感器
GPIO.output(TRIG1, GPIO.LOW)
GPIO.output(TRIG2, GPIO.LOW)
time.sleep(1)
# 创建初始权重矩阵 wtg
vInput = np.array([1,1,1,1,1])[:,None] # 实际上是一个 [1,0] 矩阵
wtg = vInput.T*vInput # 矩阵乘法得到一个 5 x 5 矩阵
# vInput.T 是转置形式(即列)
# 新的成功输入数据向量的平方将添加到 wtg 矩阵中
# 机器人动作模块
def robotAction(select):
global pwmL, pwmR
if select == 0: # 直线行驶
pwmL.ChangeDutyCycle(3.6)
pwmR.ChangeDutyCycle(2.2)
elif select == 1: # 左转
pwmL.ChangeDutyCycle(2.2)
pwmR.ChangeDutyCycle(2.8)
elif select == 2: # 右转
pwmL.ChangeDutyC
```
0
0
复制全文
相关推荐










