Driving on a Mobius Strip

AutomotiveDrivingModels is templated to efficiently run different types of simulations. Entities are parameterized by their:

  • S state, which changes over time
  • D defintion, which does not change over time
  • I id, typically an Int, which uniquely identifies that entity.

In addition to these types, the actions, environment and the driver models can also be parameterized.

This notebook demonstrates a longitudinal driving simulation where cars drive on a single straight lane that loops back on itself. The types are:

  • S - State1D, containing the position and speed
  • D - VehicleDef, containing length, width, and class
  • I - Int

We use a StraightRoadway as our environment and LaneFollowingDrivers that produce LaneFollowingAccels.


In [1]:
using AutomotiveDrivingModels
using AutoViz


┌ Info: Recompiling stale cache file C:\Users\Maxime\.julia\compiled\v1.1\AutomotiveDrivingModels\ZEfHM.ji for AutomotiveDrivingModels [99497e54-f3d6-53d3-a3a9-fa9315a7f1ba]
└ @ Base loading.jl:1184
┌ Warning: The call to compilecache failed to create a usable precompiled cache file for AutomotiveDrivingModels [99497e54-f3d6-53d3-a3a9-fa9315a7f1ba]
│   exception = ErrorException("Required dependency Distributions [31c24e10-a181-5473-b8eb-7969acd0382f] failed to load from a cache file.")
└ @ Base loading.jl:969
┌ Info: Recompiling stale cache file C:\Users\Maxime\.julia\compiled\v1.1\AutoViz\w0rHu.ji for AutoViz [82aa6e0c-a491-5edf-8d4b-c16b98e4ea17]
└ @ Base loading.jl:1184
┌ Warning: Module AutomotiveDrivingModels with build ID 614701268831930 is missing from the cache.
│ This may mean AutomotiveDrivingModels [99497e54-f3d6-53d3-a3a9-fa9315a7f1ba] does not support precompilation but is imported by a module that does.
└ @ Base loading.jl:947
┌ Info: Recompiling stale cache file C:\Users\Maxime\.julia\compiled\v1.1\Cairo\l6vnT.ji for Cairo [159f3aea-2a34-519c-b102-8c37f9878175]
└ @ Base loading.jl:1184

In [2]:
road_length = 200.0 # [meters]
roadway = StraightRoadway(road_length)

scene = Scene1D()
push!(scene, Entity(State1D(10.0,  8.0), VehicleDef(), 1))
push!(scene, Entity(State1D(50.0, 12.5), VehicleDef(), 2))
push!(scene, Entity(State1D(150.0, 6.0), VehicleDef(), 3))

cam = StaticCamera(VecE2(100.0,0.0), 4.75)
render(scene, roadway, cam=cam, canvas_height=100)


Out[2]:

We can add an overlay that displays the car id for convenience:


In [3]:
overlays = [TextOverlay(text=["$(veh.id)"], incameraframe=true, pos=VecE2(veh.state.s-0.7, 3)) for veh in scene]
render(scene, roadway, overlays, cam=cam, canvas_height=100)


Out[3]:

Or we can create a new SceneOverlay which does this for us:


In [4]:
using Parameters
@with_kw struct CarIDOverlay <: SceneOverlay
    textparams::TextParams=TextParams()
end
function AutoViz.render!(rendermodel::RenderModel, overlay::CarIDOverlay, scene::Scene1D, roadway::StraightRoadway)
    for veh in scene
        x = veh.state.s - 0.7
        y = 3.0
        text = string(veh.id)
        add_instruction!(rendermodel, render_text, (text, x, y, overlay.textparams.size, overlay.textparams.color), incameraframe=true)
    end
    return rendermodel
end

render(scene, roadway, [CarIDOverlay()], cam=cam, canvas_height=100)


Out[4]:

To run a simulation we need driving models that produce actions. For this we will use LaneFollowingDrivers that produce LaneFollowingAccels. We will give each car a different model, as a demonstration.


In [5]:
models = Dict{Int, LaneFollowingDriver}()
models[1] = StaticLaneFollowingDriver(0.0) # always produce zero acceleration
models[2] = IntelligentDriverModel(v_des=12.0) # default IDM with a desired speed of 12 m/s
models[3] = PrincetonDriver(v_des = 10.0) # default Princeton driver with a desired speed of 10m/s

nticks = 100
timestep = 0.1
rec = QueueRecord(Vehicle1D, nticks+1, timestep)
simulate!(LaneFollowingAccel, rec, scene, roadway, models, nticks)
render(rec[0], roadway, [CarIDOverlay()], cam=cam, canvas_height=100)


Out[5]:

We can use Interact to inspect the simulation.


In [6]:
using Interact
@manipulate for frame_index in 1 : nframes(rec)
    render(rec[frame_index-nframes(rec)], roadway, [CarIDOverlay()], cam=cam, canvas_height=100)
end


┌ Info: Recompiling stale cache file C:\Users\Maxime\.julia\compiled\v1.1\Interact\XmYW4.ji for Interact [c601a237-2ae4-5e1e-952c-7a85b0c7eef1]
└ @ Base loading.jl:1184
┌ Warning: The call to compilecache failed to create a usable precompiled cache file for CSSUtil [70588ee8-6100-5070-97c1-3cb50ed05fe8]
│   exception = Required dependency WebIO [0f1e0344-ec1d-5b48-a673-e5cf874b6c29] failed to load from a cache file.
└ @ Base loading.jl:969
┌ Warning: Module WebIO with build ID 614782226586775 is missing from the cache.
│ This may mean WebIO [0f1e0344-ec1d-5b48-a673-e5cf874b6c29] does not support precompilation but is imported by a module that does.
└ @ Base loading.jl:947
┌ Warning: Module WebIO with build ID 614782226586775 is missing from the cache.
│ This may mean WebIO [0f1e0344-ec1d-5b48-a673-e5cf874b6c29] does not support precompilation but is imported by a module that does.
└ @ Base loading.jl:947
┌ Warning: The call to compilecache failed to create a usable precompiled cache file for InteractBase [d3863d7c-f0c8-5437-a7b4-3ae773c01009]
│   exception = Required dependency WebIO [0f1e0344-ec1d-5b48-a673-e5cf874b6c29] failed to load from a cache file.
└ @ Base loading.jl:969
Out[6]:
WebIO.mount(this.previousSibling,{"props":{},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"className":"field interact-widget"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{},"nodeType":"Scope","type":"node","instanceArgs":{"imports":{"data":[{"name":"knockout","type":"js","url":"/assetserver/3eba94e42381e338b63445bb6165a6b74dfff7fe-knockout.js"},{"name":"knockout_punches","type":"js","url":"/assetserver/0b60b3bed0558f340d8f36b2e588fc19a5331e53-knockout_punches.js"},{"name":null,"type":"js","url":"/assetserver/e375b04ed295e371b269e6282dd0ece1d8f25f7c-all.js"},{"name":null,"type":"css","url":"/assetserver/74ab3fe28fdc96d2cdde1dc9103cd558bf15dd78-style.css"},{"name":null,"type":"css","url":"/assetserver/2b9bd1a7f1fd27241339301563046b45b31a5a73-bulma_confined.min.css"}],"type":"async_block"},"id":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","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 = {"formatted_vals":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101"],"changes":WebIO.getval({"name":"changes","scope":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","id":"ob_02","type":"observable"}),"indexString":WebIO.getval({"name":"indexString","scope":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","id":"ob_03","type":"observable"}),"index":WebIO.getval({"name":"index","scope":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","id":"ob_01","type":"observable"})}; 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["formatted_val"]=ko.computed( function(){ return this.formatted_vals()[parseInt(this.index())-1]; } ,this)] [this["changes"].subscribe((function (val){!(this.valueFromJulia["changes"]) ? (WebIO.setval({"name":"changes","scope":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","id":"ob_02","type":"observable"},val)) : undefined; return this.valueFromJulia["changes"]=false}),self),this["indexString"].subscribe((function (val){!(this.valueFromJulia["indexString"]) ? (WebIO.setval({"name":"indexString","scope":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","id":"ob_03","type":"observable"},val)) : undefined; return this.valueFromJulia["indexString"]=false}),self),this["index"].subscribe((function (val){!(this.valueFromJulia["index"]) ? (WebIO.setval({"name":"index","scope":"knockout-component-3a4089d5-9c0b-4915-ad77-f71390a7746e","id":"ob_01","type":"observable"},val)) : undefined; return this.valueFromJulia["index"]=false}),self)] var obs = this.index; var obsString = this.indexString; obsString.subscribe(function(value) { var val = parseFloat(value); if (!isNaN(val)) { obs(val); } }) obs.subscribe(function(value) { var str = JSON.stringify(value); if ((str == "0") && (["-0", "-0."].indexOf(obsString()) >= 0)) return; if (["null", ""].indexOf(str) >= 0) return; obsString(str); }) } 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})],"indexString":[(function (val){return (val!=this.model["indexString"]()) ? (this.valueFromJulia["indexString"]=true, this.model["indexString"](val)) : undefined})],"index":[(function (val){return (val!=this.model["index"]()) ? (this.valueFromJulia["index"]=true, this.model["index"](val)) : undefined})]},"systemjs_options":null,"observables":{"changes":{"sync":false,"id":"ob_02","value":0},"indexString":{"sync":false,"id":"ob_03","value":"51"},"index":{"sync":true,"id":"ob_01","value":51}}},"children":[{"props":{"className":"interact-flex-row interact-widget"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"className":"interact-flex-row-left"},"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":{"className":"interact-flex-row-center"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"max":101,"min":1,"attributes":{"type":"range","data-bind":"value: indexString, 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":{"className":"interact-flex-row-right"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[{"props":{"attributes":{"data-bind":"text: formatted_val"}},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"p"},"children":[]}]}]}]}]},{"props":{},"nodeType":"Scope","type":"node","instanceArgs":{"imports":{"data":[],"type":"async_block"},"id":"scope-2485f7e2-9882-4c10-a16c-b044de8d4a90","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_07","value":"<div class='display:none'></div><unsafe-script style='display:none'>\nWebIO.mount(this.previousSibling,{&quot;props&quot;:{&quot;className&quot;:&quot;interact-flex-row interact-widget&quot;},&quot;nodeType&quot;:&quot;DOM&quot;,&quot;type&quot;:&quot;node&quot;,&quot;instanceArgs&quot;:{&quot;namespace&quot;:&quot;html&quot;,&quot;tag&quot;:&quot;div&quot;},&quot;children&quot;:[{&quot;props&quot;:{&quot;setInnerHtml&quot;:&quot;&lt;img src=&#39;data:image/png;base64,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&#39;&gt;&lt;/img&gt;&quot;},&quot;nodeType&quot;:&quot;DOM&quot;,&quot;type&quot;:&quot;node&quot;,&quot;instanceArgs&quot;:{&quot;namespace&quot;:&quot;html&quot;,&quot;tag&quot;:&quot;div&quot;},&quot;children&quot;:[]}]})</unsafe-script>"}}},"children":[{"props":{"id":"out","setInnerHtml":"<div class='display:none'></div><unsafe-script style='display:none'>\nWebIO.mount(this.previousSibling,{&quot;props&quot;:{&quot;className&quot;:&quot;interact-flex-row interact-widget&quot;},&quot;nodeType&quot;:&quot;DOM&quot;,&quot;type&quot;:&quot;node&quot;,&quot;instanceArgs&quot;:{&quot;namespace&quot;:&quot;html&quot;,&quot;tag&quot;:&quot;div&quot;},&quot;children&quot;:[{&quot;props&quot;:{&quot;setInnerHtml&quot;:&quot;&lt;img src=&#39;data:image/png;base64,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&#39;&gt;&lt;/img&gt;&quot;},&quot;nodeType&quot;:&quot;DOM&quot;,&quot;type&quot;:&quot;node&quot;,&quot;instanceArgs&quot;:{&quot;namespace&quot;:&quot;html&quot;,&quot;tag&quot;:&quot;div&quot;},&quot;children&quot;:[]}]})</unsafe-script>"},"nodeType":"DOM","type":"node","instanceArgs":{"namespace":"html","tag":"div"},"children":[]}]}]})

In [ ]: