动手学运动规划: 2.4.c 3次螺旋线代码解析

科技   2024-10-11 09:02   上海  

往前看, 别回头啊.   — 漫长的季节 王响

🏰代码及环境配置:请参考 环境配置和代码运行!


本节提供了贝塞尔曲线的代码测试

python3 tests/curves/cubic_spiral_test.py

2.4.c.1 3次螺旋线代码代码实现

我们定义了CubicSpiral , 实现了

class CubicSpiral:
    def __init__(self, a0, a1, a2, a3, start_x=0, start_y=0, start_theta=0) -> None:
        self.start_x = start_x
        self.start_y = start_y
        self.start_theta = start_theta
        self.a = [a0, a1, a2, a3]

    def calc_curvature(self, s):
        return self.a[0] + self.a[1] * s + self.a[2] * s**2 + self.a[3] * s**3
        
    def calc_theta(self, s):
        return normallization(
            self.start_theta
            + (self.a[3] * s**4 / 4)
            + (self.a[2] * s**3 / 3)
            + (self.a[1] * s**2 / 2)
            + (self.a[0] * s)
        )

我们基于上一节的辛普森规则, 实现了相应的x, y的计算

    def calc_coarse_x(self, s):
        h = s / 8

        sum_cos = (
            cos(self.calc_theta(0))
            + 4 * cos(self.calc_theta(h))
            + 2 * cos(self.calc_theta(2 * h))
            + 4 * cos(self.calc_theta(3 * h))
            + 2 * cos(self.calc_theta(4 * h))
            + 4 * cos(self.calc_theta(5 * h))
            + 2 * cos(self.calc_theta(6 * h))
            + 4 * cos(self.calc_theta(7 * h))
            + cos(self.calc_theta(s))
        )

        return self.start_x + (s / 24) * sum_cos

    def calc_coarse_y(self, s):
        h = s / 8

        sum_sin = (
            sin(self.calc_theta(0))
            + 4 * sin(self.calc_theta(h))
            + 2 * sin(self.calc_theta(2 * h))
            + 4 * sin(self.calc_theta(3 * h))
            + 2 * sin(self.calc_theta(4 * h))
            + 4 * sin(self.calc_theta(5 * h))
            + 2 * sin(self.calc_theta(6 * h))
            + 4 * sin(self.calc_theta(7 * h))
            + sin(self.calc_theta(s))
        )

        return self.start_y + (s / 24) * sum_sin

为了进行对比, 我们调用了python中的求积分方法:scipy.integrate.quad 作为真值.

    def calc_x(self, s):
        def cos_theta(t):
            theta = self.calc_theta(t)
            return cos(theta)

        result, error = quad(cos_theta, 0, s)
        return self.start_x + result

    def calc_y(self, s):
        def sin_theta(t):
            theta = self.calc_theta(t)
            return sin(theta)

        result, error = quad(sin_theta, 0, s)
        return self.start_y + result

2.4.c.1 3次螺旋线代码代码测试

cubic_spiral_test中, 我们随机生成了螺旋线的参数 , 之后使用:直接计算积分和辛普森两种方法计算x, y进行对比.

a0 = 0
a1 = random.uniform(-0.10.1)
a2 = random.uniform(-0.010.01)
a3 = random.uniform(-0.0010.001)
cubic_spiral = CubicSpiral(a0, a1, a2, a3)

效果如上图所示, 很明显可以看到:

  • 当整体曲率不大时, 辛普森方法精度很高
  • 当曲率较大时, 辛普森方法累计误差会越来越大

不过对于运动规划算法来说, 车辆允许的曲率本身就比较小(大部分情况不超过0.2). 所以辛普森方法在运动规划算法的应用中, 精度是足够的.


🏎️自动驾驶小白说官网:https://www.helloxiaobai.cn

🐮GitHub代码仓:https://github.com/Hello-Xiao-Bai/Planning-XiaoBai!

🔥课程答疑,面试辅导:https://shop380995420.taobao.com

🌠代码配合官网教程食用更佳!

🚀知乎,微信,知识星球全平台同号!

https://files.mdnice.com/user/73288/8c26a97c-90c4-4f6b-b1be-d213454ba3c7.png

推荐阅读:

端到端如火如荼, 传统规划控制还有前途吗?

如何入门运动规划算法? 50篇教程教你手把手推导公式! 实现代码!

端到端解读: Imitation Is Not Enough - 在运动规划中克服模仿学习的局限性


自动驾驶小白说
输出专业自动驾驶算法教程的开发者社区. 🦈 官网: https://www.helloxiaobai.cn
 最新文章