Skip to content

Commit fee7c7b

Browse files
martins-mozeikodmitry.zelenkovsky
authored andcommitted
Add default simulations
1 parent 5a87a75 commit fee7c7b

File tree

5 files changed

+186
-13
lines changed

5 files changed

+186
-13
lines changed

Assets/Scripts/Database/DatabaseManager.cs

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ static void CreateDefaultDbAssets()
194194

195195
using (var db = Open())
196196
{
197+
long? defaultMap = null;
198+
197199
if (info.DownloadEnvironments != null)
198200
{
199201
foreach (var e in info.DownloadEnvironments)
@@ -207,9 +209,20 @@ static void CreateDefaultDbAssets()
207209
Url = url,
208210
LocalPath = localPath,
209211
};
210-
db.Insert(map);
212+
213+
var id = db.Insert(map);
214+
215+
if (map.Name == "BorregasAve")
216+
{
217+
defaultMap = map.Id;
218+
}
211219
}
212220
}
221+
222+
long? autowareVehicle = null;
223+
long? noBridgeVehicle = null;
224+
long? apolloVehicle = null;
225+
213226
if (info.DownloadVehicles != null)
214227
{
215228
foreach (var v in info.DownloadVehicles)
@@ -219,22 +232,110 @@ static void CreateDefaultDbAssets()
219232
{
220233
AddVehicle(db, info, os, v, localPath, DefaultSensors.Autoware, " (Autoware)", new RosBridgeFactory().Name);
221234
AddVehicle(db, info, os, v, localPath, DefaultSensors.Apollo30, " (Apollo 3.0)", new RosApolloBridgeFactory().Name);
222-
AddVehicle(db, info, os, v, localPath, DefaultSensors.Apollo50, " (Apollo 5.0)", new CyberBridgeFactory().Name);
235+
236+
noBridgeVehicle = AddVehicle(db, info, os, v, localPath, DefaultSensors.DataCollection, " (No Bridge)");
223237
}
224238
else if (v == "Lexus2016RXHybrid")
225239
{
226-
AddVehicle(db, info, os, v, localPath, DefaultSensors.Autoware, " (Autoware)", new RosBridgeFactory().Name);
240+
autowareVehicle = AddVehicle(db, info, os, v, localPath, DefaultSensors.Autoware, " (Autoware)", new RosBridgeFactory().Name);
241+
}
242+
else if (v == "Lincoln2017MKZ")
243+
{
244+
apolloVehicle = AddVehicle(db, info, os, v, localPath, DefaultSensors.Apollo50, " (Apollo 5.0)", new CyberBridgeFactory().Name);
227245
}
228246
else
229247
{
230-
AddVehicle(db, info, os, v, localPath, DefaultSensors.Apollo50, " (Apollo 5.0)", new CyberBridgeFactory().Name);
248+
apolloVehicle = AddVehicle(db, info, os, v, localPath, DefaultSensors.Apollo50, " (Apollo 5.0)", new CyberBridgeFactory().Name);
231249
}
232250
}
233251
}
252+
253+
if (defaultMap.HasValue)
254+
{
255+
var dt = DateTime.Now.Date + new TimeSpan(12, 0, 0);
256+
var dtEvening = DateTime.Now.Date + new TimeSpan(17, 20, 0);
257+
258+
var sim1 = new SimulationModel()
259+
{
260+
Name = "BorregasAve, no bridge, data collection",
261+
Cluster = 0,
262+
Map = defaultMap.Value,
263+
ApiOnly = false,
264+
Interactive = true,
265+
TimeOfDay = dt,
266+
};
267+
AddSimulation(db, sim1, noBridgeVehicle);
268+
269+
var sim2 = new SimulationModel()
270+
{
271+
Name = "BorregasAve (with Autoware)",
272+
Cluster = 0,
273+
Map = defaultMap.Value,
274+
ApiOnly = false,
275+
Interactive = true,
276+
TimeOfDay = dt,
277+
};
278+
AddSimulation(db, sim2, autowareVehicle);
279+
280+
var sim3 = new SimulationModel()
281+
{
282+
Name = "BorregasAve, noninteractive (with Apollo 5.0)",
283+
Cluster = 0,
284+
Map = defaultMap.Value,
285+
ApiOnly = false,
286+
Seed = 12345,
287+
TimeOfDay = dt,
288+
Wetness = 0.4f,
289+
Cloudiness = 0.6f,
290+
Fog = 0.5f,
291+
UseTraffic = true,
292+
};
293+
AddSimulation(db, sim3, apolloVehicle);
294+
295+
var sim4 = new SimulationModel()
296+
{
297+
Name = "BorregasAve, evening (with Apollo 5.0)",
298+
Cluster = 0,
299+
Map = defaultMap.Value,
300+
ApiOnly = false,
301+
Interactive = true,
302+
TimeOfDay = dtEvening,
303+
UseTraffic = true,
304+
};
305+
AddSimulation(db, sim4, apolloVehicle);
306+
307+
var sim5 = new SimulationModel()
308+
{
309+
Name = "BorregasAve, API Only",
310+
Cluster = 0,
311+
Map = defaultMap.Value,
312+
ApiOnly = true,
313+
};
314+
db.Insert(sim5);
315+
}
316+
}
317+
}
318+
319+
static void AddSimulation(IDatabase db, SimulationModel sim, long? vehicle)
320+
{
321+
if (!vehicle.HasValue)
322+
{
323+
return;
234324
}
325+
326+
var id = (long)db.Insert(sim);
327+
328+
var conn = new ConnectionModel()
329+
{
330+
Simulation = id,
331+
Vehicle = vehicle.Value,
332+
Connection = "localhost:9090",
333+
};
334+
335+
db.Insert(conn);
235336
}
236337

237-
static void AddVehicle(IDatabase db, Utilities.BuildInfo info, string os, string name, string localPath, string sensors, string suffix = null, string bridge = null)
338+
static long AddVehicle(IDatabase db, Utilities.BuildInfo info, string os, string name, string localPath, string sensors, string suffix = null, string bridge = null)
238339
{
239340
var url = $"https://{info.DownloadHost}/{info.GitCommit}/{os}/vehicle_{name.ToLowerInvariant()}";
240341
var vehicle = new VehicleModel()
@@ -247,6 +348,8 @@ static void AddVehicle(IDatabase db, Utilities.BuildInfo info, string os, string
247348
Sensors = sensors,
248349
};
249350
db.Insert(vehicle);
351+
352+
return vehicle.Id;
250353
}
251354

252355
public static IEnumerable<MapModel> PendingMapDownloads()

Assets/Scripts/Database/Services/SimulationService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ public SimulationModel GetCurrent(string owner)
201201
return null;
202202
}
203203

204-
if (owner != Loader.Instance.CurrentSimulation.Owner)
204+
if (Loader.Instance.CurrentSimulation.Owner != null && Loader.Instance.CurrentSimulation.Owner != owner)
205205
{
206206
return null;
207207
}

Assets/Scripts/Sensors/DefaultSensors.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,33 @@ static class DefaultSensors
9292
@"{""type"": ""Vehicle Control"", ""name"": ""Apollo Car Control"",
9393
""params"": {""Topic"": ""/apollo/control""} }"
9494
) + "]";
95+
96+
public static readonly string DataCollection = "[" + string.Join(",",
97+
@"{""type"": ""Lidar"", ""name"": ""Lidar"",
98+
""params"": {""LaserCount"": 32, ""MinDistance"": 0.5, ""MaxDistance"": 100, ""RotationFrequency"": 10, ""MeasurementsPerRotation"": 360, ""FieldOfView"": 41.33, ""CenterAngle"": 10, ""Compensated"": true, ""PointColor"": ""#ff000000"", ""Topic"": ""/simulator/lidar"", ""Frame"": ""velodyne""},
99+
""transform"": {""x"": 0, ""y"": 2.312, ""z"": -0.3679201, ""pitch"": 0, ""yaw"": 0, ""roll"": 0}}",
100+
101+
@"{""type"": ""Color Camera"", ""name"": ""Main Camera"",
102+
""params"": {""Width"": 1920, ""Height"": 1080, ""Frequency"": 15, ""JpegQuality"": 75, ""FieldOfView"": 50, ""MinDistance"": 0.1, ""MaxDistance"": 1000, ""Topic"": ""/simulator/camera/color/compressed""},
103+
""transform"": {""x"": 0, ""y"": 1.7, ""z"": -0.2, ""pitch"": 0, ""yaw"": 0, ""roll"": 0}}",
104+
105+
@"{""type"": ""Depth Camera"", ""name"": ""Depth Camera"",
106+
""params"": { ""Width"": 1920, ""Height"": 1080, ""Frequency"": 15, ""JpegQuality"": 75, ""FieldOfView"": 50, ""MinDistance"": 0.1, ""MaxDistance"": 1000, ""Topic"": ""/simulator/depth_camera/compressed""},
107+
""transform"": { ""x"": 0, ""y"": 1.7, ""z"": -0.2, ""pitch"": 0, ""yaw"": 0, ""roll"": 0}}",
108+
109+
@"{""type"": ""Semantic Camera"", ""name"": ""Semantic Camera"",
110+
""params"": { ""Width"": 1920, ""Height"": 1080, ""Frequency"": 15, ""FieldOfView"": 50, ""MinDistance"": 0.1, ""MaxDistance"": 1000, ""Topic"": ""/simulator/semantic_camera/compressed"" },
111+
""transform"": { ""x"": 0, ""y"": 1.7, ""z"": -0.2, ""pitch"": 0, ""yaw"": 0, ""roll"": 0 }}",
112+
113+
@"{""type"": ""3D Ground Truth"", ""name"": ""3D Ground Truth"",
114+
""params"": { ""Frequency"": 10, ""Topic"": ""/simulator/ground_truth/3d_detections"" },
115+
""transform"": { ""x"": 0, ""y"": 1.975314, ""z"": -0.3679201, ""pitch"": 0, ""yaw"": 0, ""roll"": 0 }}",
116+
117+
@"{""type"": ""2D Ground Truth"", ""name"": ""2D Ground Truth"",
118+
""params"": { ""Frequency"": 10, ""Topic"": ""/simulator/ground_truth/2d_detections"" },
119+
""transform"": { ""x"": 0, ""y"": 1.7, ""z"": -0.2, ""pitch"": 0, ""yaw"": 0, ""roll"": 0 }}",
120+
121+
@"{""type"": ""Manual Control"", ""name"": ""Manual Car Control""}"
122+
) + "]";
95123
}
96124
}

Assets/Scripts/Web/Modules/SimulationsModule.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public SimulationRequestValidation()
152152
.NotEmpty().WithMessage("You must enter a non-empty name");
153153

154154
RuleFor(req => req.apiOnly)
155-
.NotNull().WithMessage("You specify if the API will be used");
155+
.NotNull().WithMessage("Api only parameter must be specified");
156156

157157
RuleFor(req => req.cluster)
158158
.NotNull().WithMessage("You must specifiy a cluster");
@@ -354,7 +354,9 @@ public SimulationsModule(ISimulationService service, IUserService userService, I
354354
return Response.AsJson(new { error = $"Failed to update simulation: {message}" }, HttpStatusCode.BadRequest);
355355
}
356356

357-
var simulation = req.ToModel(this.Context.CurrentUser.Identity.Name);
357+
var original = service.Get(id, Context.CurrentUser.Identity.Name);
358+
359+
var simulation = req.ToModel(original.Owner);
358360
simulation.Id = id;
359361

360362
simulation.Status = service.GetActualStatus(simulation, true);
@@ -381,7 +383,9 @@ public SimulationsModule(ISimulationService service, IUserService userService, I
381383
SIM.LogWeb(SIM.Web.SimulationEditVehicleName, vehicleModel.Name);
382384
SIM.LogWeb(SIM.Web.SimulationEditBridgeType, vehicleModel.BridgeType);
383385
}
384-
catch { };
386+
catch
387+
{
388+
}
385389
}
386390
}
387391

@@ -402,7 +406,9 @@ public SimulationsModule(ISimulationService service, IUserService userService, I
402406
SIM.LogWeb(SIM.Web.SimulationEditFog, simulation.Fog.ToString());
403407
SIM.LogWeb(SIM.Web.SimulationEditCloudiness, simulation.Cloudiness.ToString());
404408
}
405-
catch { };
409+
catch
410+
{
411+
}
406412

407413
if (result > 1)
408414
{

Assets/Tests/Web/TestSimulations.cs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,12 @@ public void TestUpdateMissingId()
10081008

10091009
Mock.Reset();
10101010
Mock.Setup(srv => srv.GetActualStatus(It.IsAny<SimulationModel>(), It.IsAny<bool>())).Returns("Valid");
1011+
1012+
Mock.Setup(srv => srv.Get(id, "Test User")).Returns(new SimulationModel()
1013+
{
1014+
Owner = null,
1015+
});
1016+
10111017
Mock.Setup(srv => srv.Update(It.IsAny<SimulationModel>())).Returns(0);
10121018

10131019
MockUser.Reset();
@@ -1017,6 +1023,7 @@ public void TestUpdateMissingId()
10171023
Assert.AreEqual(HttpStatusCode.NotFound, result.StatusCode);
10181024
Assert.That(result.ContentType.StartsWith("application/json"));
10191025

1026+
Mock.Verify(srv => srv.Get(id, "Test User"), Times.Once);
10201027
Mock.Verify(srv => srv.Update(It.Is<SimulationModel>(s => s.Name == request.name)), Times.Once);
10211028

10221029
Mock.Verify(srv => srv.GetActualStatus(It.Is<SimulationModel>(s => s.Name == "name"), It.IsAny<bool>()));
@@ -1039,6 +1046,12 @@ public void TestUpdateMultipleIds()
10391046

10401047
Mock.Reset();
10411048
Mock.Setup(srv => srv.GetActualStatus(It.IsAny<SimulationModel>(), It.IsAny<bool>())).Returns("Valid");
1049+
1050+
Mock.Setup(srv => srv.Get(id, "Test User")).Returns(new SimulationModel()
1051+
{
1052+
Owner = null,
1053+
});
1054+
10421055
Mock.Setup(srv => srv.Update(It.IsAny<SimulationModel>())).Returns(2);
10431056

10441057
MockUser.Reset();
@@ -1049,6 +1062,7 @@ public void TestUpdateMultipleIds()
10491062
Assert.AreEqual(HttpStatusCode.InternalServerError, result.StatusCode);
10501063
Assert.That(result.ContentType.StartsWith("application/json"));
10511064

1065+
Mock.Verify(srv => srv.Get(id, "Test User"), Times.Once);
10521066
Mock.Verify(srv => srv.Update(It.Is<SimulationModel>(s => s.Name == request.name)), Times.Once);
10531067

10541068
Mock.Verify(srv => srv.GetActualStatus(It.Is<SimulationModel>(s => s.Name == "name"), It.IsAny<bool>()));
@@ -1324,6 +1338,10 @@ public void TestUpdateInvalid()
13241338
Mock.Reset();
13251339
Mock.Setup(srv => srv.GetActualStatus(It.IsAny<SimulationModel>(), It.Is<bool>(x => x == true))).Returns("Invalid");
13261340

1341+
Mock.Setup(srv => srv.Get(id, "Test User")).Returns(new SimulationModel()
1342+
{
1343+
Owner = null,
1344+
});
13271345

13281346
MockUser.Reset();
13291347

@@ -1333,6 +1351,7 @@ public void TestUpdateInvalid()
13331351
Assert.AreEqual(HttpStatusCode.InternalServerError, result.StatusCode);
13341352
Assert.That(result.ContentType.StartsWith("application/json"));
13351353

1354+
Mock.Verify(srv => srv.Get(id, "Test User"), Times.Once);
13361355
Mock.Verify(srv => srv.GetActualStatus(It.Is<SimulationModel>(s => s.Name == request.name), It.IsAny<bool>()));
13371356

13381357
Mock.VerifyNoOtherCalls();
@@ -1352,6 +1371,11 @@ public void TestUpdate()
13521371

13531372
Mock.Reset();
13541373

1374+
Mock.Setup(srv => srv.Get(id, "Test User")).Returns(new SimulationModel()
1375+
{
1376+
Owner = null,
1377+
});
1378+
13551379
Mock.Setup(srv => srv.Update(It.IsAny<SimulationModel>())).Returns(1);
13561380

13571381
Mock.Setup(srv => srv.GetActualStatus(It.IsAny<SimulationModel>(), It.IsAny<bool>())).Returns("Valid");
@@ -1371,7 +1395,8 @@ public void TestUpdate()
13711395
Assert.AreEqual(request.cluster, simulation.Cluster);
13721396
Assert.AreEqual("Valid", simulation.Status);
13731397

1374-
Mock.Verify(srv => srv.Update(It.Is<SimulationModel>(s => s.Name == request.name)), Times.Once);
1398+
Mock.Verify(srv => srv.Get(id, "Test User"), Times.Once);
1399+
Mock.Verify(srv => srv.Update(It.Is<SimulationModel>(s => s.Name == request.name && s.Owner == null)), Times.Once);
13751400
Mock.Verify(srv => srv.GetActualStatus(It.Is<SimulationModel>(s => s.Name == request.name), It.IsAny<bool>()), Times.Exactly(2));
13761401

13771402
Mock.VerifyNoOtherCalls();
@@ -1393,11 +1418,15 @@ public void TestUpdateSeed()
13931418

13941419
Mock.Reset();
13951420

1421+
Mock.Setup(srv => srv.Get(id, "Test User")).Returns(new SimulationModel()
1422+
{
1423+
Owner = null,
1424+
});
1425+
13961426
Mock.Setup(srv => srv.Update(It.IsAny<SimulationModel>())).Returns(1);
13971427

13981428
Mock.Setup(srv => srv.GetActualStatus(It.IsAny<SimulationModel>(), It.IsAny<bool>())).Returns("Valid");
13991429

1400-
14011430
MockUser.Reset();
14021431

14031432
var result = Browser.Put($"/simulations/{id}", ctx => ctx.JsonBody(request)).Result;
@@ -1413,6 +1442,7 @@ public void TestUpdateSeed()
14131442
Assert.AreEqual("Valid", simulation.Status);
14141443
Assert.AreEqual(request.seed, simulation.Seed);
14151444

1445+
Mock.Verify(srv => srv.Get(id, "Test User"), Times.Once);
14161446
Mock.Verify(srv => srv.Update(It.Is<SimulationModel>(s => s.Name == request.name)), Times.Once);
14171447

14181448
Mock.Verify(srv => srv.GetActualStatus(It.Is<SimulationModel>(s => s.Name == request.name), It.IsAny<bool>()), Times.Exactly(2));
@@ -1434,11 +1464,15 @@ public void TestUpdateNullSeed()
14341464

14351465
Mock.Reset();
14361466

1467+
Mock.Setup(srv => srv.Get(id, "Test User")).Returns(new SimulationModel()
1468+
{
1469+
Owner = null,
1470+
});
1471+
14371472
Mock.Setup(srv => srv.Update(It.IsAny<SimulationModel>())).Returns(1);
14381473

14391474
Mock.Setup(srv => srv.GetActualStatus(It.IsAny<SimulationModel>(), It.IsAny<bool>())).Returns("Valid");
14401475

1441-
14421476
MockUser.Reset();
14431477

14441478
var result = Browser.Put($"/simulations/{id}", ctx => ctx.JsonBody(request)).Result;
@@ -1454,6 +1488,8 @@ public void TestUpdateNullSeed()
14541488
Assert.AreEqual("Valid", simulation.Status);
14551489
Assert.Null(simulation.Seed);
14561490

1491+
Mock.Verify(srv => srv.Get(id, "Test User"), Times.Once);
1492+
14571493
Mock.Verify(srv => srv.Update(It.Is<SimulationModel>(s => s.Name == request.name)), Times.Once);
14581494

14591495
Mock.Verify(srv => srv.GetActualStatus(It.Is<SimulationModel>(s => s.Name == request.name), It.IsAny<bool>()), Times.Exactly(2));

0 commit comments

Comments
 (0)