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

Racecar Gym

Racecar Gym 

参考:https://github.com/axelbr/racecar_gym/blob/master/README.md

1. 项目介绍

Racecar Gym 是一个基于 PyBullet 物理引擎的 reinforcement learning (RL) 训练环境,模拟微型 F1Tenth 竞速赛车。它兼容 Gym API 和 PettingZoo API,支持 single-agent 和 multi-agent 任务。

2. 环境结构

• Observations(观测)

通过sensors(传感器)获取,包括:

pose(位置 & 方向)

lidar(激光雷达)

rgb_camera(相机图像)

• Actions(动作)

由 actuators(执行器)控制:

 motor(油门,范围 -1 到 1)控制赛车前进或后退,-1 代表倒车,1 代表加速到最大速度。

 steering(方向盘,范围 -1 到 1)控制转向,-1 代表最左,1 代表最右,0 代表直行。

action space 是一个 dict,包含键 motor 和 steering 

action_space = {
    "motor": [-1, 1],  # 范围 -1 (倒车) 到 1 (全速前进)
    "steering": [-1, 1]  # 范围 -1 (左转) 到 1 (右转)

action = {"motor": 0.5, "steering": -0.8} 

“motor”: 0.5 → 以 50% 的油门向前加速。

 “steering”: -0.8 → 方向盘向左转 80%。

 

• State(环境状态)

wall_collision(是否碰撞墙壁)

opponent_collisions(是否与其他agent碰撞)

progress(当前赛道进度)

lap(圈数)

rank(比赛排名)

wrong_way(是否逆行)

3. 代码示例解析

代码 1:安装 Racecar Gym

git clone https://github.com/axelbr/racecar_gym.git  # 下载项目代码
cd racecar_gym                                       # 进入项目目录
pip install -e .                                     # 以可编辑模式安装

 pip install -e .:安装本地包,允许修改后立即生效

代码 2:Gym API 使用示例

import gymnasium  # 导入 Gymnasium(新版 Gym)
import racecar_gym.envs.gym_api  # 导入 racecar_gym

env = gymnasium.make(
    id='SingleAgentAustria-v0',  # 选择环境(奥地利赛道)
    render_mode='human'          # 设置渲染模式
)

gymnasium.make():创建环境

 id='SingleAgentAustria-v0':选择预定义的单代理(Single-Agent)环境

render_mode='human':启用人类可视化渲染

代码 3:自定义 Scenario

env = gymnasium.make(
    id='SingleAgentRaceEnv-v0', 
    scenario='path/to/scenario.yml',  # 加载自定义赛道
    render_mode='rgb_array_follow',   # 以RGB图像模式渲染
    render_options=dict(width=320, height=240, agent='A')  # 设定渲染参数
)

scenario='path/to/scenario.yml':指定 YAML 场景文件

render_mode='rgb_array_follow':启用摄像机跟随模式

render_options:设定画面分辨率 & 监控哪个代理(Agent)

代码 4:环境交互(Gym API)

done = False
reset_options = dict(mode='grid')  # 设置重置模式
obs, info = env.reset(options=reset_options)  # 重置环境,获取初始观测值

while not done:
    action = env.action_space.sample()  # 采样随机动作
    obs, rewards, terminated, truncated, states = env.step(action)  # 执行动作
    done = terminated or truncated  # 判断是否终止

env.close()  # 关闭环境

env.reset():重置环境

env.action_space.sample():随机采样动作

env.step(action):

• 输入:执行 action

• 返回值

• obs(新的观测值)

• rewards(奖励值)

• terminated(是否到达终止状态)

• truncated(是否提前截断)

• states(环境状态)

代码 5:PettingZoo API 使用

from racecar_gym.envs import pettingzoo_api  # 导入 PettingZoo API
env = pettingzoo_api.env(scenario='path/to/scenario')  # 加载自定义场景

• pettingzoo_api.env(scenario='...'):使用 multi-agent 版本

4. 赛道 & 代理配置

示例 YAML 场景文件 (austria.yml)

world:
  name: austria  # 赛道名称

agents:
  - id: A
    vehicle:
      name: racecar
      sensors: [lidar, pose, velocity, acceleration]  # 传感器
      actuators: [motor, steering]  # 执行器
      color: blue  # 车辆颜色
    task:
      task_name: maximize_progress  # 任务:最大化进度
      params: {laps: 1, time_limit: 120.0, terminate_on_collision: False}  # 任务参数

• world.name:定义赛道名称

• agents:定义代理(Agent)

• vehicle.name:赛车类型

• sensors:传感器,如激光雷达(lidar)等

• actuators:执行器,如电机(motor)和方向盘(steering)

• color:赛车颜色

• task:定义任务(Task)

• task_name:任务类型,如 maximize_progress(最大化进度)

params:

• laps:完成圈数

• time_limit:时间限制

• terminate_on_collision:是否在碰撞时终止

5. 主要总结

(1)Racecar Gym 是一个 Gym 兼容的微型赛车模拟环境,支持强化学习(RL)

(2) Observation space 通过 sensors 获取,如 lidar, velocity, acceleration

(3) Action space 通过 actuators 控制,如 motor, steering

(4) State 提供额外信息,如 progress, rank, collisions 等。

(5) 代码使用方式

• Gym API:gymnasium.make() 创建环境

• PettingZoo API:pettingzoo_api.env() 适用于 multi-agent 任务

• Scenario(YAML 配置) 可自定义赛道、代理、传感器等

6. 代码结构

• env.reset() 初始化环境

• env.step(action) 执行动作并返回新的状态

• env.close() 关闭环境

示例

假设你有一辆赛车(Agent),它装备了激光雷达(LiDAR)和速度计(Velocity Sensor)

你可以在**车辆配置文件(vehicle configuration)中定义 LiDAR 的范围、分辨率,以及它是否带噪声。

然后,在场景配置(scenario specification)中,你可以选择是否在本次实验中启用 LiDAR。

vehicle:
  name: racecar
  sensors:
    - lidar:
        range: 10.0  # 激光雷达最大测距 10 米
        resolution: 1080  # 1080 线
        noise: 0.02  # 2% 的噪声
    - velocity:
        noise: 0.05  # 5% 的速度测量误差

• 如果你选择不启用 LiDAR,则 Observations 中不会包含它。

• 如果你启用了 LiDAR,赛车在行驶时会获取 1080 线的距离测量数据,并且每个测量值可能有 2% 的误差。

假设赛车有 LiDAR 和 Velocity Sensor,它们的 Observation Space 可能如下:

observation = {
    "lidar": [2.3, 4.5, 3.1, 5.2, 3.8],  # LiDAR 检测的障碍物距离(单位:米)
    "velocity": [3.0, 0.0],  # 速度数据 [前进速度 3m/s,转向速度 0 rad/s]
    "pose": [4.1, 2.3, 0.0, 0.0, 0.0, 1.57]  # 位置(x, y, z)+ 方向角(roll, pitch, yaw)
}

“lidar” 传感器返回 5 个数值,表示前方的障碍物距离。

“velocity” 传感器返回 2 个值,表示线速度(m/s)和角速度(rad/s)。

“pose” 传感器返回 6 个数值,表示位置和旋转角度。

在 AI 训练过程中,每次执行动作后,环境都会返回一个新的 observation dict,代理用它来决策下一步行动。

Vehicle Configuration

定义了赛车的物理特性

• 作用:定义一辆赛车的物理特性,包括传感器(sensors)执行器(actuators)最大速度等。

• 文件位置:通常是 .yaml 文件,例如 differential_racecar.yaml。

• 适用范围:同一个赛车模型可以被多个 scenarios(场景) 复用。

 vehicle:
  name: differential_racecar
  sensors:
    - lidar:
        range: 10.0  # 激光雷达最大探测 10 米
        resolution: 1080  # 1080 条激光束
        noise: 0.02  # 2% 噪声
    - velocity:
        noise: 0.05  # 5% 的速度测量误差
  actuators:
    - motor:   # 车辆的加速度控制
        max_force: 20.0  # 最大驱动力
    - steering: # 车辆的转向控制
        max_angle: 0.4  # 最大方向盘转角(弧度)
  max_speed: 5.0  # 最高速度 5 m/s

(1) name: differential_racecar → 车辆的名称,支持多个不同类型的赛车。

(2) sensors(传感器)

• lidar(激光雷达):最大探测 10 米,有 1080 线,测量有 2% 误差。

• velocity(速度传感器):速度测量有 5% 误差。

(3) actuators(执行器)

• motor(电机):最大驱动力 20 N。

• steering(方向盘):最大转向角 0.4 弧度(约 23°)。

(4) max_speed: 5.0 → 车辆的最高速度为 5 m/s。

 

Scenario Specification

定义了赛车的训练环境

• 作用:定义整个训练环境,包括赛道(track)代理(agents)任务(tasks) 等。

• 文件位置:通常是 .yaml 文件,例如 austria.yml。

• 适用范围:可以加载不同的 vehicle configurations(车辆配置) 来创建不同的训练环境。

world:
  name: austria  # 赛道名称

agents:
  - id: A
    vehicle:
      name: differential_racecar  # 选择使用 differential_racecar.yaml 定义的赛车
      sensors: [lidar, pose, velocity, acceleration]  # 指定使用的传感器
      actuators: [motor, steering]  # 指定控制方式
      color: blue  # 赛车颜色(可选 red, green, blue, yellow, magenta, random)
    task:
      task_name: maximize_progress  # 目标是尽快完成赛道
      params: 
        laps: 1  # 目标完成 1 圈
        time_limit: 120.0  # 120 秒内完成
        terminate_on_collision: False  # 碰撞时是否终止任务

(1) world.name: austria → 选择的赛道是奥地利(Austria)。

(2) agents(代理)

• id: A → 定义代理 A。

• vehicle.name: differential_racecar → 使用 differential_racecar.yaml 作为赛车配置。

• sensors(传感器) → 该赛车将使用 LiDAR(激光雷达)Pose(位置)Velocity(速度)Acceleration(加速度)

• actuators(执行器) → 该赛车使用 motor(油门) 和 steering(方向盘)

• color: blue → 车辆颜色是蓝色(可选 red, green, blue, yellow, magenta, random)。

(3) task(任务)

• task_name: maximize_progress → 代理的目标是尽可能快地完成赛道(最大化进度)。

• laps: 1 → 目标是完成 1 圈

• time_limit: 120.0 → 120 秒内完成,否则失败。

• terminate_on_collision: False → 碰撞后是否终止任务(False 表示继续比赛)。

 

1. 直接加载预设 Scenario 

import gymnasium

import racecar_gym.envs.gym_api

env = gymnasium.make(

    id='SingleAgentAustria-v0',  # 选择预设的 "austria" 赛道

    render_mode='human'          # 启用渲染

)

SingleAgentAustria-v0 已经包含了 scenario specification(场景配置) 和 vehicle configuration(车辆配置),因此直接使用。

2. 加载自定义 Scenario

env = gymnasium.make(
    id='SingleAgentRaceEnv-v0', 
    scenario='path/to/custom_scenario.yml',  # 加载自定义 Scenario
    render_mode='rgb_array_follow',  # 选择渲染模式
    render_options=dict(width=320, height=240, agent='A')  # 设置渲染参数
)

scenario='path/to/custom_scenario.yml' → 这里指定的是 Scenario Specification 文件。

render_mode='rgb_array_follow' → 选择摄像机跟随赛车模式。

3. 训练时加载

 如果你在强化学习训练时使用 Racecar Gym,通常会加载自定义的 scenario

from stable_baselines3 import PPO

# 加载环境
env = gymnasium.make(id="SingleAgentRaceEnv-v0", scenario="my_scenario.yml")

# 训练 AI 代理
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=100000)

# 保存训练的模型
model.save("racecar_model")

scenario="my_scenario.yml" → 加载自己设定的赛道、赛车、任务

PPO("MlpPolicy", env, verbose=1) → 使用 PPO 强化学习算法训练赛车。

 

相关文章:

Racecar Gym

Racecar Gym 参考:https://github.com/axelbr/racecar_gym/blob/master/README.md 1. 项目介绍 Racecar Gym 是一个基于 PyBullet 物理引擎的 reinforcement learning (RL) 训练环境,模拟微型 F1Tenth 竞速赛车。它兼容 Gym API 和 PettingZoo API&am…...

代码随想录36 动态规划

leetcode 343.整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 1…...

离散时间傅里叶变换(DTFT)公式详解:周期性与连续性剖析

摘要 离散时间傅里叶变换(DTFT)是数字信号处理领域的重要工具,它能将离散时间信号从时域转换到频域,揭示信号的频率特性。本文将深入解读DTFT公式,详细阐述其具有周期性和连续性的原因,帮助读者全面理解DT…...

深度学习|表示学习|卷积神经网络|Batch Normalization在干什么?|19

如是我闻: Batch Normalization(批归一化,简称 BN) 是 2015 年由 Ioffe 和 Szegedy 提出 的一种加速深度神经网络训练并提高稳定性的技术。 它的核心思想是:在每一层的输入进行归一化,使其均值接近 0&…...

Go基础之环境搭建

文章目录 1 Go 1.1 简介 1.1.1 定义1.1.2 特点用途 1.2 环境配置 1.2.1 下载安装1.2.2 环境配置 1.2.2.1 添加环境变量1.2.2.2 各个环境变量理解 1.2.3 验证环境变量 1.3 包管理工具 Go Modules 1.3.1 开启使用1.3.2 添加依赖包1.3.3 配置国内包源 1.3.3.1 通过 go env 配置1.…...

echarts、canvas这种渲染耗时的工作能不能放在webworker中做?

可以将 ECharts、Canvas 等渲染耗时的工作放在 Web Worker 中进行处理。Web Worker 允许在后台线程中运行 JavaScript,从而将计算密集型任务从主线程中分离出来,避免阻塞用户界面。以下是一些关键点: 优势 性能提升:将耗时的渲染…...

Android学习21 -- launcher

1 前言 之前在工作中,第一次听到launcher有点蒙圈,不知道是啥,当时还赶鸭子上架去和客户PK launcher的事。后来才知道其实就是安卓的桌面。本来还以为很复杂,毕竟之前接触过windows的桌面,那叫一个复杂。。。 后面查了…...

antd pro框架,使用antd组件修改组件样式

首先用控制台的指针找到组件的类名 然后找到项目的src/global.less文件 在里面进行修改,切记:where(.css-dev-only-do-not-override-5fybr3).ant-input:placeholder-shown这种格式,把where(.css-dev-only-do-not-override-5fybr3)删掉,使用…...

响应式编程_05 Project Reactor 框架

文章目录 概述响应式流的主流实现框架RxJavaReactor Project Reactor 框架Reactor 异步数据序列Flux 和 Mono 组件FluxMono 操作符背压处理 小结 概述 响应式编程_02基本概念:背压机制 Backpressure介绍了响应式流规范以及 Spring 框架中的响应式编程技术&#xff…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者:闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式(Simple Queue)工作队列模式(Work Queue)发布/订阅模式(Publish/Subscribe&#xff…...

导出依赖的几种方法

在 Python 中,你可以使用以下方法导出项目的依赖: 1. 使用 pip freeze pip freeze 可以列出当前环境中安装的所有包及其版本,并将结果保存到 requirements.txt 文件中。 pip freeze > requirements.txt2. 使用 pipreqs pipreqs 可以根…...

CS 与 BS 架构的差异

在数字化的今天,选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式,了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现,当时用户直接从主机获取数据。随着客户端和服务端…...

OpenCV YOLOv11实时视频车辆计数线:让车辆进出有条理!

前言 大家好!今天我们聊个超级有趣的课题——如何用OpenCV结合YOLOv11进行实时视频车辆计数。是不是很炫酷?车辆进出全都清晰可见,连“跑车”都能精确统计!不过,别急,这可不仅仅是数车那么简单,背后还有许多实际问题等着你去搞定,比如计数线、车速、误检这些麻烦的小问…...

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js ,内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定: 使用 表示src文件所在路径: path.resolve(__dirname,src)…...

java 进阶教程_Java进阶教程 第2版

第2版前言 第1版前言 语言基础篇 第1章 Java语言概述 1.1 Java语言简介 1.1.1 Java语言的发展历程 1.1.2 Java的版本历史 1.1.3 Java语言与C/C 1.1.4 Java的特点 1.2 JDK和Java开发环境及工作原理 1.2.1 JDK 1.2.2 Java开发环境 1.2.3 Java工作原理 1.…...

Windows Docker笔记-安装docker

安装环境 操作系统:Windows 11 家庭中文版 docker版本:Docker Desktop version: 4.36.0 (175267) 注意: Docker Desktop 支持以下Windows操作系统: 支持的版本:Windows 10(家庭版、专业版、企业版、教育…...

hot100(7)

61.31. 下一个排列 - 力扣(LeetCode) 数组问题,下一个更大的排列 题解:31. 下一个排列题解 - 力扣(LeetCode) (1)从后向前找到一个相邻的升序对(i,j),此时…...

DeepSeek辅助学术写作【对比概念】效果如何?

DeepSeek-R1在论文写作细节方面有很多好的应用。我们下面通过具体案例来逐一展示这些功能。 DeepSeek-R1在提问方面,可以简化提示词也能给出精准得答案。我们来一探究竟! 对比概念(功能指数:★★★★★) DeepSeek-R1在概念对比方面的功能也非常强大。由…...

基础相对薄弱怎么考研

复习总体规划 明确目标 选择专业和院校:根据你的兴趣、职业规划和自身实力,选择适合自己的专业和院校。可以参考往年的分数线、报录比、复试难度等。了解考试科目:不同专业考试科目不同,一般包括: 公共课&#xff1a…...

kakailio官网推荐的安装流程ubuntu 22.04

https://kamailio.org/docs/tutorials/6.0.x/kamailio-install-guide-git/ # 非必须项 wget -O- https://deb.kamailio.org/kamailiodebkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/kamailio.gpg在/etc/apt/sources.list文件追加以下内容 deb [signed-by/usr/sh…...

如何从零构建6GHz开源矢量网络分析仪:3个核心模块详解

如何从零构建6GHz开源矢量网络分析仪:3个核心模块详解 【免费下载链接】LibreVNA 100kHz to 6GHz 2 port USB based VNA 项目地址: https://gitcode.com/gh_mirrors/li/LibreVNA LibreVNA是一款功能强大的开源USB矢量网络分析仪,工作频率覆盖100k…...

西门子1517F与KTP精致屏:主机厂程序框架探秘

西门子1517F搭配KTP精致屏 主机厂程序框架模板,程序结构清晰,主流程采用顺控器编写,包含各种常用功能块的手自动以及手动调用,HMI画面多采用多路复用,大大缩短编程时间, 组态从站有拧紧枪,以及从…...

Redis集群模式下如何高效模糊匹配Key?RedisTemplate+Scan全节点遍历实战

Redis集群环境下高效模糊匹配Key的工程实践 Redis作为高性能缓存数据库,在分布式系统中扮演着重要角色。当系统规模扩大,单节点Redis无法满足需求时,集群模式成为必然选择。但在集群环境下,如何高效地进行模糊Key匹配却成为开发者…...

VSCode集成clang-tidy实现多语言命名规范自动化检查

1. 为什么需要自动化命名规范检查 在团队协作开发中,代码命名规范就像交通规则一样重要。想象一下,如果每个司机都按照自己的习惯开车,那道路会乱成什么样子?代码也是如此。我曾经接手过一个遗留项目,发现同一个变量在…...

收藏!小白也能看懂:Transformer残差连接新处理方式,大模型学习必备!

本文介绍了Kimi团队提出的一种新的Transformer残差连接处理方式,旨在解决传统Transformer模型中“PreNorm稀释”问题。通过引入“注意力残差”,每一层使用Softmax机制选择性地组合前层输出,有效缓解了深层网络训练中的梯度消失问题。此外&…...

PyCharm实战:从零到一完成YOLOv11自定义数据集训练

1. 环境准备与数据集配置 第一次用PyCharm跑YOLOv11训练时,我对着满屏的代码和配置文件差点放弃。后来发现只要环境装对了,后面都是顺水推舟。这里分享几个新手容易踩的坑:CUDA版本和PyTorch不匹配会导致显卡根本用不上,conda环境…...

如何在树莓派上搭建Spotify Connect客户端:Raspotify完整安装配置指南

如何在树莓派上搭建Spotify Connect客户端:Raspotify完整安装配置指南 【免费下载链接】raspotify A Spotify Connect client that mostly Just Works™ 项目地址: https://gitcode.com/gh_mirrors/ra/raspotify 想要将你的树莓派变成专业的Spotify Connect音…...

如何用OpenClaw的cron定时任务功能,每天自动发送待办清单

要实现“每天自动发送待办清单”,你需要将 Cron 定时触发器、待办管理 Skills​ 和消息推送渠道三者打通。这里提供两套最实用的方案,推荐优先使用 CLI 命令方案,它更稳定且易于调试。🚀 方案一:CLI 命令配置&#xff…...

MySQL 8.0 等保合规实战:手把手配置开源审计插件 server_audit.so

MySQL 8.0 等保合规审计插件实战指南 在数字化转型浪潮中,数据库安全审计已成为企业合规运营的刚需。对于使用MySQL 8.0的企业而言,如何在不影响性能的前提下满足等保2.0三级及以上对数据库审计的要求,是每位DBA和安全工程师必须掌握的技能。…...

在Ubuntu 22.04上,用Docker搞定PaddleOCR-VL多版本CUDA部署(含FlashAttention避坑)

在Ubuntu 22.04上实现PaddleOCR-VL多版本CUDA容器化部署全指南 当深度学习项目遇上多版本CUDA环境时,开发者往往陷入依赖地狱。本文将带你用Docker构建一个完整的PaddleOCR-VL解决方案,涵盖从环境隔离到性能调优的全流程,特别针对50系显卡的F…...