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

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

废话几句

废话不多说,直接上源码

目录结构

init.py

python 复制代码
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,进行可视化
  • 后段接入运动学等函数可随意进行扩展
python 复制代码
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

  • 主函数入口
python 复制代码
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

-车辆配置文件

yaml 复制代码
{
    "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
}
相关推荐
程序员小嬛几秒前
(TETCI 2024) 从 U-Net 到 Transformer:即插即用注意力模块解析
人工智能·深度学习·机器学习·transformer
毕设源码-钟学长32 分钟前
【开题答辩全过程】以 基于Python的健康食谱规划系统的设计与实现为例,包含答辩的问题和答案
开发语言·python
SEO_juper1 小时前
生成式引擎优化(GEO)终极指南:优化品牌在对话式AI中的呈现与推荐
人工智能·chatgpt·seo·geo·数字营销
小程故事多_801 小时前
AI Agent进阶架构:用渐进式披露驯服复杂性
人工智能·架构
百***78751 小时前
Grok-4.1技术深度解析:双版本架构突破与Python API快速集成指南
大数据·python·架构
人工智能AI技术2 小时前
【Agent从入门到实践】10 决策模块:Agent如何“思考问题”
人工智能
2501_942191772 小时前
基于YOLO11-HSFPN的数字检测与识别模型实现详解
python
qq_527887872 小时前
联邦经典算法Fedavg实现
人工智能·深度学习
天天讯通2 小时前
数据公司与AI五大主流合作模式
人工智能
Clarence Liu3 小时前
AI Agent开发(2) - 深入解析 A2A 协议与 Go 实战指南
开发语言·人工智能·golang