自平衡摩托车的强化学习

机器学习不一定是无法部署到 MCU 的复杂模型,它可能是一种无模型的学习算法。

工具和机器

Arduino工程套件

摩托车平衡约 10 -15 秒,但进一步训练和改变奖励函数的激励可以训练它平衡更长时间。

这一切是如何开始的

平衡 $ 倒摆 $ 是控制课程中普遍使用的例子,许多可用的解决方案都使用 $ PID 控制 $ $ 强化学习的概念。 $ 尽管这是我第一次体验强化学习,但我尝试了对经典倒摆问题略有不同的看法。

我决定使用 $ Arduino 工程套件 中的一个机器人:$ 自平衡摩托车。在摩托车中,惯性轮用于平衡系统,而不是控制旋转摆锤的手推车。我想将 Q 学习算法应用于摩托车,而不是经典的推车杆问题,因为摩托车在套件中已经有一个高质量的 $ Simscape $ 模型。我用它来训练和测试不同版本的算法。尽管该模型是近似值,并不能完美地描述现实生活中的摩托车,但在部署到实际硬件之前,这是一个很好的起点。

背景

强化学习是智能体的迭代过程,通过与智能体交互来学习在其环境中表现最佳。这意味着智能体学习实现目标的方式是通过在其环境中尝试不同的行为并接收正面或负面反馈,也称为探索。

在自平衡摩托车的背景下,代理是控制惯性轮的电机。它与环境交互的方式是以不同的速度旋转轮子,它接收到的反馈是新的角位置和速度,由机载 IMU 测量。正反馈和负反馈由独特的奖励函数决定;我在下面详细阐述了奖励功能。

下面是 Q 学习迭代的高级图:

Q 学习(一种基本的强化学习算法)遵循以下一组基本步骤:

1. 初始化用于选择最佳动作的 Q 矩阵

2. 获取系统的当前状态。

3.给定当前状态,选择对应的奖励最大化的行动,或者如果要探索,要获得更多的环境反馈,选择随机行动。

4. 找到给定该操作的新状态,然后执行该操作。

5. 计算奖励,包括即时奖励和折扣长期奖励。

6. 使用计算出的奖励更新 Q 矩阵。

7. 从步骤 2 重复

步骤 4 – 6 发生在算法执行的一个时间步长中。

我使用的状态是摩托车的角位置(长度为 M 的向量)和角速度(长度为 N 的向量)。动作是扭矩命令(长度为 P 的矢量)。Q 矩阵是一个 M x N x P 向量,它显示了所有可能的状态和每个状态下的每一个可能的动作。关键是要对每个空间进行足够粗略的离散化,以捕获学习内容。

哪些有效,哪些无效

1. 我在 $ Simulink $ 和 $ Stateflow 中实现了 Q-learning 的基本算法 。 $ Stateflow 是一个特别有用的工具,因为它帮助我对 Q 学习算法的离散状态进行建模,并将 $、MATLAB、$ 和 Simulink 函数合并到流程中。

2. 在算法的第一个版本中,我尝试了一组精细离散的动作(对电机的扭矩命令),但矩阵太大而无法上传到 Arduino。我使动作空间和 Q 矩阵更加粗略离散,并使用较小的数据类型,例如 uint16 和 int8(在适当的情况下)使代码大小恰到好处,可以上传到 Arduino。我了解到,较小的数据类型表示太小,无法准确训练模型,因此我必须找到其他方法来减小矩阵大小,同时又不牺牲其值的精细表示。

3. 我实验的另一个因素是探索时间,它决定了智能体选择随机行动而不是最佳行动以从其环境中学习的时间。我使用了一个函数,随着时间的增加,探索的概率会降低,我可以手动设置我想要探索的时间。在上面的 Stateflow 图中,概率由变量“ep”表示,探索时间由“expMin”表示。

4. 我使用了提供的 Simscape 模型(来自 $ 这篇文章 $ ),这样对数据类型和大小没有限制,以后我可以缩小模型。我使用这个模型来确定硬件训练中使用的最佳学习参数。

5. 在转向硬件之前,我必须进一步减小模型的尺寸,因此在考虑了其他倒摆控制器后,我决定使用砰砰(前进或后退)控制器,以尽可能小的动作空间。这允许我使用更大的数据类型(浮点)来表示 Q 矩阵。

6. 在训练硬件时,我的第一个奖励是通过算法的原始迭代次数,然后随着模型的改进,我过渡到当前的奖励函数。

7. 我目前的奖励函数更喜欢低角速度、小角度和平衡点周围的快速振荡。当机器人跌倒时,会受到惩罚。

8. 我将状态空间的间距从均匀分布更改为平衡点周围的更高分辨率。

9. 我通过将 bang-bang 控制器输出乘以取决于机器人偏离 0 的程度的系数,人为地增加了动作空间的大小。因此,无论 bang-bang 控制器输出如何,然后都会按比例放大或缩小。这些因素是通过反复试验发现的,我发现它们是 0.75 *角位置 + 0.1 * 角速度。

10. 我的成功标准是机器人平衡 10 秒。但是,在达到目标后,我没有禁用训练算法,因为继续训练模型不会损害其性能。继续更新 Q 矩阵可以使其收敛得越来越接近最佳值。

复制

1. Arduino工程套件附带三个项目,其中一个是自平衡摩托车。组装说明随套件一起在线提供。按照Arduino工程套件提供的说明下载所需的软件来对项目进行编程。

2. 组装好摩托车后,在此处下载可用的文件 $ 并打开 RL_balance.slx 模型。插入电池并打开电机托架的电源。

3. 运行模型。首次运行它时,它需要一段时间才能上传。

4. 运行时,拿起摩托车并绕所有 3 个主轴旋转来校准 IMU。“校准状态”显示块应显示 1。

5. 在示波器块中,您将看到 theta、theta 点和扭矩命令的测量值。手动尝试平衡摩托车,同时在平衡点所在的 theta 示波器上可视化。

然后,使用“倾斜补偿”滑块将 theta 偏移该量(位于 IMU 输出模块内)。

例如,如果您看到摩托车的物理平衡点在 theta = -0.5 附近,则将倾斜补偿滑块向右移动 0.5 以抵消此误差。

6. 将物理平衡点与 theta = 0 同步后,您可以单击“isBal”摇杆开关以指示机器人处于平衡状态。

7. 单击“按住”的摇杆开关一次以禁用训练循环。将摩托车保持在靠近 theta = 0 的直立位置。

8. 单击按住的摇臂开关继续循环,让电机接合,然后松开摩托车,不要向任一方向推动。

9. 当摩托车摔倒时,训练就结束了。从步骤 7 开始重复以继续训练。

10.要有耐心。从这个角度来看,15个小时的训练是10秒钟的平衡。

11. 为了更好地训练模型,您可以尝试采取一些措施,例如提高状态和动作空间的分辨率,将 Q 矩阵初始化为除所有零以外的其他值,并尝试不同的奖励函数,这些奖励函数更喜欢不同的结果。

12. Q-learning算法在达到目标(平衡10秒)时“收敛”。换言之,Q 矩阵不会发生明显变化。与训练与部署分开的神经网络不同,Q-learning 是无模型的,因此部署算法与训练算法相同。我们之所以能够做到这一点,是因为训练Q学习算法的计算成本很低。

相关链接:

https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe $

ww1.mnemstudio.org

BF00992698.pdf (springer.com)

bookdraft2017nov5.pdf (incompleteideas.net)

Similar Posts

Leave a Reply