【动手学运动规划】 3.3 确定性采样:基于控制空间采样

news2024/11/22 16:32:40

要往前走,就得先忘掉过去。

—《阿甘正传》
在这里插入图片描述

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


确定性采样运动规划是一种采用确定性采样策略进行运动规划的方法。它通过按照预定规则生成采样点来构建解空间,并用于后续的路径搜索或优化过程。这种方法具有确定性和可重复性、高效性和适应性等优势,但也面临采样策略设计、高维空间问题和计算复杂度等挑战。其主要分为基于控制空间的采样和基于状态空间的采样,接下来将分别介绍这两种采样方式。

基于控制空间(control space)的采样是运动规划中的一种重要方法,它侧重于在控制量的空间内进行采样,以生成可能的控制输入,进而通过这些控制输入来规划出运动轨迹。这种方法特别适用于需要考虑车辆或机器人动力学/运动学约束的情况。

假设一个机器人运动的状态方程为 s ˙ = f ( s , u ) \dot{s}=f(s, u) s˙=f(s,u),其中 s s s表示所有可能的状态,例如位置信息 x x x y y y,速度信息 x ˙ \dot{x} x˙ y ˙ \dot{y} y˙等, u u u表示控制输入。如下图所示:当前状态为 s 0 s_{0} s0,在采取不同的控制输入 u 0 , u 1 , u 2 u_{0} ,u_{1},u_{2} u0,u1,u2时,可以产生不同的终点状态 s f 0 , s f 1 , s f 2 s_{f}^{0} ,s_{f}^{1} ,s_{f}^{2} sf0,sf1,sf2 和不同的运动轨迹 s 0 → s f 0 , s 0 → s f 1 , s 0 → s f 2 s_{0}\overset{}{\rightarrow} s_{f}^{0} ,s_{0}\overset{}{\rightarrow}s_{f}^{1} ,s_{0}\overset{}{\rightarrow}s_{f}^{2} s0sf0,s0sf1,s0sf2

3.3.1 基本概念

  • 控制空间:由车辆或机器人的控制量构成的空间(例如对于车辆而言,可以将方向盘转角速率和纵向加加速度作为控制变量)。在这个空间中,每一个点都代表了一组特定的控制输入。
  • 采样策略:指在运动规划过程中,直接在控制空间内按照一定的规则或策略进行采样,生成一系列的控制输入组合。然后,通过车辆或机器人的动力学/运动学模型,将这些控制输入转化为相应的运动轨迹,并进行评估和优化。
  • **车辆的动力学/运动学模型:**具体细节在1.1节中讲解,此处不再赘述

3.3.2 优缺点

  • 优点
    1. 符合动力学/运动学约束:直接在控制空间内进行采样,能够确保生成的轨迹符合车辆或机器人的动力学/运动学约束。
    2. 灵活性:采样策略可以根据具体问题的需求进行调整和优化,提高算法的灵活性
  • 缺点
    1. 计算复杂性:需要对每个采样的控制序列进行状态推演,可能导致高计算成本。
    2. 优化难度:在控制空间中进行优化可能比在状态空间中更复杂。
    3. 采样效率:需要有效的采样策略来确保搜索效率和解的质量。

3.3.3 应用实例

3.3.3.1 无人机

  • 若将无人机的状态为三维位置( x , y , z x, y, z x,y,z)和三维速度( x ˙ , y ˙ , z ˙ \dot{x}, \dot{y}, \dot{z} x˙,y˙,z˙),控制输入为三维加速度( x ¨ , y ¨ , z ¨ \ddot{x},\ddot{y},\ddot{z} x¨,y¨,z¨),并以此构建状态方程 s ˙ = A ⋅ s + B ⋅ u \dot{s} = A\cdot s + B\cdot u s˙=As+Bu,采用不同的控制输入,采样出来的轨迹如下图所示:

  • 若将状态为三维位置( x , y , z x, y, z x,y,z)、三维速度( x ˙ , y ˙ , z ˙ \dot{x}, \dot{y}, \dot{z} x˙,y˙,z˙),三维加速度( x ¨ , y ¨ , z ¨ \ddot{x},\ddot{y},\ddot{z} x¨,y¨,z¨),输入选为三维 j e r k jerk jerk,则采用不同的控制输入,采样出来的轨迹如下图所示:

3.3.3.1 自动驾驶车辆

以自动驾驶车辆为例,一般情况下使用1.1节中的运动状态方程即可。此处的状态空间相比于1.1节中有更丰富的信息,不详细介绍,仅仅列出相应的公式,有兴趣者可自行研究。

状态空间为:

                                                  $\left [ x, y, theta,\delta, v, a \right ] ^{T}$ 

控制量为:

[ ω , j e r k ] T [ \omega , jerk] ^{T} [ω,jerk]T

状态转移模型为:

x ˙ = v cos ⁡ θ y ˙ = v sin ⁡ θ θ ˙ = v tan ⁡ δ L δ ˙ = ω v ˙ = a a ˙ = j \begin{array}{l}\dot{x}=v \cos \theta \\\dot{y}=v \sin \theta \\\dot{\theta}=\frac{v \tan \delta }{L} \\\dot{\delta}=\omega \\\dot{v}=a \\\dot{a}=j\end{array} x˙=vcosθy˙=vsinθθ˙=Lvtanδδ˙=ωv˙=aa˙=j

并且基于状态量,我们可以基于以下公式得到kappa和dkappa:

k a p p a = tan ⁡ δ L d k a p p a = d k d s = d k d t d t d s = ω L v cos ⁡ δ cos ⁡ δ \begin{align*} kappa &= \frac{\tan \delta }{L} \\dkappa &= \frac{dk}{ds} =\frac{dk}{dt}\frac{dt}{ds}=\frac{\omega }{Lv\cos \delta \cos \delta} \end{align*} kappadkappa=Ltanδ=dsdk=dtdkdsdt=Lvcosδcosδω

其中: ( x ,   y ) \left ( x, \ y \right ) (x, y) 是车辆的位置, θ \theta θ 是车辆的航向角(横摆角), ϕ \phi ϕ 是前轮转角, δ \delta δ 是前轮转角, ω \omega ω 前轮转角速度, L L L是车辆轴距, v v v是车辆速度, a a a是车辆加速度, j j j是车辆加加速度。

本节提供了基于控制空间采样的代码测试,其中代码是以1.1节中的自行车模型为基础进行实现的:

python3 tests/sampling_based_planning/control_based_sampler_test.py

3.3.c.1 基于控制空间采样的代码实现

tests/sampling_based_planning/control_based_sampler_test.py 中定义了轨迹的生成方式,其中:

start_p :轨迹的起点

v :车辆的驾驶速度,在每一阶段,按照匀速行驶

max_steer :车辆最大的前轮转角

min_steer :车辆最小的前轮转角

delta_steer :方向盘转角的分辨率

delta_t:生成轨迹点的时间分辨率

total_t:轨迹的总时长

def generate_trajectories(
    start_p, v, min_steer, max_steer, delta_steer, delta_t, total_t
):
    trajectories = []
    for steer in np.arange(min_steer, max_steer + delta_steer, delta_steer):
        points = [start_p]
        points[-1].steer = steer
        for t in np.arange(0, total_t, delta_t):
            new_p = bicycle_model(points[-1], v * delta_t)
            points.append(new_p)
        trajectories.append(points)
    return trajectories

3.3.c.2 基于控制空间采样的代码测试

在测试中,分为两个阶段,第一个阶段从起始点开始,按照不同的前轮转角往前推出行驶轨迹(效果图中的洋红色曲线),第二阶段,以第一阶段轨迹的最后一个点为起点,然后继续按照不同的前轮转角往前推出行驶轨迹(效果图中的灰色曲线);然后设置不同的cost来评估每一条曲线,最后基于cost选出最优轨迹(为了测试,代码中的cost没有填充,只是随机选择了一条轨迹,效果图中的红色曲线)。

从效果图也可以看出,基于控制空间的采样方式可以生成满足运动学约束的曲线,但由于没有其他约束,会导致生成需要无用的轨迹(例如超出道路边界等)。

def plot_trajectories(trajectories, color="m"):
    for points in trajectories:
        plt.plot([p.x for p in points], [p.y for p in points], color=color)

def select_optimal_path(paths, random_select=True):
    if random_select:
        return paths[np.random.randint(len(paths))]
    # 这里可以添加更复杂的评估逻辑来选择最佳路径
    return None

def main():
    start_p = Point()
    start_p.theta = 0.0
    start_p.v = 4.0
    max_steer = 0.6
    min_steer = -0.6
    delta_steer = 0.2
    delta_t = 0.1
    total_t = 2.0

    # First phase.
    fig = plt.figure()
    first_phase_trajectories = generate_trajectories(
        start_p, start_p.v, min_steer, max_steer, delta_steer, delta_t, total_t
    )
    plot_trajectories(first_phase_trajectories)

    # Second phase.
    second_phase_paths = []
    for curve in first_phase_trajectories:
        second_phase_trajectories = generate_trajectories(
            curve[-1], curve[-1].v, min_steer, max_steer, delta_steer, delta_t, total_t
        )
        plot_trajectories(second_phase_trajectories, color="grey")
        for path in second_phase_trajectories:
            # Connect the trajectories of first phase and second phase.
            path = curve[:-1] + path
            second_phase_paths.append(path)

    # Select a optimal path: we can set many cost to evaluate the path, such as:
    # 1. Distance cost.
    # 2. Speed cost.
    # 3. Steer cost.
    # 4. Acceleration cost.
    # 5. Jerk cost.
    # ...
    # Here, we randomly select a path from the curve_list.
    selected_curve = select_optimal_path(second_phase_paths)
    plt.title("ControlBasedSampler")
    animation_car(
        fig,
        selected_curve,
        save_path=get_gif_path(
            pathlib.Path(__file__), str(pathlib.Path(__file__).stem)
        ),
    )

if __name__ == "__main__":
    main()


🏎️自动驾驶小白说官网:https://www.helloxiaobai.cn
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Java虚拟机(五)

介绍对象的标记算法及引用详解 1、引用计数器 引用计数器在对象中添加一个引用计数器,当一个地方引用的时候,计数器1,当引用失效时,计数器值就-1。 但是在Java里面存在对象循环引用:objA 和 objB都有字段instance&a…

Javaee:阻塞队列和生产者消费者模型

文章目录 什么是阻塞队列java中的主要阻塞队列生产者消费者模型阻塞队列发挥的作用解耦合削峰填谷 模拟实现阻塞队列put方法take方法生产者消费者模型 什么是阻塞队列 阻塞队列是一种支持阻塞操作的队列,在多线程中实现通线程之间的通信协调的特殊队列 java中的主…

git仓库分支

操作 切换分支 git checkout 1.2.5 git checkout 1.3.0 使用命令切换分支之后,代码内容加载过后也是切换好的

安卓基础001

前言 也是好久没有更新博客了,最近实习也是需要学习一些知识哈哈哈哈哈哈为了更好的发展嘛,咱们从客户端开始,过程可能有点像写前端,不喜勿喷,希望在学习的过程中也可以给大家带来一些简单得帮助吧....... tips:这里跳过安卓studio安装,大家可自行寻找教程 写的不详细,只是为了…

使用web.dev提供的工具实现浏览器消息推送服务

文章目录 前言实现工具和效果实现原理实现过程前端接收用户订阅请求将用户订阅信息更新到后端后端实现接收并保存订阅信息的接口后端实现消息推送的逻辑前言 对于电商独立站来说,新品上架或者促销活动上线及时通知到用户是很重要的,通知的渠道有很多,其中就包括浏览器消息推…

在Bash脚本中 set -e 是什么意思

问题 我正在研究这个预安装(preinst)脚本的内容,该脚本会在从 Debian 软件包(.deb)文件解压该包之前执行。 脚本包含以下代码: #!/bin/bash set -e # Automatically added by dh_installinit if [ "$1" install ]; thenif [ -d /usr/share…

服务器宝塔安装哪吒监控

哪吒文档地址:https://nezha.wiki/guide/dashboard.html 一、准备工作 OAuth : 我使用的gitee,github偶尔无法访问,不是很方便。第一次用了极狐GitLab,没注意,结果是使用90天,90天后gg了,无法登…

JavaEE初阶---网络原理(四)--IP协议/DNS协议

文章目录 1.初识网络层(了解即可)2.地址管理2.1动态分配2.2网络地址转换2.3IP-v6最终解 3.网段划分4.以太网协议--数据链路层5.DNS应用层协议 1.初识网络层(了解即可) 网络层做的事情就是下面的两个: 1)地…

邮件发送excel带预览excel功能

excel 打开后的内容: 思路: 1、邮件发送excel 是作为附件发送出去的; 2、excel 预览是,必须另外点击预览按钮,并不能直接预览邮件内容然后在邮件主体内容展示出来 根据以上两点基本没法实现 邮件发送后邮件自带 预览功能。 伪方法…

Spring Boot 3 + Spring Security + Knife4j 无法访问 Swagger 文档的问题及解决方案

背景介绍 在使用Spring Boot 3框架结合Spring Security进行项目开发时,我们可能会遇到集成Knife4j后Swagger文档无法正常访问的情况。本文将探讨可能的原因以及相应的解决办法。 常见问题 问题描述 当配置好Spring Security后尝试通过Knife4j访问API文档页面时&…

构建校园社团信息管理平台:Spring Boot技术的核心要点

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)

1. Spring 中常见注解 还有Recourse:相当于AutowiredQualifier Value : 用于将配置文件中的值注入到Bean的字段中。 Bean : 用于在配置类中声明一个Bean。 Lazy : 用于延迟加载Bean。 2. SpringMVC 中常见注解 还有GetMapping PostMapping PutMapping DeleteMapp…

深度学习笔记之BERT(一)BERT的基本认识

深度学习笔记之BERT——BERT的基本认识 引言回顾:Transformer的策略回顾:Word2vec的策略和局限性 BERT \text{BERT} BERT的基本理念抽象的双向BERT的预训练策略 预训练与微调 引言 从本节开始,将介绍 BERT \text{BERT} BERT系列模型以及其常…

【华为HCIP实战课程二十八】中间到中间系统协议IS-IS邻居关系排错,网络工程师

一、ISIS邻居关系条件 1、同一层次(比如Level-2路由器不能和Level-1路由器形成邻居关系) 2、同一区域(L1必须同一区域) 3、同一网段 R1和R2之间分别配置如下IP地址和掩码: R1 的接口S1/0/0掩码为/24 R2的接口S1/0/0配置成掩码/28: 此时R1和R2依然可以建立ISIS邻居关系…

微信小程序,打开新的项目,调试遇见[ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json

1,首先,在开发工具右上角,打开详情;设置基础库;3.6.3 2,第二步,在项目目录下,找到app.json文件存在 3,第三步,修改项目根目录下,project.config.j…

使用RabbitMQ实现微服务间的异步消息传递

使用RabbitMQ实现微服务间的异步消息传递 RabbitMQ简介 安装RabbitMQ 在Ubuntu上安装RabbitMQ 在CentOS上安装RabbitMQ 配置RabbitMQ 创建微服务 生产者服务 安装依赖 生产者代码 消费者服务 消费者代码 运行微服务 消息模式 直接模式 生产者代码 消费者代码 扇出模式 生产…

数字教学的创新引擎:构建数字教学知识库

在教育行业,数字化转型正成为推动教育现代化的重要力量。数字教学知识库作为这一转型的核心组成部分,对于整合教育资源、提升教学质量、促进教育公平具有重要意义。本文将探讨数字教学知识库的构建策略、应用价值,并分析其在教育行业的深远影…

【ArcGISPro】制作简单的ArcGISPro-AI助手

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_ai大模型流式输出效果(打字效果) python-CSDN博客 【C#】调用本机AI大模型流式返回_怎么实现调用本地大模型时实现流式输出-CSDN博客 【ArcGISPro】宣布推…

web文件包含include

php伪协议 在 PHP 中,伪协议(Pseudo Protocols) 也被称为 流包装器,这些伪协议以 php:// 开头,后面跟着一些参数,用于指定 要执行的操作 或 需要访问的资源。 伪协议表明这些协议并不是一个 真实的外部协议…

【力扣打卡系列】验证二叉搜索树

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day17 验证二叉搜索树 题目描述 解题思路 前序遍历:先访问节点值,再访问左右子树有效二叉搜索树的定义 节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节…