In [1]:
using AutomotiveDrivingModels
# All the functions related to visualization
using AutoViz
In order to generate the road network, one first initializes a Roadway object.
In [2]:
roadway = Roadway();
In [3]:
# Define coordinates of the entry and exit points to the intersection
r = 5.0 # turn radius
A = VecSE2(0.0,DEFAULT_LANE_WIDTH,-π)
B = VecSE2(0.0,0.0,0.0)
C = VecSE2(r,-r,-π/2)
D = VecSE2(r+DEFAULT_LANE_WIDTH,-r,π/2)
E = VecSE2(2r+DEFAULT_LANE_WIDTH,0,0)
F = VecSE2(2r+DEFAULT_LANE_WIDTH,DEFAULT_LANE_WIDTH,-π)
Out[3]:
3-element VecSE2{Float64}:
13.0
3.0
-3.141592653589793
The next step consists in appending all the lanes to the road network. We can define a helper function to add a new lane to the roadway.
In [4]:
function append_to_curve!(target::Curve, newstuff::Curve)
s_end = target[end].s
for c in newstuff
push!(target, CurvePt(c.pos, c.s+s_end, c.k, c.kd))
end
return target
end
Out[4]:
append_to_curve! (generic function with 1 method)
Example of a lane that consists in 3 road segments, a straight curve (from the left to the center), a turning part (right turn) and a final straight curve. You can visualize the lane that has been added to the roadway
In [5]:
# Append right turn coming from the left
curve = gen_straight_curve(convert(VecE2, B+VecE2(-100,0)), convert(VecE2, B), 2)
append_to_curve!(curve, gen_bezier_curve(B, C, 0.6r, 0.6r, 51)[2:end])
append_to_curve!(curve, gen_straight_curve(convert(VecE2, C), convert(VecE2, C+VecE2(0,-50.0)), 2))
lane = Lane(LaneTag(length(roadway.segments)+1,1), curve)
push!(roadway.segments, RoadSegment(lane.tag.segment, [lane]))
#visualize first lane
cam = FitToContentCamera(0.0)
render(roadway, cam=cam)
Out[5]:
Let's repeat the process and complete the T-shape intersection
In [6]:
# Append straight left
curve = gen_straight_curve(convert(VecE2, B+VecE2(-100,0)), convert(VecE2, B), 2)
append_to_curve!(curve, gen_straight_curve(convert(VecE2, B), convert(VecE2, E), 2)[2:end])
append_to_curve!(curve, gen_straight_curve(convert(VecE2, E), convert(VecE2, E+VecE2(50,0)), 2))
lane = Lane(LaneTag(length(roadway.segments)+1,1), curve)
push!(roadway.segments, RoadSegment(lane.tag.segment, [lane]))
# Append straight right
curve = gen_straight_curve(convert(VecE2, F+VecE2(50,0)), convert(VecE2, F), 2)
append_to_curve!(curve, gen_straight_curve(convert(VecE2, F), convert(VecE2, A), 2)[2:end])
append_to_curve!(curve, gen_straight_curve(convert(VecE2, A), convert(VecE2, A+VecE2(-100,0)), 2))
lane = Lane(LaneTag(length(roadway.segments)+1,1), curve)
push!(roadway.segments, RoadSegment(lane.tag.segment, [lane]))
# Append left turn coming from the right
curve = gen_straight_curve(convert(VecE2, F+VecE2(50,0)), convert(VecE2, F), 2)
append_to_curve!(curve, gen_bezier_curve(F, C, 0.9r, 0.9r, 51)[2:end])
append_to_curve!(curve, gen_straight_curve(convert(VecE2, C), convert(VecE2, C+VecE2(0,-50)), 2))
lane = Lane(LaneTag(length(roadway.segments)+1,1), curve)
push!(roadway.segments, RoadSegment(lane.tag.segment, [lane]))
# Append right turn coming from below
curve = gen_straight_curve(convert(VecE2, D+VecE2(0,-50)), convert(VecE2, D), 2)
append_to_curve!(curve, gen_bezier_curve(D, E, 0.6r, 0.6r, 51)[2:end])
append_to_curve!(curve, gen_straight_curve(convert(VecE2, E), convert(VecE2, E+VecE2(50,0)), 2))
lane = Lane(LaneTag(length(roadway.segments)+1,1), curve)
push!(roadway.segments, RoadSegment(lane.tag.segment, [lane]))
# Append left turn coming from below
curve = gen_straight_curve(convert(VecE2, D+VecE2(0,-50)), convert(VecE2, D), 2)
append_to_curve!(curve, gen_bezier_curve(D, A, 0.9r, 0.9r, 51)[2:end])
append_to_curve!(curve, gen_straight_curve(convert(VecE2, A), convert(VecE2, A+VecE2(-100,0)), 2))
lane = Lane(LaneTag(length(roadway.segments)+1,1), curve)
push!(roadway.segments, RoadSegment(lane.tag.segment, [lane]))
cam = FitToContentCamera(0.0)
render(roadway, cam=cam)
Out[6]:
We can identify each lane thanks to the following user-defined functions. We define a LaneOverlay object that indicate the lane to highlight. One could implement any custom type to display other information on the lane. We then add a new method to the render! function that execute the specific action (coloring in blue). Look at Autoviz.jl for more detail on the render! function.
Use the slider to highlight each lane. The number corresponds to a road segment.
Note : In order to render the intersection, one must first initialize a Scene object.
In [7]:
using Interact
scene = Scene()
struct LaneOverlay <: SceneOverlay
lane::Lane
color::Colorant
end
function AutoViz.render!(rendermodel::RenderModel, overlay::LaneOverlay, scene::Scene, roadway::Roadway)
render!(rendermodel, overlay.lane, roadway, color_asphalt=overlay.color)
return rendermodel
end
@manipulate for i in 1 : length(roadway.segments)
render(scene, roadway, [LaneOverlay(roadway[LaneTag(i,1)], RGBA(0.0,0.0,1.0,0.5))], cam=cam)
end
Out[7]:
WebIO.mount(this.previousSibling,{"props":{},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"className":"field"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{},"nodeType":"Scope","type":"node","instanceArgs":{"imports":{"data":[{"name":"knockout","type":"js","url":"/assetserver/7727d7cb3453b9ff588804f2f297360e756850e6-knockout.js"},{"name":"knockout_punches","type":"js","url":"/assetserver/dc191505b241da77a1bd06986b7132036babe315-knockout_punches.js"},{"name":null,"type":"js","url":"/assetserver/cf39e83f3445855334efae1f7d0ee012952fe319-all.js"},{"name":null,"type":"css","url":"/assetserver/495af69608d773e6cf6efd8fe98ee33ddbad0df5-style.css"},{"name":null,"type":"css","url":"/assetserver/9d22e7e1c4dccb3a3bef6ae4d24134fd256d4bfd-main.css"}],"type":"async_block"},"id":"knockout-component-fddc2108-64dc-441f-be9a-4530cb07f790","handlers":{"_promises":{"importsLoaded":[function (ko, koPunches) {
ko.punches.enableAll();
ko.bindingHandlers.numericValue = {
init : function(element, valueAccessor, allBindings, data, context) {
var stringified = ko.observable(ko.unwrap(valueAccessor()));
stringified.subscribe(function(value) {
var val = parseFloat(value);
if (!isNaN(val)) {
valueAccessor()(val);
}
})
valueAccessor().subscribe(function(value) {
var str = JSON.stringify(value);
if ((str == "0") && (["-0", "-0."].indexOf(stringified()) >= 0))
return;
if (["null", ""].indexOf(str) >= 0)
return;
stringified(str);
})
ko.applyBindingsToNode(element, { value: stringified, valueUpdate: allBindings.get('valueUpdate')}, context);
}
};
var json_data = JSON.parse("{\"changes\":0,\"value\":3}");
var self = this;
function AppViewModel() {
for (var key in json_data) {
var el = json_data[key];
this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);
}
[this["changes"].subscribe((function (val){!(this.valueFromJulia["changes"]) ? (WebIO.setval({"name":"changes","scope":"knockout-component-fddc2108-64dc-441f-be9a-4530cb07f790","id":"ob_02","type":"observable"},val)) : undefined; return this.valueFromJulia["changes"]=false}),self),this["value"].subscribe((function (val){!(this.valueFromJulia["value"]) ? (WebIO.setval({"name":"value","scope":"knockout-component-fddc2108-64dc-441f-be9a-4530cb07f790","id":"ob_01","type":"observable"},val)) : undefined; return this.valueFromJulia["value"]=false}),self)]
}
self.model = new AppViewModel();
self.valueFromJulia = {};
for (var key in json_data) {
self.valueFromJulia[key] = false;
}
ko.applyBindings(self.model, self.dom);
}
]},"changes":[(function (val){return (val!=this.model["changes"]()) ? (this.valueFromJulia["changes"]=true, this.model["changes"](val)) : undefined})],"value":[(function (val){return (val!=this.model["value"]()) ? (this.valueFromJulia["value"]=true, this.model["value"](val)) : undefined})]},"systemjs_options":null,"observables":{"changes":{"sync":false,"id":"ob_02","value":0},"value":{"sync":true,"id":"ob_01","value":3}}},"children":[{"props":{"attributes":{"style":"display:flex; justify-content:center; align-items:center;"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"attributes":{"style":"text-align:right;width:18%"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"className":"interact ","style":{"padding":"5px 10px 0px 10px"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"label"},"children":["i"]}]},{"props":{"attributes":{"style":"flex-grow:1; margin: 0 2%"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"max":6,"min":1,"attributes":{"type":"range","data-bind":"numericValue: value, valueUpdate: 'input', event: {change : function () {this.changes(this.changes()+1)}}","orient":"horizontal"},"step":1,"className":"slider slider is-fullwidth","style":{}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"input"},"children":[]}]},{"props":{"attributes":{"style":"width:18%"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"attributes":{"data-bind":"text: value"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"p"},"children":[]}]}]}]}]},{"props":{},"nodeType":"Scope","type":"node","instanceArgs":{"imports":{"data":[],"type":"async_block"},"id":"scope-8cfbd96b-0f0a-48ef-8107-eed5c1134dca","handlers":{"obs-output":[function (updated_htmlstr) {
var el = this.dom.querySelector("#out");
WebIO.propUtils.setInnerHtml(el, updated_htmlstr);
}]},"systemjs_options":null,"observables":{"obs-output":{"sync":false,"id":"ob_05","value":"<div class='display:none'></div><unsafe-script style='display:none'>\nWebIO.mount(this.previousSibling,{"props":{"attributes":{"style":"display:flex; justify-content:center; align-items:center;"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"setInnerHtml":"<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAJYCAIAAAB+fFtyAAAABmJLR0QA/wD/AP+gvaeTAAAY5ElEQVR4nO3da3Be953Q8XOemy6WZN0sy/Jdsh3LThw7Fydxk6ZJaJvSbaFAt9ByGbow+7YMM8CyMMM7Bphl2eENMAvsUJZhWGDb3bJp0zTd3OPGuWziy8a32LIdS7Lu98tz4YXbNHUdRXIsS7/k85mxx36O/ke/55W+OvM/50kSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG6WNJPJrPQMAADAh0i//e3elZ4BACJIk6SSXP2TJEm5UkmSpFKpJJWkfPX1ygoOt0RpkmbS9Oo/0/Tq31f/kVQqaZpWAr0X+KSopPd/5uWVHgIAwkjTNJvJ5HLZXC5bXcgXCvnqQr6muqq6Kj87Oz8xNTMxNT02MTU3X1zpSa9VU11oqKutq62pq63OZDIzs3PTM3Mzc3Nzc8W5+WKxWCyWSsVSeaXHBD5QbqUHAIBIKpVKsVQqlkrJbDIxOf3+Q9VVhbra6vo1NR3rW9IkGRmfHBmdGJ2YWqlRkyTJZjJrG9Y0NdQ11NXOzs2PT04Pjoz3vNs/Xyyt4FTAjXHFHQBuvkI+11i/pmltXW1N9cjYxMDw2PgvVv6yStO0qaGutalhTW312MTU8OjE6PhkqexqOsTmijsA3Hxz88X+odH+odFsJtPcWL+pvbWQz/UPjl4ZGi2WlvFqd3Uh39ba2NLYMD451T84Mnpu0mZ1+NhwxR0AboXqQr6ttamlsX54dOLylaHZufmbe/76NTUb2pprqgp9gyMDQ6N2q8PHj3AHgFsnk0nbmhvb1zWNTUxd7B24Kfew1q+p2dTems1mLvUNDo9OfPQTAquTrTIAcOuUy5XegeG+wZG2lsa9O7cOjoxd6hss3ejV8epCfsvGtqp8/kLvlZGxyZs7KrDaCHcAuNUqlUrfwPCVodGOtuZ9t22/2DtwZWh0SWfIZDKb1rc0N9Zf7B0YGB5bpjmBVcVWGQBYSVWF/LaNbdls9kzP5UVufF9bX7t9U/vQ6PjF3sGyZ8XAJ0Z207a/t9IzAMAnV6lUHhweL1XKO7d2VCrJ5NTMAl+cyWS2bWxb19x4uufdgeGxig84hU8SW2UAYKWlydDI+NjEVNfm9sb62jM9vdd9ZGRtddWObR3Do+NHT54T7PAJlFnpAQCAJEmSYrH09juXRsen9u7auqa2+pqj65rX7tq+8dzFvguXB1Q7fDK54g4Aq0jvwPDk9MzOrR3v3XWaJsnWjevX1FYdP91zUx4fCQTlijsArC7jk9PHT/e0r2va1N6ayWR2bd+UzWaOn76g2uETTrgDwKozN188fvpCXW3Nge7OyemZMz2X3YcKCHcAWI2ymbSQz87OzVdX5Vd6FmBVEO4AsOrkctnurs29V4aPnTpfLld2bO1IV3okYMWl/+yfD6z0DACw6lV+4U+5UimXy+VyZTl2sKRpWlXIF0ulYvGnD4WsKuQrSWVubln2uGcyaSaTSZM0k0nT934/SP2mAKtO+vIrr6/0DAAQQCaTZjOZbDaTz2Wz2Wwul81mMpVKMl8szszODo9ODo9NfPTPMc2k6Y5tHSNjk/2DI+9/vWvLhpnZuUt9gx/x/EmSFPK55saGtXW1VYV8LpdNkqRYKheLxau/KpTL5WKpbEc9rELpt/7Fv1vpGQAgqqaGuh1bO7Z0rGtraczlspNT06fOvfv6sTMT0wt9AOoHSZPk8w/dPTUz++wrR685lMtm/8rnDx0/3XP05PkbGbSSrGtZe8/tO7d0tFUVclMzc71Xhs5d7DvTc3l6du5GTgjccsIdAG6Ohrrafbu337Z9U01VYWxi6idvnnz7nYtL2ktzcN9t7esav/f0T657xbumuuprf/GhH77w+pKuuxfy+bv2du3bvb0qnxsemzx66vzxUz1z8/OLPwOwSgh3ALjJWhobHjiwe2tHW6lcPvLWyddPnC2VPnwLzdaNbQ/dc/v/+pNnF3he+7rmtb/yyME/eOL5ianpDz1hbU3Vp+7as2vbxnKlfPTU+SNvnnJxHULL3v+Zx1d6BgD4WJmemT157tKbb79TVcgf2LvjwJ6uYrHYPzi6wJK62uovPXrf9358eGJqoT02U9Ozs3Pzn7p7z4kzFxb4skI+99A9ez/34F0N9WteePX4nzxz5Pyl/mKpdIPvB1gdhDsALItSqXz+3f63Tp6rr6050N25d+eWy/1Dk9fb+56m6a88cvCNE2d73r3yoacdGB7b1N66rnntxd7rPReukuzu2vSVzx1a19L40ht//sSfvtL3ize5AnEJdwBYRsVS6eyF3rMX+rq2bNjf3VlTVbh4eeCaDewH9nTVVFe9+NqJRZ6z590rj9x3R++V4Wt+DaiprvpLf+H+23dtu3D5yh8++eKF3mu/ERCacAeAZTc9M/vWyXNpmuzv7tzdtfmdC73vbWRfW7/m0Qfu/KMfHV78VpZyuTw4Mv7YoTuPnup57+bXTe2tX338wZqaqh88++orb520MQY+foQ7ANwil/oGL1we2Ltj677d2y/3D49PTidJ8sXP3Hvk6Km+gaVtaBmbmGptXtva1HD1CTP7uzsfO7R/dHzqD5547srQQpvpgbiEOwDcOpNTMyfOXOjc3H5n9/bRscnWpoZ1zY0vvHr8Bk51uX/osUMHzvZcfmB/9/49nWd7ev/o6ZfnP/iJNEB0wh0AbqlisXT8TM+GtuZ9u7dv2dj2/WdfnZ6ZvZHzlMrz88XPPnjX+tbGV4+deu7IsZs+KrCqZFZ6AAD4xCmVyn/8o8MTU9NVhfy65rU3fJ6O9S11tdXHTp5/5c1TN3E8YHUS7gCwAvL5XHUhf6lv8JH7921uX3cDZzh0oLtzc/uxUz1trY03fTxgFRLuALAC9nd3njhz8btPvTw0Ov7FR+5tbKhb0vLbtm/at3v7Wyff+dGLb2Qy6cb1Lcs0J7B6CHcAuNXyudztu7a9dvxMuVz+7g9fmp8vfuWzD+Rz2UUub2lsePSBfe/2D7346okkTY68dfrefbuWdWBgNRDuAHCr7dmx+WzP5av3pM7MzX/nqZerqwqPPXBgMWuzmcyXH7tvdm7+iWeOXH2E+7mLvXW1NS2NDcs5MrDyhDsA3FJpktzZ3fn6ibPvvTI4MvbcK0c7N6/furHtQ5d/6p691VWF7z51eL740yc/VpLk9eNn9u/pXK6JgdUh1921eaVnAIDVrlQql8rlUqk8MzdfKZc/yqnWtzbNzs5X5XPrW35+U+mVodGR8ckvfPqeP376cLH4gR962li/5vadW4+f7sllM+9fPjI6ceiu7rfXt75X8zcml80WCrlMmsnnsmkm/SinAm669MTbJ1d6BgAIIJOmaZpmM2klSYrF0tx8cXZufmZ2rlKpLOk8LY0NUzMz0zNz17yezWY3rGuamJoZGZv4oLXt65rSNL3cP/TLh5oa6uaKxcmpmSUNk81kqqsKVYV8Pp/LZTOVJCmVypWlviXglsh13+Z2FgBYgvq1jXfdffDeg/c98MD9O7u29w0Mnzhz4Z2LfYvJ3UI+97f+8qP/83vPlq532f7gvl333LHz+8+9OjV9nY9k6trc3r7u7v/9xPN9gyO/fLStpfHhg3f83ydfXMxbyOeyuzs3d3dtqq4q/NnR4y+/9NJPDr90/OibszNL637gVsqt9AAAEMz46MgzTz/5zNNPJklSVVX91/7GN/7m179x6K7uw2+8fer8uwuv7dq84dzF/utWe5IkR46e3r+n66F7bv/Bc69ecyhNkofv23epd/C61Z4kSf/gSE11oaGudmxiaoEBstnM/t2dd3Z3vvHmsd/8zX/646d+mCQur0MMbk4FgBs3Ozvz+7/3n7/wuUe/9a1/sGtb+1c++0D9mpoFvn7Hto5T5y990NFyufzCkWM7t3ZUVxWuOdS5eUNNdeFPD7+5wMlPn3t3x9aOBb5g4/qWb3zpM+X5qS9/+Ut/++tf/fFTT6p2CES4A8BN8PwzT3/2kYe/893vfPXxB7d0XP+TUPO5bHtr08XewQXOc+LMhfli6Zefy/6pu/dc6h0cXfBq+pkLvZ2b269/rJLctbfrkfv2/eN/8ht/5+u/eu7smYXeDLAqCXcAuFkqv/2v/+Xf//Vff/jgHbdt3/TLhze2t17qHywv+FCacqXy2vHTe3dsSdOfP9SlsX5NQ13tc0eOLfzt+weG19bXFvLX7oNNk+TTB/duaF37hcc/98Pv/79Fvx1gdRHuAHAzHX7x+b/+ta8d3Lezc9O1F7+3bFh3/mL/h57hjeNns9nM9o3r33vlvjtvm5iaHhwZW3hhJUku9Q5uam+95vVDd3VX5zNf/uLjV/r7FvcmgNVIuAPATXbq7RPf/LVfe/i+O5rX1r//9U3trZf6Bj50+Xyx2DcwfGBv13uvdG7Z8MaJRW1uudg7sHF9y/tf2d25qb218Vf/6lempxbaZgOsfsIdAG6+P3vtyL/5rd/+/IMHMj/b8ZLP5Wqqq0bGJxez/MjRMxvWNV1d29a8NpfNHDt1YTELL/UPvj/cG+pqDx3o/uY3/+7E+IdcrQdWP+EOAMviv//e757ruXjn7u1X/7u+tbFvYHiRa3su9SVJunF9a5Ikd3Z3Do9NLPIjUUdGJ+rrarOZn/58//S9e//rt3//1J8fX/r4wKoj3AFgufzGP/qHB/buuHq3aFtLY//g6CIXliuVwZGx23dtTZJkS0fb6fOXF7mwkiQDw2MtTQ1JknS0tdRWV/3Ob/2rG5odWHWEOwAsl7NnTh1+5bW9O7ckSdLa1DAwvNhwT5LknQt9G9qa0zStrak6dur84hcODo+1NNYnSXL33s7/8B//U7lUWurYwOok3AFgGf373/m3d+zaniZJc2P94Mj44heeOHuhrrZ6Y1tzuVwen5xe/MLBkfGWpob6NTXNjQ3/47/9l6WPDKxSwh0AltGbb7w2PjHZ1tLYsKZmfMGPT7rG6NhkJUm6u7aMTyyh2pMkGRmfbKxfs3Nbx7PPv1Rc3M54IAThDgDL67nnn+/aumFuvliuVJawLE2mp2c3trd86OPbrzE2PtlQV7t94/rv/OH/WdqgwOom3AFgeT355A+2bGibmJpZ6sKxiak1NVV9AyNLWjUxNbOmtrqpsf65Z55e6ncEVjPhDgDL6/ALzzU11E1NLzncRyemstnslaGlhXulUsmk6eW+K8X5+aV+R2A1E+4AsLxmZ2emZ2eKpfJSF46MTqRp2jewhGfRXFUslS5f7lvqKmCVE+4AsOympmd/9gmqSzA2OZUkyczc3JJXVpKh4aElrwJWN+EOAMtufn4+ky75Z+7cDe91SdPJySU8wQYIQbgDwLIrlUqZzA38zF36Vfqry9JkdmbJW+qBVU64A8CyK5fLSbKUZ0H+bNWSHiD5c5WkUr6xlcDqJdwBYPndwA73j7QuqaTCHT5uhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABJBb6QEA4ONvanqmkmaXumpyaubGvt3s/PzY+PiNrQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWA3+P0qmylC/4HSmAAAAAElFTkSuQmCC'></img>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]})</unsafe-script>"}}},"children":[{"props":{"id":"out","setInnerHtml":"<div class='display:none'></div><unsafe-script style='display:none'>\nWebIO.mount(this.previousSibling,{"props":{"attributes":{"style":"display:flex; justify-content:center; align-items:center;"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"setInnerHtml":"<img src='data:image/png;base64,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OwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABCDcAQAgAOEOAAABCHcAAAhAuAMAQADCHQAAAhDuAAAQgHAHAIAAhDsAAAQg3AEAIADhDgAAAQh3AAAIQLgDAEAAwh0AAAIQ7gAAEIBwBwCAAIQ7AAAEINwBACAA4Q4AAAEIdwAACEC4AwBAAMIdAAACEO4AABCAcAcAgACEOwAABJBb6QEA4ONvanqmkmaXumpyaubGvt3s/PzY+PiNrQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWA3+P0qmylC/4HSmAAAAAElFTkSuQmCC'></img>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]})</unsafe-script>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]}]})
In [8]:
scene = Scene()
vs0 = VehicleState(B + polar(50.0,-π), roadway, 8.0) # initial state of the vehicle
push!(scene, Vehicle(vs0, VehicleDef(), 1)) # add vehicle with the default type
render(scene, roadway, cam=cam)
Out[8]:
We will use lateral and longitudinal acceleration to control a car in the intersection. The first step is to define a corresponding action type that will contain the acceleration inputs.
In [9]:
struct LaneSpecificAccelLatLon
a_lat::Float64
a_lon::Float64
end
Next, add a method to the propagate function to update the state using our new action type.
Note: There is an existing propagate method to update the state using lateral and longitudinal acceleration. (it is used in line 3)
In [10]:
function AutomotiveDrivingModels.propagate(veh::Vehicle, action::LaneSpecificAccelLatLon, roadway::Roadway, Δt::Float64)
lane_tag_orig = veh.state.posF.roadind.tag
state = propagate(veh, LatLonAccel(action.a_lat, action.a_lon), roadway, Δt)
roadproj = proj(state.posG, roadway[lane_tag_orig], roadway, move_along_curves=false)
retval = VehicleState(Frenet(roadproj, roadway), roadway, state.v)
return retval
end
Driver Model:
We define a driver model, which can be seen as a distribution over actions. Here we will define the simplest model, which is to repeat the same action.
In [11]:
struct InterDriver <: DriverModel{LaneSpecificAccelLatLon}
a::LaneSpecificAccelLatLon
end
AutomotiveDrivingModels.get_name(model::InterDriver) = "InterDriver"
Base.rand(model::InterDriver) = model.a
Simulate:
First associate a model to each driver in the scene using a dictionnary. Here we only have one driver identified by its ID: 1. Then everything is ready to run the simulate! function.
In [12]:
timestep = 0.1
models = Dict{Int, DriverModel}()
# constant speed model
models[1] = InterDriver(LaneSpecificAccelLatLon(0.0,0.0))
nticks = 100
rec = SceneRecord(nticks+1, timestep)
simulate!(rec, scene, roadway, models, nticks)
# interactive visualization
@manipulate for frame_index in 1 : nframes(rec)
render(rec[frame_index-nframes(rec)], roadway, cam=cam)
end
Out[12]:
WebIO.mount(this.previousSibling,{"props":{},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"className":"field"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{},"nodeType":"Scope","type":"node","instanceArgs":{"imports":{"data":[{"name":"knockout","type":"js","url":"/assetserver/7727d7cb3453b9ff588804f2f297360e756850e6-knockout.js"},{"name":"knockout_punches","type":"js","url":"/assetserver/dc191505b241da77a1bd06986b7132036babe315-knockout_punches.js"},{"name":null,"type":"js","url":"/assetserver/cf39e83f3445855334efae1f7d0ee012952fe319-all.js"},{"name":null,"type":"css","url":"/assetserver/495af69608d773e6cf6efd8fe98ee33ddbad0df5-style.css"},{"name":null,"type":"css","url":"/assetserver/9d22e7e1c4dccb3a3bef6ae4d24134fd256d4bfd-main.css"}],"type":"async_block"},"id":"knockout-component-857e5cef-49f0-43e3-bd35-33cce8254572","handlers":{"_promises":{"importsLoaded":[function (ko, koPunches) {
ko.punches.enableAll();
ko.bindingHandlers.numericValue = {
init : function(element, valueAccessor, allBindings, data, context) {
var stringified = ko.observable(ko.unwrap(valueAccessor()));
stringified.subscribe(function(value) {
var val = parseFloat(value);
if (!isNaN(val)) {
valueAccessor()(val);
}
})
valueAccessor().subscribe(function(value) {
var str = JSON.stringify(value);
if ((str == "0") && (["-0", "-0."].indexOf(stringified()) >= 0))
return;
if (["null", ""].indexOf(str) >= 0)
return;
stringified(str);
})
ko.applyBindingsToNode(element, { value: stringified, valueUpdate: allBindings.get('valueUpdate')}, context);
}
};
var json_data = JSON.parse("{\"changes\":0,\"value\":51}");
var self = this;
function AppViewModel() {
for (var key in json_data) {
var el = json_data[key];
this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);
}
[this["changes"].subscribe((function (val){!(this.valueFromJulia["changes"]) ? (WebIO.setval({"name":"changes","scope":"knockout-component-857e5cef-49f0-43e3-bd35-33cce8254572","id":"ob_07","type":"observable"},val)) : undefined; return this.valueFromJulia["changes"]=false}),self),this["value"].subscribe((function (val){!(this.valueFromJulia["value"]) ? (WebIO.setval({"name":"value","scope":"knockout-component-857e5cef-49f0-43e3-bd35-33cce8254572","id":"ob_06","type":"observable"},val)) : undefined; return this.valueFromJulia["value"]=false}),self)]
}
self.model = new AppViewModel();
self.valueFromJulia = {};
for (var key in json_data) {
self.valueFromJulia[key] = false;
}
ko.applyBindings(self.model, self.dom);
}
]},"changes":[(function (val){return (val!=this.model["changes"]()) ? (this.valueFromJulia["changes"]=true, this.model["changes"](val)) : undefined})],"value":[(function (val){return (val!=this.model["value"]()) ? (this.valueFromJulia["value"]=true, this.model["value"](val)) : undefined})]},"systemjs_options":null,"observables":{"changes":{"sync":false,"id":"ob_07","value":0},"value":{"sync":true,"id":"ob_06","value":51}}},"children":[{"props":{"attributes":{"style":"display:flex; justify-content:center; align-items:center;"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"attributes":{"style":"text-align:right;width:18%"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"className":"interact ","style":{"padding":"5px 10px 0px 10px"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"label"},"children":["frame_index"]}]},{"props":{"attributes":{"style":"flex-grow:1; margin: 0 2%"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"max":101,"min":1,"attributes":{"type":"range","data-bind":"numericValue: value, valueUpdate: 'input', event: {change : function () {this.changes(this.changes()+1)}}","orient":"horizontal"},"step":1,"className":"slider slider is-fullwidth","style":{}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"input"},"children":[]}]},{"props":{"attributes":{"style":"width:18%"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"attributes":{"data-bind":"text: value"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"p"},"children":[]}]}]}]}]},{"props":{},"nodeType":"Scope","type":"node","instanceArgs":{"imports":{"data":[],"type":"async_block"},"id":"scope-dfd24683-dde0-47fe-867b-50906a1d9e6c","handlers":{"obs-output":[function (updated_htmlstr) {
var el = this.dom.querySelector("#out");
WebIO.propUtils.setInnerHtml(el, updated_htmlstr);
}]},"systemjs_options":null,"observables":{"obs-output":{"sync":false,"id":"ob_10","value":"<div class='display:none'></div><unsafe-script style='display:none'>\nWebIO.mount(this.previousSibling,{"props":{"attributes":{"style":"display:flex; justify-content:center; align-items:center;"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"setInnerHtml":"<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAJYCAIAAAB+fFtyAAAABmJLR0QA/wD/AP+gvaeTAAAbAklEQVR4nO3daXBd12HY8XPfe1iJjQR3cN9EcBM3kSK1S5Ytb3Js13ZiN+3EmU4+dDrjNjNN3XxJv9TTdtw47Uyn6TRN6sYex60dyZtkraZIi6JESRTFRVzAHSQAAgSI9QF4Sz/IVmSaAgEKEHCo329GH/TeO/eexw96f16de24IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyXJJVKTfYcAACAG0hOnTo92XMAgBgkIRTD2/+EEArFYgihUCiGYigUi8VQ/PU7MUhCKpUkIQkhpFJJCCFJkiRJQgihWEySpBjRd4EPi2Lmv3z78cmeBABEI5VKlZZkKspLy8vKaqsqq6sq6qqnzaitrq2Z1t3T19redely54WW9t7+gcme6W9IQphRV90wd+a8WTPm1NeVlGQ6r/Z0Xu3t6unr6Rvo688OZAezg0ODw7miZoepKjPZEwCAmBQKhezgUHZwKITeS20d77yehFBbUzV35vT5c2bcsWFlkiRnm9tOn28539I+iSlcWpJZ3DB72cJ5C+bWd/cOXGzrOH66eff+Q/0Dg5M1JeCmJV/7s29N9hwA4FZTVVmxpGH2skVzZ82oPX2h9a2m85farnxg/Z5OpZYunLt62YI5M+vOX2o/db7l3MXLQ8PDH9T5gQkh3AFgApWWlKxYPK9x+cKqyvI3j589cvJcdnBo4k5XVz1t/W1LVi1taG7teKvpwrmLbQVLX+BWIdwB4INQVz1t/W1LVy1taDp36fXDJ6/29o/v8efPrt+ybsWM2qqDx84cPXkuO+T6OtxqhDsAfHBKMum1KxdvXLP8wqXL+9441tM3Dvewzp89486Nq0tLS145ePzU+RZ3l8Ktys2pAPDBGc7lDxw99eaxM+tWLfnCx+85cab55YPHB2/26nhd9bR77lhXPa3ixdePnrnQOr5TBaaa9J33PzLZcwCAD5disdja3nno+Nk5M6c/tGPj4NBw+5WrYzpCSSazc1Pjzi1rDr516hf7DnZ1903QVIGpQ7gDwOQoFAoXWtqbzl3avHb5+tuWNrd2jPLS+6L5sz7z0J1Xunuf2LW/raNroucJTBHCHQAm0+DQ8LFTzcP53CP3bi0Uim3tnSN8uCSTuX/7+jUrFj25+9W3ms4XCoUPbJ7ApLPGHQAmWxJOnLl4oaXj4bs2Lm6Y9fSe1weut2XkzOk1H79va9O5S9/7yS6bPMKHkCvuADAl5HL546ebK8rLHtq5seVyZ19/9t3vrlmx6MEdtz/30sHDJ85qdvhwEu4AMIW0tHde7uh65N6t2cGh9s7uEEIqSe7bvmHpwjmPP7P37VeADyfhDgBTS0/fwMmzF+/dtr6qsqK1veuTD2wrFos/ff6Vm941Erg1pCZ7AgDAtXr7sz948pfzZs34g89/5PKVq0/veS3vPlT40BPuADAVlWTS0yrLunsHaqsrQ5JM9nSAySfcAWDKqSgv+9zHdh44cur7P3shny88cu+WlHaHD73kZFPTZM8BAKa8YiiGYgihWCwWiyFfKOTz+VyuUJyAbRmTJKmeVjE4NPzOovZpleXFYrF/YHDczxVCSKdTmXQ6lSSpdCqVJCH51Rwm4lzA+5Fpv+L+dAC4sVQqSadS6XSqJJNOp9Ol5WXpVKpYDMO5XHZwsPNqX2d37/t/IlIqSVYsmX/p8pVrHom6fNG8oeHh5taO93n8EEJpSWZGXU1tVWVZaUkmkw4h5PKFXC43NDycy+ULhUIub5t4mIqSr/3ZtyZ7DgAQq+k1VSsWz180f9bs+rpMJt3XP3DizMXXDzf1DmRvPPi3JCF87J4t/dnBF145dM1bmXT6cx/beeTkuUPHz97MRIthVn3t1nUrF82fXVaa6c8OtVy+cuZCa9O5S9d92BMwBQl3AMZTRba48GKucuBmLtgOZ5KLc9OdtbHef1VTVblh9dLbli6oKCvt7u1/+eDxY6cvjGktzbYNt82dVfeT516+7hXvivKyL33inqd/+fqYrruXlpRsXrt8w+qlZSWZzu6+QyfOHjlxbmjYzpIQH+EOwLi596Xsp57JluTe1zKLV24v/cEnKgfLIl5jXV9Xs2PT6sXzZ+cLhf1vHn/96Kl8/sZLaBY3zL5n67rv/+yFoeHce31m1ozaTz2w7f8+sae3f+CGB6ysKLtr85pVSxoKxcKhE2f3Hzzh4jpEzQOYABgfmw4N/e6P+lPF8P6KO2lozdf2FN5sLB2neU2Cgezg8TPNB4+dList2bR2xaY1y3O5XFvH1RGGVFWWf/rB7T95fl9v/0hrbPoHBgeHhu/asuZo0/kRPlZakrln69qP3r25pnraL1898rNd+882t+Xy+Zv8PsDUINwBGB+//8P+6t7ijav9c43hVFcY8Qp0Q2v+pc1lUV90DyHk84WzF9vePH6murJiU+OytSsXXWq70ne9te9JknzqgW0Hjp46d/HyDQ/b3tm9YO7MWTNqL7S0X+ftYli9fMFnP7pzVn3d3gNvPfGLV1p/8yZXIF7CHYBxkM4XP/tkfzKaNTKP/V74VztCIYQ3WkLuPfP95NKSy/XpcZzhZMnl86fOt5w637p80byNjcsqykovXGq/5s9p05rlFeVlL752dJTHPHfx8gPb17dc7rzmrwEV5WWf+cid61YtOX/p8t8/9eL5lmtPBEQtM9kTAOBWkM6H1DURvrA2/PM7rvPRmZVhRkX41iPhj3eEb+wJf/VaGLrOEo7SoVuqOTu6ur/zo+fvWL9yy7oVSxbMeezpvT19v1qkXls9bdOa5d/98S9Gf7ThXO7ZvW88fPem7/541zsbUC6YO/OT999RDOGJXfvPNLeO+1cAJp1wB2BizK8Of3L3SB9YWBv+2yfD1+8O39wb/nJ/yL7nHZm3hmKx+PLB42cvXn70we1f/vT9P37u5YttHSGEh3bcvufVw9kx3jZ6oaX9YtuVretWvHzweAhhY+OyHZsau7r7Hn927wQ9pwmYdLFuuQXALWJOVWicGeorJ3seH5DW9s6//dHzPX0Dn/nI9pWL569a0lAshuOnm2/iUC++emTdqiW1VZX3b9tw58bVTWcvfe+nu1Q73MJccQdgYlzNhmdOXef1nQtDZUkIIQzlw1+/Hr6xJ5z9cN09OZAd/LufvfCpB7Y9tHNjvlD44c9fvLnjZIeGX37j2Ocfubu0JPPq4ROvHDwxvvMEphrhDsA4KKRCMfzmRpBvtYeHv32djx77F2FpXfjeofDvdoWmK+91wNytcGPqe8rnCz9+dt+XH72/rqZq1ozajq7umzvO/Dn1VZXlrx9uUu3wYSDcARgHuUzSXp+a1VEM4UY3lf7vA+E7b97wKnvL7Fu63EMoKcmUl5Y0t3Y8cOeGvv7s+ZYbbwR5jZ2bGpctnHv4xLnZM+smYobAVGONOwDj46XNZTeu9hDCv999w2o/ubSkfcYt/gu1sXHZ0aYLjz/z0pWrPZ984I66mqoxDb9t6YINq5e+efz0sy8eSKWShjn1EzRPYOq4xf+zCMAH5hc7yl7aXPb+j3N+fvo7v1NZTOJ++tLISjKZdauWvHakqVAoPP703uHh3Gcf3lGSGe3/ZKivq3lwx4aLbVdefPVoSML+N0/esWHVhE4YmAoslQFgfBRSyd89Wrl3S+nSc7nqvpvZhX2oJDTPyxxdUVK41S8rrVmx8NS5SwPZwRBCdmj4sWde+uIn7nlox6Ynd++/4dh0KvXoQ9sHh4af2LX/7T/lMxda7tqypr6u5qbXygNREO4AjKdzDZlzDX5cRpKEcHvjsh89u++dVzq6une/cujeO9Ytbph9trlt5OF3bV1bXlb6/Z/tHs79auf7YgivH2nauGbZsy8emMB5A5Mt07h84WTPAQCmuny+kC8U8vlCdmi4WCjceMB7mzNz+uDgcFlJZk79P9xUevnK1a6evo/fu/XHz+3L5a7zKNm31VVPW7dy8ZGT5zLp1LuHd13t3bm58dicme/U/M3JpNOlpZlUkirJpJPUrbxaCWKUHD12fLLnAAARSCVJkiTpVFIMIZfLDw3nBoeGs4NDxeLY1gXV19X0Z7MD2WsflZpOp+fNmt7bn+3q7n2vsXNnTU+S5FLbdbbRnF5TNZTL9fVnxzSZdCpVXlZaVlpSUpLJpFPFEPL5QnGsXwn4QGQab3M7CwCMQXVt3eYt2+7Ytn3HjjtXLl/a2t55tOn86Quto8nd0pLM7//Og9/7yQv5612237Zh1db1K5/c/ep1H4C6fOHcubO2/L8n9rR2XGdbntn1dfdtW//Dp0b1OKeSTHr1soWNyxeUl5W+cejIS3v3vrxv75FDBwezY+t+4INkGSIAjE3P1a5dzz2167mnQghlZeX/6Pe+8o+//JWdmxv3HTh24uzFkccuXzjvzIW261Z7CGH/oZMb1yy/Z+u6n+9+9Zq3khDu276huaXjutUeQmjr6KooL62pquzu7R9hAul0auPqZbc3Ljtw8PCf/um/ff6Zp0e1iScwBdzq9+0DwEQaHMx+52/+6uMfffBrX/uXq5bM/ezDO6qnVYzw+RVL5p842/xe7xYKhV/uP7xy8fzystJr3lq2cF5Feekv9h0c4eAnz1xcsXj+CB9omFP/lU/fXxjuf/TRT/+TL3/h+WeeUu0QEeEOAONgz67nHn7gvscef+wLj9y9aP6s636mJJOeO3P6hZaOEY5ztOn8cC7/2/uy37VlTXNLx9URr6Y3nW9ZtnDu9d8rhs1rlz+wfcOf/Juv/9Mvf/HMqaaRvgwwJQl3ABgvxT//j9/4Z3/0R/dtW3/b0gW//XbD3JnNbR2FETelKRSLrx05uXbFouRdj6Cqq55WU1W5e//hkU/f1t5ZW11ZWnLtOtgkhHu3rZ03s/bjj3z06Sd/OuqvA0wtwh0AxtO+F/f87pe+tG3DymULrr34vWjerLMXbrBNewjhwJFT6XRqacOcd17Zfvttvf0DN3y+UjGE5paOBXNnXvP6zs2N5SWpRz/5yOW21tF9CWAqEu4AMM5OHDv61T/8w/u2r59RW/3u1xfMndnc2n7D4cO5XGt756a1y995ZdmieQeOjmpxy4WW9oY59e9+ZfWyBXNn1n3x858d6B9pmQ0w9Ql3ABh/b7y2/z99888/dvem1K9XvJRkMhXlZV09faMZvv9Q07xZ098eO3tGbSadOnzi/GgGNrd1vDvca6oqd25q/OpX/6C35wZX64GpT7gDwIT427/5n2fOXbh99dK3/3XOzLrW9s5Rjj3X3BpC0jBnZgjh9sZlnd29o3wkatfV3uqqynTqV7/v996x9q//z3dOvHVk7NMHphzhDgAT5ev/+o83rV3x9t2is+vr2jqujnJgoVjs6Opet2pxCGHR/Nknz14a5cBiCO2d3fXTa0II82fXV5aX/cU3/8NNzR2YcoQ7AEyUU00n9r3y2tqVi0IIM6fXtHeONtxDCKfPt86bPSNJksqKssMnzo5+YEdnd31ddQhhy9pl//0v/0chnx/rtIGpSbgDwAT6r3/xn9evWpqEMKOuuqOrZ/QDj546X1VZ3jB7RqFQ6OkbGP3Ajq6e+uk11dMqZtTVfPfb/2vsUwamKOEOABPo4IHXenr7ZtfX1Uyr6Bnx8UnXuNrdVwyhcfmint4xVHsIoaunr6562sol81/Yszc3upXxQBSEOwBMrN179ixfPG9oOFcoFscwLAkDA4MNc+tvuH37Nbp7+mqqKpc2zHns738wtokCU5twB4CJ9dRTP180b3Zvf3asA7t7+6dVlLW2d41pVG9/dlpl+fS66t27nhvrGYGpTLgDwMTa98vd02uq+gfGHO5Xe/vT6fTlK2ML92KxmEqSS62Xc8PDYz0jMJUJdwCYWIOD2YHBbC5fGOvArqu9SZK0to9hL5q35fL5S5daxzoKmOKEOwBMuP6BwV8/QXUMuvv6QwjZoaExjyyGK51XxjwKmNqEOwBMuOHh4VQy5t/coZte65IkfX1j2MEGiIJwB4AJl8/nU6mb+M0d+1X6t4clYTA75iX1wBQn3AFgwhUKhRDGshfkr0eNaQPJf1AMxcLNjQSmLuEOABPvJla4v69xoZgId7jVCHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIQGayJwAAt77+gWwxSY91VF9/9uZONzg83N3Tc3NjAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmgv8PjlqBDlqZA74AAAAASUVORK5CYII='></img>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]})</unsafe-script>"}}},"children":[{"props":{"id":"out","setInnerHtml":"<div class='display:none'></div><unsafe-script style='display:none'>\nWebIO.mount(this.previousSibling,{"props":{"attributes":{"style":"display:flex; justify-content:center; align-items:center;"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"setInnerHtml":"<img src='data:image/png;base64,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CAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIgHAHAIAICHcAAIiAcAcAgAgIdwAAiIBwBwCACAh3AACIQGayJwAAt77+gWwxSY91VF9/9uZONzg83N3Tc3NjAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmgv8PjlqBDlqZA74AAAAASUVORK5CYII='></img>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]})</unsafe-script>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]}]})
In [ ]:
Content source: tawheeler/AutomotiveDrivingModels.jl
Similar notebooks: