type
status
date
slug
summary
tags
category
icon
password

为什么要自己在二维栅格环境中进行激光雷达的仿真?

目前移动机器人的仿真环境已经非常成熟,可供选择的环境也非常多,应用较多多的有gazebo,Webots等,相关的技术支持论坛等也非常多。
但是这些仿真器第一通常对硬件有较高的需求,而且配置比较繁杂,在Linux/Windows上配置方法差异较大,程序也较难移植。
第二就是时间成本高。在强化学习中,我们一般都要将整个运动控制离散化为步(step)这个概念,在每一步开始接受环境的信息,利用信息进行决策,然后执行动作;如此往复。如果我们使用仿真器或者真实机器人来实现这个步的过程,一般是让机器人持续运动一段时间,例如以0.1m/s的速度,运动1s。这个过程至少需要1s,也就是每一步的时间至少为1s。而强化学习的训练中,几万步都是一个很短的训练过程,在一些复杂的环境中,十万步甚至更多都是有可能的。假设一个训练需要50000步,那这个训练时间大概要13小时,即使我们进行5到6倍的加速,也需要三个小时。这个时间成本还是比较巨大的。
第三就是实际的机器人的控制需要很多的平滑控制等工作。这些工作在实际机器人上是必要的,但是对于网格训练来说是可有可无的。所以前期工作还是把重心放在核心的训练工作上,确保能实现网络的收敛之后在进行落地工作比较合理。

在二维栅格环境中模拟搭载二维激光雷达的移动机器人

二维栅格环境可以使用任意的编程语言进行实现,这里我参考的是
DeepRL-Navigation
MehdiHmidi523Updated Dec 3, 2023
,整个代码使用opencv来实现仿真,代码非常简单,但是实现效果很好,代码的可读性也很高,这里我fork了一份,对于环境仿真部分进行了一点中文注释,想看中文注释的可以参考
DeepRL-Navigation
Zachary19980701Updated Feb 8, 2024

机器人本体仿真

在程序中,机器人的本体的模拟非常简单,是将机器人看作一个长方形。主要包含三个部分,即
  • 机器人中心点参数
  • 机器人几何参顺
  • 机器人控制参数
机器人的中心点参数
机器人的中心点参数有三个,即坐标x,y和方向角theta。
机器人的几何参数
程序中将机器人的看作一个长方形,那么机器人的几何参数就是这个长方形的长和宽,在程序中需要计算机器人是否碰撞时,使用机器人的中心点参数和几何参数,就能得到机器人的边界点的坐标,判断是否碰撞。
机器人的控制参数
机器人控制参数主要是对速度进行限幅,避免角速度和线速度过大。

机器人本体仿真的代码实现

本体仿真代码实现主要是在agentKinematics.py中实现。
仿真主要的步骤为

激光雷达仿真

激光雷达的仿真在代码中不是很直观,但是原理还是较为简单的。首先在加载地图过程中进行了二值化,将障碍物的颜色转化为为黑色。然后计算得到每一条激光雷达线的坐标点,判断当前坐标点的颜色是否为黑色,如果是黑色,就认为是碰到了障碍物,计算当前坐标点到机器人坐标点的距离,就得到了激光雷达的距离信息。
这个步骤主要在Vision.py中实现,具体细节可以参考代码注释。其中有两个点比较关键,就是获取激光线的坐标点判断坐标点到障碍物的距离

计算当前激光线中的所有坐标点(Bresenham算法)

这里使用的Bresenham算法来计算坐标点。Bresenham算法是计算机图形学中广泛使用的一种画直线算法,非常适合栅格环境中的光线仿真。对于我们的这种简单的二维栅格环境,能够高效的实现激光雷达仿真。
具体的Bresenham算法的讲解可以参考下面的链接,这方面的资料很多。顺带一提,Bresenham不止在计算机图形学中应用,在数控机床的插补,机械臂的末端位姿控制中都有大量的应用。
 
 
程序中的Bresenham是一种简化的方法,因为Bresenham通常是避免出现浮点数的,只使用整数型。在C/Cpp中,一般使用移位来高效的实现除2这个操作。这里简化了一些,无伤大雅。

判断当前坐标点是否为障碍物

通过上述步骤,我们就能成功的计算得到机器人的运动信息和激光雷达的深度信息,因为是采用直接计算机器人的位姿,而且物理环境的精度不高,需要计算物理量非常少。所以这个环境相比一般应用的仿真器,训练速度大大加快,在关闭可视化的情况下,我个人电脑速度大概能够达到2000 steps/s。这个速度可以说比Gazebo环境加速百倍不止!大大简化了强化学习的前期训练工作。
一个状态估计问题——机器人学中的状态估计(二)gazebo中加载多个机器人模型