导航菜单

跳到内容

thibo73800/macar公司

存储库文件导航

Metacar:浏览器中的自动驾驶汽车强化学习环境。

欢迎捐款

Metacar公司是一个用于在浏览器中运行的自动车辆的二维强化学习环境。该项目旨在通过解决有趣的问题,让每个人都能更容易地进行强化学习。Metacar附带了一组预定义的级别,有些级别比其他级别更难处理。不久将添加更多级别和可能的场景(行人、自行车……)。此外,该库允许您创建自己的级别并个性化环境,以创建所需的场景。

如果你想成为项目的一部分,无论是在环境中实现特性还是演示算法,请随时加入这个松弛通道提出问题,谈论你所有的奇妙想法!

要开始使用metacar进行开发,请查看文档和API参考

你也可以看看在线演示.

文档

目录:

  1. 入门
  2. 您的第一个环境
  3. 与环境互动
  4. 自定义环境
  5. 编辑自己的级别

入门

安装Metacar

您可以在HTML文件中使用Metacar和直接链接,也可以从NPM安装。然而,metacar基于皮克斯.js:4.7.1,则需要将pixi.js作为全局依赖项包含在HTML中。

脚本标记

<!DOCTYPE html>
<html格式>
<>
    < 字符集="utf-8型" /><标题>Metacar:文档</标题>
    <脚本 型钢混凝土="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.7.1/pixi.min.js"></脚本>
</>
<身体>
    <脚本 型钢混凝土="https://cdn.jsdelivr.net/combine/npm/metacar网站@0.1.1,净现值/0.1.1米塔尔"></脚本>
</身体>
</html格式>

OR脚本标记和NPM

npm i元卡
<!DOCTYPE html>
<html格式>
<>
    < 字符集="utf-8型" /><标题>Metacar:文档</标题>
    <脚本 型钢混凝土="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.7.1/pixi.min.js"></脚本>
</>
<身体>
    <脚本 型钢混凝土="您的脚本.js"></脚本>
</身体>
</html格式>
进口 Metacar公司  “元星”;

您的第一个环境

即使你可以创建自己的级别,Metacar提供了一组可在以下位置访问的预定义级别元级别。选择级别后,可以使用它创建第一个环境。

//选择一个级别
常数 水平 = 元星.水平.级别1;
//创造环境
常数 环境价值 = 新的 元星.环境价值(“环境”, 水平);
//加载它
环境价值.负载();

您还必须在HTML文件中创建容器。

<div公司 身份证件="环境价值"></div公司>

(注意:可以使用级别参数的对象或字符串实例化metar.env:文档API)

精彩的!您刚刚创建了第一个元卡环境。你可以花一些时间左右玩箭头键来移动汽车。当前碰撞系统支持检测以下事件:

  • 与其他车辆碰撞。
  • 使用激光雷达检测车辆、地面和道路。
  • 检测车辆驶出轨道。

如果您想向检测系统添加新功能,可以考虑为项目做出贡献:)

与环境互动

动作空间

默认情况下,环境附带一个简单的运动引擎(如何更改运动引擎?)它可以让你用箭头控制汽车。然后,动作是向上、向左、向右、向下、等待。加载环境后,可以查看动作空间。

环境价值.负载().然后(() => {
    慰问.日志(环境价值.actionSpace操作空间());
});
{type:“离散”,//数字是离散的size:1,//只需要一个数字范围:[0,1,2,3,4]//操作可以是0,1,2中,3或4}

播放和停止

假设您的代理已经接受过培训,可以在任何情况下继续前进(幸运的是,我们正在进行模拟)。然后您可能想实时测试它以查看结果。

最快的方法是让环境在每次循环时调用给定的函数。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“播放”, () => {
        //向前移动
        常数 奖励 = 环境价值.(0);
        //记录奖励
        慰问.日志(奖励);
    });

});

你应该看到按钮。单击时,车辆将向前移动,只要车辆在轨道上,奖励应为正,然后当车辆离开道路时,奖励为负。

要停止调用函数,可以在屏幕上添加停止按钮。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“播放”, () => {
        //向前移动
        常数 奖励 = 环境价值.(0);
        //记录奖励
        慰问.日志(奖励);
    });

    环境价值.addEvent(添加事件)(“停止”, () => {
        慰问.日志(“停止按钮已按下。”);
    });

});

训练你的经纪人

在培训期间,环境不再在屏幕上渲染。训练结束后,您必须通过调用env.render(true)来通知环境,以便再次渲染环境。

环境状态由四个字段组成:

{a: number |未定义//车辆加速度(如果有)激光雷达:数字[][]//激光雷达点值线性:数字[]//平坦激光雷达值+汽车当前速度转向:数字|未定义//汽车的转向角(如果有)}

下面是一个简单的训练循环示例。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“火车”, () => {
        对于 ( =0;  < 100; ++){
            //获取激光雷达的当前状态
            常数 状态 = 环境价值.获取状态();
            //向前移动
            常数 奖励 = 环境价值.(0);
        }
        //记录奖励
        环境价值.提供(真的);
    });

});

重置和洗牌环境

要重置环境,您可以调用

    环境价值.重置();

或者添加一个按钮从网页上执行此操作。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“自定义”, () => {
        环境价值.重置();
    });

});

您还可以在地图上移动车辆(代理和其他车辆)的位置。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“只洗牌代理人”, () => {
        环境价值.洗牌({汽车以下为:});
    });

    环境价值.addEvent(添加事件)(“全部洗牌”, () => {
        环境价值.洗牌();
    });

});

定制环境

!警告:必须调用本节中介绍的方法之前加载环境。

更改运动引擎

有两种运动引擎可用:BasicMotion和ControlMotion。

基本运动

这是默认的运动引擎。汽车的运动可以是向上、向下、向左、向右或等待。汽车从给定角度左右转动。

可以使用setMotion方法更改运动引擎的参数。

环境价值.setAgentMotion(设置代理运动)(元星.运动.基本运动, {旋转步骤以下为:0.25});
//更改属性后加载环境。
环境价值.负载();

控制运动

运动控制基于汽车油门和转向角的两个连续值。然后,该操作是由两个浮点值组成的数组。(请参见actionSpace操作空间)

环境价值.setAgentMotion(设置代理运动)(元星.运动.ControlMotion公司);
//更改属性后加载环境。
环境价值.负载();

更改激光雷达属性

有四个属性可以更改。每条线的点数(pts)、激光雷达覆盖区域的宽度和高度以及相对于汽车的位置(pos)。

环境价值.setAgentLidar(设置代理激光雷达)({pts(点)以下为:, 宽度以下为:1.5, 高度以下为:1.5, 销售时点情报系统以下为:1});
//更改属性后加载环境。
环境价值.负载();

停下其他车辆

您可以选择使用env.carsMoving()移动或停止其他车辆

环境价值.汽车移动();
//更改属性后加载环境。
环境价值.负载();

其他方法

从计算机加载文件

此功能可用于从计算机加载一个文件的内容(实例)。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“负载”, (内容) => {
        //这里是加载文件的内容。
        慰问.日志(内容);
    },{地方的以下为:真的});

});

在计算机上保存文件

此外,您可能希望将经过训练的模型的结果保存在计算机上。

环境价值.节约(“我的模型内容”, “model.metacar”)

添加自定义事件

env.addEvent()附带一组预定义的事件(“train”、“play”、“stop”、“reset_env”、“load”),但您也可以使用页面上的关联按钮创建自定义事件。Bellow,自定义事件在Click上保存文件的示例。

环境价值.负载().然后(() => {

    环境价值.addEvent(添加事件)(“我的自定义事件”, () => {
        环境价值.节约(“我的模型内容”, “model.metacar”);
    });

});

编辑新级别

创建编辑器只需要三行:

常数 水平 = 元星.水平.级别1;
无功功率,无功功率 编辑 = 新的 元星.编辑(“环境”, 水平);
编辑.负载();

左键单击在一个项目上选择它。然后在地图上左键单击以设置项目。右键单击用于删除项目。

保存级别

编辑.负载().然后(() => {

    编辑.addEvent(添加事件)(“保存”, (内容) => {
       //将内容保存到本地存储中,或者
       //检索下载的json。
    }, {下载以下为:真的, 名称以下为:“mylevel.json”});

});