跳转至

停车牌停车时间判定 Lua Sample(api 0.2)

1. 包资源

下载示例包 lua_stop_sign.zip

目前 Lua zip 包结构如下,(压缩 zip 包时确保顶级目录如下图所示,不要针对整个目录压缩),其中:

  • debug_server: 包含一些 lua 调试工具,可忽略。

  • lua_path :包含了一些第三方 Lua 库

  • luac_path :包含了一些用 C 实现的 Lua 库,这些都可以由开发者自行扩展

  • main.lua :Lua 包的入口文件,请不要更改上述文件及目录名。

  • stop_sign.xodr :是一个包含停车标志的地图,这个 Lua 判定包要完成的功能就是判断车辆是否在停车牌 10 米范围内合法车道上停车了大于 3 秒的时间。

更详细的规则是:

当主车离开停车牌区域时,判定主车是否曾在该区域内停车超过 3 秒。若满足条件,判定为通过;否则,判定为失败并返回错误。

2. 代码注释

# 下方代码完成引用路径的设置,不用更改。

simone_cur_dir = simone.get_lua_dir()
d = package.config:sub(1,1)
package.path = package.path .. ';' .. simone_cur_dir .. d .. 'lua_path' .. d .. '?.lua;' .. simone_cur_dir .. d .. "?.lua"
if (d == '/') then
    package.cpath = package.cpath .. ';' .. simone_cur_dir .. d .. 'luac_path' .. d .. '?.so'
elseif (d == '\\') then
    package.cpath = package.cpath .. ';' .. simone_cur_dir .. d .. 'luac_path' .. d .. '?.dll'
end

# 设置一些用例配置。

json = require "json"
EXPECT_API_VERSION = "0.2"

signal_type_stop_sign = "1010200100001914"
singal_subtype_none = "none"
traffic_sign_judge_parking_time = 3
stop_signal_distance = 10
succ = false

# on_init 函数会在用例载入时执行,完成初始化工作,目前只是检查 lua api 版本是否相符。

function on_init()
    if (simone.LUA_API_VERSION ~= EXPECT_API_VERSION) then
        simone.log_error("version error, enviroment api version is " .. simone.LUA_API_VERSION)
        return false
    end

    return true
end

# on_loop 函数每一帧都会被调用,C++ 会将当前车辆列表(vehicles)、上一帧的车辆列表(pre_vehicles)、主车 id(main_id) 都传入进来。

function on_loop(vehicles, pre_vehicles, main_id)
    main_vehicle = vehicles[main_id]
    cur_t = main_vehicle:get_double(simone.IDX_TIME)

    -- 判断主车是否在标志牌区域内
    in_region = main_vehicle:in_traffic_sign_region(
        signal_type_stop_sign,
        singal_subtype_none,
        stop_signal_distance)
    -- 获取当前是否是停止状态
    stopped = main_vehicle:get_bool(simone.IDX_STOPPED)
    -- 设置一个内置变量,值是"处于停车牌内并且是停车状态"
    simone.var.set("stop_in_region", (in_region and stopped), cur_t)

    -- stopped_time 值就是维持"处于停车牌内并且是停车状态"变量为真的时间长度,即在区域内停车了多久
    stopped_time = simone.var.been_true_for_how_long("stop_in_region", cur_t)
    -- simone.log_info("stop in region for " .. stopped_time .. " seconds")

    -- 如果时间足够长,设置用例成功
    if stopped_time > traffic_sign_judge_parking_time then
        succ = true
    end

    -- 检测 "in_region" 是否由真变假,即判断离开停车牌区域的时机
    simone.var.set("in_region", in_region, cur_t)
    if simone.var.is_falling("in_region") then
        -- 离开时:若用例已成功则返回成功,否则返回失败
        _result_msg = json.encode({stopped_time = stopped_time})
        if (succ) then
            _result = simone.SUCC
        else
            _result = simone.FAIL
        end
        return
    else
        -- 还未离开区域,结果未知,返回 PENDING
        _result = simone.PENDING
        _result_msg = ""
    end

end

# 用例结束时调用,可以为空。

function on_exit()

end