【从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
}
相关推荐
cnxy1881 小时前
围棋对弈Python程序开发完整指南:步骤4 - 提子逻辑和劫争规则实现
开发语言·python·机器学习
数新网络1 小时前
CyberScheduler —— 打破数据调度边界的核心引擎
人工智能
TheSumSt2 小时前
Python丨课程笔记Part3:语法进阶部分(控制结构与基础数据结构)
数据结构·笔记·python
Codebee2 小时前
Ooder框架8步编码流程实战 - DSM组件UI统计模块深度解析
人工智能
ha_lydms2 小时前
5、Spark函数_s/t
java·大数据·python·spark·数据处理·maxcompute·spark 函数
Deepoch2 小时前
智能升级新范式:Deepoc开发板如何重塑康复辅具产业生态
人工智能·具身模型·deepoc·智能轮椅
赋创小助手2 小时前
融合与跃迁:NVIDIA、Groq 与下一代 AI 推理架构的博弈与机遇
服务器·人工智能·深度学习·神经网络·语言模型·自然语言处理·架构
静听松涛1332 小时前
多智能体协作中的通信协议演化
人工智能
基咯咯2 小时前
Google Health AI发布MedASR:Conformer 医疗语音识别如何服务临床口述与对话转写
人工智能
白日做梦Q3 小时前
深度学习模型评估指标深度解析:不止于准确率的科研量化方法
人工智能·深度学习