【从0开始自动驾驶】用python做一个简单的自动驾驶仿真可视化界面

【从0开始自动驾驶】用python做一个简单的自动驾驶仿真可视化界面

  • 废话几句
  • 废话不多说,直接上源码
    • 目录结构
    • init.py
    • simulator.py
    • simple_simulator_app.py
    • vehicle_config.json

废话几句

  • 自动驾驶开发离不开仿真软件
  • 成品仿真软件种类多
  • https://zhuanlan.zhihu.com/p/321771761#:~:text=%E5%8D%95%E5%B0%B1%E8%87%AA%E5%8A%A8%E9%A9%BE%E9%A9%B6%E4%BB%BF%E7%9C%9F,%E5%90%84%E8%87%AA%E7%9A%84%E5%8F%AF%E5%8F%96%E4%B9%8B%E5%A4%84%E3%80%82
  • 问题在于
    • 软件大多为WINDOWS环境,不一定满足开发环境需求
    • 软件大多收费,受版权影响
    • 软件较为复杂,普通开发任务无需复杂仿真软件
  • 那么
    • 以最简单的方式从0开始搭建一个可视化仿真软件
    • 直接使用python matplot库进行可视化
    • 后段采用简单车辆运动学控制可视化界面
      在这里插入图片描述

废话不多说,直接上源码

目录结构

  • src
    • simple_simulator_app.py
    • config
      • vehicle_config.json
    • lib
      • init.py
      • simulator.py

init.py

import json
import copy


def import_veh_cfg(veh_cfg_path):
    with open(veh_cfg_path, "r", encoding="utf-8") as load_f:
        veh_cfg_ori = json.load(load_f)
        return veh_cfg_ori


def init_veh_cfg(veh_cfg_path):
    veh_cfg_ori = import_veh_cfg(veh_cfg_path)
    # print(veh_cfg_ori)
    veh_cfg = copy.deepcopy(veh_cfg_ori)
    return veh_cfg

simulator.py

  • 使用class编写的仿真器
  • 输入为车辆x、y、yaw,进行可视化
  • 后段接入运动学等函数可随意进行扩展
import numpy
import matplotlib.pyplot as plt


class simulator:
    def init_simulator(self, veh_cfg):
        plt.ion()
        self.veh_cfg = veh_cfg

    def draws(self, x, y, yaw, xmin, xmax, ymin, ymax):
        self.veh_x = x
        self.veh_y = y
        self.veh_yaw = yaw  # 角度

        plt.clf()  # 清除之前画的图
        plt.xlim(xmin, xmax)
        plt.ylim(ymin, ymax)
        plt.title("simulator")
        plt.xlabel("X/m")
        plt.ylabel("Y/m")
        ax = plt.gca()
        ax.set_aspect(1)  # 保持纵横比

        self.draw_veh()
        plt.pause(0.001)

    def draws_close(self):
        plt.ioff()

    def draw_veh(self):  # yaw以x轴为0,逆时针为正

        plt.plot(self.veh_x, self.veh_y, "o", color="r")
        self.ca_veh_points()
        plt.plot(self.veh_x_points, self.veh_y_points, color="r")

    def ca_veh_points(self):  # 计算车辆包络框的所有点
        half_veh_width = self.veh_cfg["width"] / 2
        self.veh_yaw_rad = numpy.deg2rad(self.veh_yaw)

        self.veh_x_points = [
            self.veh_x
            + (self.veh_cfg["length"] - self.veh_cfg["rear_overhang"])
            * numpy.cos(self.veh_yaw_rad)
            + half_veh_width * numpy.sin(self.veh_yaw_rad),
            self.veh_x
            + (self.veh_cfg["length"] - self.veh_cfg["rear_overhang"])
            * numpy.cos(self.veh_yaw_rad)
            - half_veh_width * numpy.sin(self.veh_yaw_rad),
            self.veh_x
            - (self.veh_cfg["rear_overhang"]) * numpy.cos(self.veh_yaw_rad)
            - half_veh_width * numpy.sin(self.veh_yaw_rad),
            self.veh_x
            - (self.veh_cfg["rear_overhang"]) * numpy.cos(self.veh_yaw_rad)
            + half_veh_width * numpy.sin(self.veh_yaw_rad),
            self.veh_x
            + (self.veh_cfg["length"] - self.veh_cfg["rear_overhang"])
            * numpy.cos(self.veh_yaw_rad)
            + half_veh_width * numpy.sin(self.veh_yaw_rad),
        ]
        self.veh_y_points = [
            self.veh_y
            + (self.veh_cfg["length"] - self.veh_cfg["rear_overhang"])
            * numpy.sin(self.veh_yaw_rad)
            - half_veh_width * numpy.cos(self.veh_yaw_rad),
            self.veh_y
            + (self.veh_cfg["length"] - self.veh_cfg["rear_overhang"])
            * numpy.sin(self.veh_yaw_rad)
            + half_veh_width * numpy.cos(self.veh_yaw_rad),
            self.veh_y
            - (self.veh_cfg["rear_overhang"]) * numpy.sin(self.veh_yaw_rad)
            + half_veh_width * numpy.cos(self.veh_yaw_rad),
            self.veh_y
            - (self.veh_cfg["rear_overhang"]) * numpy.sin(self.veh_yaw_rad)
            - half_veh_width * numpy.cos(self.veh_yaw_rad),
            self.veh_y
            + (self.veh_cfg["length"] - self.veh_cfg["rear_overhang"])
            * numpy.sin(self.veh_yaw_rad)
            - half_veh_width * numpy.cos(self.veh_yaw_rad),
        ]

simple_simulator_app.py

  • 主函数入口
import time

from lib.init import *
from lib.simulator import *

if __name__ == "__main__":
    
    veh_cfg_path = r"./config/vehicle_config.json"

    veh_cfg = init_veh_cfg(veh_cfg_path)

    simulator_ = simulator()
    simulator_.init_simulator(veh_cfg)

    for i in range(0, 20):
        simulator_.draws(
            i, 15 + i * 0.3, 30 + i, 0, 30, 0, 30
        )  # veh_x, veh_y, veh_yaw, xmin, xmax, ymin, ymax
        time.sleep(0.1)

    plt.pause(1000)  # 暂停几秒看一看结果

vehicle_config.json

-车辆配置文件

{
    "vehicle_type": "test",
    "front_wheel_base": 1.3,
    "rear_wheel_base": 1.3,
    "width": 1.9,
    "length": 4,
    "rear_overhang": 0.4,
    "max_steer_wheel_angle": 35.0,
    "steer_ratio": 17.5
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Debian与Ubuntu:深入解读两大Linux发行版的历史与联系

Debian与Ubuntu:深入解读两大Linux发行版的历史与联系 引言 在开源操作系统的领域中,Debian和Ubuntu是两款备受瞩目的Linux发行版。它们不仅在技术上有着密切的联系,而且各自的发展历程和理念也对开源社区产生了深远的影响。本文将详细介绍…

10分钟,AI如何精准写出社会热点文?一篇爆款文章的背后你敢信?

本文背景 很多小伙伴们反馈,用AI输出的文章经常被平台判定为“疑似AI创作”,一但被判定,系统就不会给推荐流量。 到底在这个充斥着AI的大环境下,应该怎样完成AI文章的写作呢?特别是做流量主项目的小伙伴们,…

探索甘肃非遗:Spring Boot网站开发案例

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  …

Library介绍(二)

时序弧(timing arc) 描述2个节点延迟信息的数据,可以分为net delay和cell delay两大类。 Net delay: drive cell output pin和drived cell input pin之间的net delay,取决于net rc和drive cell驱动能力及drived cell的load。 C…

Java五子棋

目录 一:案例要求: 二:代码: 三:结果: 一:案例要求: 实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘,把每个元素赋值位“┼”可以画出棋…

Rust和Go谁会更胜一筹

在国内,我认为Go语言会成为未来的主流,因为国内程序员号称码农,比较适合搬砖,而Rust对心智要求太高了,不适合搬砖。 就个人经验来看,Go语言简单,下限低,没有什么心智成本&#xff0c…

【代码】Zotero|用文章标题更新 Zotero 的参考文献引用条目信息的 Quicker 动作

如题。 目前只支持期刊和会议文章,并且只支持谷歌学术或 DBLP 能搜到的文章,知网的不支持,如果有人有需要我可以去试着写,但我很懒我看大家也没这个需求。 很早就写完了,一直忘记推了。 刚写完的时候心情是很激动的&a…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 文章目录 系列文章目录前言一、装饰器语法6.Builder语法:(1&…

理解Python闭包概念

闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想。 1.概念介绍 首先看一下维基上对闭包的解释: 在计算机科学中,闭包…

eNSP的AR设备启动错误40解决方案之一

解决方法: 打开控制面板------>程序------>启用或关闭Windows功能,(取消勾选)Window虚拟机监控程序平台 和 虚拟机平台(使用虚拟机时要打开这两功能!!!!)

第八届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)

一.题目分析 (1).题目 (2).题目分析 1.按键功能分析----过程控制 a. 选择按键按下的个数和目标层数(每个按键都要在一秒之内按下,否则就结束) b. 当升降机到达目标平台,LED灯熄灭 c.…

【YOLO目标检测车牌数据集】共10000张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:10000(2000张绿牌、8000张蓝牌) 标注数量(txt文件个数):10000 标注类别数:1 标注类别名称:licence 数据集下载:车牌数据…

excel导出图片---HSSFWorkbook--SXSSFWorkbook

1 概述 平时在工作中,excel导出图片经常会用到,但奈何HSSFWorkbook导出数据数量有限制问题,所以企业里大多都用SXSSFWorkbook格式,很少用HSSFWorkbook。所以今天以这两种格式分别记录下,图片的导出过程。 2 HSSFWork…

C++:模拟实现vector

目录 成员变量与迭代器 size capacity empty 迭代器有关函数 实现默认成员函数的前置准备 reserve ​编辑 ​编辑 push_back 构造函数 无参构造 迭代器区间构造 n个val来进行构造 析构函数 拷贝构造函数 赋值重载 增删查改 clear resize pop_back inser…

Java SE 总结

Java SE(Standard Edition)是Java编程语言的标准版本,提供了基础的编程环境和API,适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。 1. Java环境基础 具体可参考这里对三者的介绍 传送门 1.1 JVM…

大厂面试真题-说一下Mybatis的缓存

首先看一下原理图 Mybatis提供了两种缓存机制:一级缓存(L1 Cache)和二级缓存(L2 Cache),旨在提高数据库查询的性能,减少数据库的访问次数。注意查询的顺序是先二级缓存,再一级缓存。…

MySQL Performance Schema 详解及运行时配置优化

引言 MySQL 的 Performance Schema 是一套性能监控与诊断工具,帮助开发者和数据库管理员收集、分析 MySQL 实例的运行状态,找出性能瓶颈并进行优化。通过 Performance Schema,我们能够监控不同的内部事件、线程、会话、语句执行等关键性能指…

Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )

文本目录: ❄️一、哈希表: ☑ 1、概念: ☑ 2、冲突-概念: ☑ 3、冲突-避免: ☞ 1)、避免冲突-哈希函数的设计: ☞ 2)、避免冲突-负载因子调节(重点): ☑ 4、冲突-解决&…

cloud-(Nacos)--注册中心原理-服务注册-服务发现

并且通过(RestTemplate)Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题 在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务就引入了注册中心的概念。注册中心、服务提供者、服务消费者三者间关系如下: 流程如下: 服务启动…