停车牌停车时间判定 Lua Sample(api 0.2)¶
1. 包资源¶
目前 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
