当前位置: 首页 > article >正文

【从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.kler.cn/a/320495.html

相关文章:

  • ArcGIS Pro ADCore DAML
  • 5个有效的华为(HUAWEI)手机数据恢复方法
  • 【C++动态规划】3148. 矩阵中的最大得分|1819
  • Javascript——设计模式(一)
  • 【Java多线程】单例模式(饿汉模式和懒汉模式)
  • 蓝桥杯备赛(持续更新)
  • Stable Diffusion 使用详解(11)--- 场景ICON制作
  • 逆向推理+ChatGPT,让论文更具说服力
  • eclipse git 不小心点了igore,文件如何加到git中去。
  • CentOS下安装Kibana(保姆级教程)
  • TypeScript 设计模式之【装饰模式】
  • ArrayList 与 LinkedList 的区别?
  • fastzdp_redis第一次开发, 2024年9月26日, Python操作Redis零基础快速入门
  • Linux标准IO(三)-格式化I/O输出
  • SpringBoot集成阿里easyexcel(一)基础导入导出
  • 使用爬虫编写一个挖掘更多关键词的脚本
  • 在深度学习中,是否应该打破正负样本1:1的迷信思想?
  • 戴尔笔记本电脑——重装系统
  • 安卓桌面Launcher负一屏如何实现各种方案比较设计
  • RNN模型学习
  • Kotlin Android 环境搭建
  • 网络原理3-应用层(HTTP/HTTPS)
  • C++三大特性——继承性(超万字详解)
  • 传奇外网架设教程带图文解说—Gee引擎
  • 如何在Excel中快速找出前 N 名,后 N 名
  • 【程序大侠传】应用内存缓步攀升,告警如影随形