【从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
}
相关推荐
hhb_6183 分钟前
全方位综合能力AI智能体专项测试技术文档
人工智能·microsoft
汤愈韬4 分钟前
模型求解算法
人工智能·算法·机器学习
wangxin2089 分钟前
多智能体协作收敛效率关键:大模型幻觉和角色视角
人工智能·ai·多智能体·团队协作·管理学·组织管理·coordclaw
circuitsosk15 分钟前
知识问答领域大语言模型设计:对标豆包与DeepSeek的工程实践
人工智能·python·语言模型·自然语言处理·llm·豆包·deepseek
卷无止境15 分钟前
从源码到货架:拆解 Python 打包发布的核心逻辑
后端·python
u01030552716 分钟前
Java I/O核心操作实战
人工智能·1024程序员节
QZSJTR19 分钟前
数据驱动与效果监控:泉州企业 GEO 优化的度量体系怎么搭
人工智能·ai搜索优化·geo优化
celiahul21 分钟前
当搜索引擎变成“问答机器人”,你的网站该如何适配?
网络·人工智能·搜索引擎·内容运营·外贸推广
KJ_BioMed25 分钟前
Science Advances论文复现:461个香豆素分子的虚拟筛选参数解析
人工智能·生物医药·科研干货·科晶生物·小分子药物
这就是佬们吗27 分钟前
企业Agent落地为什么需要RAG?
人工智能·python·fastapi