]> rtime.felk.cvut.cz Git - hubacji1/iamcar2.git/blobdiff - scripts/plot_json_objects_scenario.py
Reorder scenario plot
[hubacji1/iamcar2.git] / scripts / plot_json_objects_scenario.py
index cdf07795aaa306f75336ae01eb1b0b00de850b79..41509310aaaa450f59c5119ec7abacc155304907 100644 (file)
@@ -48,6 +48,11 @@ def plot_car(pose):
     lfx += BCAR_DF * cos(pose[2])
     lfx += BCAR_SD * cos(pose[2])
 
+    lf3x = pose[0]
+    lf3x += (BCAR_W / 2.0) * cos(pose[2] + pi / 2.0)
+    lf3x += 2/3 * BCAR_DF * cos(pose[2])
+    lf3x += BCAR_SD * cos(pose[2])
+
     lrx = pose[0]
     lrx += (BCAR_W / 2.0) * cos(pose[2] + pi / 2.0)
     lrx += -BCAR_DR * cos(pose[2])
@@ -63,11 +68,21 @@ def plot_car(pose):
     rfx += BCAR_DF * cos(pose[2])
     rfx += BCAR_SD * cos(pose[2])
 
+    rf3x = pose[0]
+    rf3x += (BCAR_W / 2.0) * cos(pose[2] - pi / 2.0)
+    rf3x += 2/3 * BCAR_DF * cos(pose[2])
+    rf3x += BCAR_SD * cos(pose[2])
+
     lfy = pose[1]
     lfy += (BCAR_W / 2.0) * sin(pose[2] + pi / 2.0)
     lfy += BCAR_DF * sin(pose[2])
     lfy += BCAR_SD * sin(pose[2])
 
+    lf3y = pose[1]
+    lf3y += (BCAR_W / 2.0) * sin(pose[2] + pi / 2.0)
+    lf3y += 2/3 * BCAR_DF * sin(pose[2])
+    lf3y += BCAR_SD * sin(pose[2])
+
     lry = pose[1]
     lry += (BCAR_W / 2.0) * sin(pose[2] + pi / 2.0)
     lry += -BCAR_DR * sin(pose[2])
@@ -83,61 +98,202 @@ def plot_car(pose):
     rfy += BCAR_DF * sin(pose[2])
     rfy += BCAR_SD * sin(pose[2])
 
-    xcoords = (lfx - MINX, lrx - MINX, rrx - MINX, rfx - MINX)
-    ycoords = (lfy - MINY, lry - MINY, rry - MINY, rfy - MINY)
-    return (xcoords, ycoords)
+    rf3y = pose[1]
+    rf3y += (BCAR_W / 2.0) * sin(pose[2] - pi / 2.0)
+    rf3y += 2/3 * BCAR_DF * sin(pose[2])
+    rf3y += BCAR_SD * sin(pose[2])
+
+    cfx = pose[0]
+    cfx += BCAR_DF * cos(pose[2])
+    cfx += BCAR_SD * cos(pose[2])
+
+    cfy = pose[1]
+    cfy += BCAR_DF * sin(pose[2])
+    cfy += BCAR_SD * sin(pose[2])
+
+    xcoords = (lfx, lrx, rrx, rfx, cfx, rf3x, lf3x, cfx, lfx)
+    ycoords = (lfy, lry, rry, rfy, cfy, rf3y, lf3y, cfy, lfy)
+    return ([x - MINX for x in xcoords], [y - MINY for y in ycoords])
 
 if __name__ == "__main__":
+    sc2 = None
     if (len(argv) == 2):
         SCEN_FILE = argv[1]
+    elif (len(argv) == 3):
+        SCEN_FILE = argv[1]
+        SCEN_FILE2 = argv[2]
+        sc2 = get_scenario(SCEN_FILE2)
     else:
         SCEN_FILE = "sc.json"
 
     scenario = get_scenario(SCEN_FILE)
 
-    plt.rcParams["font.size"] = 24
+    # Font size to be approximately the same in the paper:
+    #   - sc1-0: 16
+    #   - sc3-2, Intro: 12
+    #   - sc4-0+: 22
+    plt.rcParams["font.family"] = "cmr10"
+    plt.rcParams["font.size"] = 12
     plt.rcParams['hatch.linewidth'] = 1.0
+    plt.rcParams['lines.linewidth'] = 1.0
     fig = plt.figure()
 
     # here subplot starts
     ax = fig.add_subplot(111)
     ax.set_aspect("equal")
-    ax.set_title("{}".format(SCEN_FILE))
+    ax.set_title("Real-world parking scenario")
     ax.set_xlabel("x [m]")
     ax.set_ylabel("y [m]")
-    ax.set_xlim([-8, 37]) # 30
-    ax.set_ylim([-5, 55]) # 60
 
+    # For Possible Entry Points (Possible Entry Configurations) use:
+    #ax.set_xlim([35.6, 46.4])
+    #ax.set_ylim([2.9, 2.9 + 6.84])
+
+    # For Last Maneuver use:
+    #ax.set_xlim([38, 44])
+    #ax.set_ylim([3.1, 6.9])
+
+    # For Scenario 3-2 detail use:
+    #ax.set_xlim([0, 15])
+    #ax.set_ylim([35, 50])
+
+    # For Real-world parking scenario in Introduction section use:
+    #ax.set_xlim([32, 47.5])
+    #ax.set_ylim([2.4, 9.9])
+
+    # Set min and max to center the plot.
     MINX = scenario["init"][0]
     MINY = scenario["init"][1]
     if "obst" in scenario and  len(scenario["obst"]) > 0:
         for o in scenario["obst"]:
+            if not o:
+                continue
             for n in o:
                 if n[0] < MINX:
                     MINX = n[0]
                 if n[1] < MINY:
                     MINY = n[1]
 
+    # Plot all the nodes (if exists.)
     if "nodes_x" in scenario and "nodes_y" in scenario:
         plt.plot(
-            scenario["nodes_x"] - MINX,
-            scenario["nodes_y"] - MINY,
+            [x - MINX for x in scenario["nodes_x"]],
+            [y - MINY for y in scenario["nodes_y"]],
             color="lightgray",
             marker="o",
             ms=2,
             lw=0,
         )
-    if "obst" in scenario and  len(scenario["obst"]) > 0:
+    # Plot all the steered2 nodes (if exists.)
+    if "steered2_x" in scenario and "steered2_y" in scenario:
+        plt.plot(
+            [x - MINX for x in scenario["steered2_x"]],
+            [y - MINY for y in scenario["steered2_y"]],
+            color="orange",
+            marker="o",
+            ms=2,
+            lw=0,
+        )
+    # Plot all the steered1 nodes (if exists.)
+    if "steered1_x" in scenario and "steered1_y" in scenario:
+        plt.plot(
+            [x - MINX for x in scenario["steered1_x"]],
+            [y - MINY for y in scenario["steered1_y"]],
+            color="blue",
+            marker="o",
+            ms=2,
+            lw=0,
+        )
+    # Plot obstacles, slot.
+    if "obst" in scenario and len(scenario["obst"]) > 0:
         for o in scenario["obst"]:
-            plt.plot(*plot_nodes(o), color="blue")
-    if "path" in scenario and  len(scenario["path"]) > 0:
-        for n in scenario["path"]:
-            plt.plot(*plot_car(n), color="peachpuff")
-        plt.plot(*plot_nodes(scenario["path"]), color="orange")
+            if not o:
+                continue
+            plt.plot(*plot_nodes(o), color="blue", linestyle=":")
     if "slot" in scenario and len(scenario["slot"]) > 0:
-        plt.plot(*plot_nodes(scenario["slot"][0]), color="gray")
+        plt.plot(*plot_nodes(scenario["slot"][0]), color="black")
         #for s in scenario["slot"]:
-        #    plt.plot(*plot_nodes(s), color="gray")
+        #    plt.plot(*plot_nodes(s), color="black")
+
+    # If there are possible starts specified, you may print and plot them.
+    #if "starts" in scenario and len(scenario["starts"]) > 0:
+    #    print("possible starts:")
+    #    for p in scenario["starts"]:
+    #        plt.plot(*p, color="red", marker="+", ms=12)
+    #        print(" {}".format(p))
+
+    # For the Last Maneuver figure from the paper, use:
+    #   - `init2` -- orange
+    #plt.plot(*plot_car(scenario["init2"]), color="orange")
+    #plt.plot(
+    #    scenario["init2"][0] - MINX,
+    #    scenario["init2"][1] - MINY,
+    #    color="orange",
+    #    #marker="+",
+    #    ms=12
+    #)
+    #   - `goal2` -- orange
+    #plt.plot(*plot_car(scenario["goal2"]), color="orange")
+    #plt.plot(
+    #    scenario["goal2"][0] - MINX,
+    #    scenario["goal2"][1] - MINY,
+    #    color="orange",
+    #    #marker="+",
+    #    ms=12
+    #)
+    #   - `goal2` -- middle (orange)
+    #plt.plot(*plot_car(scenario["goals"][0]), color="orange")
+    #plt.plot(
+    #    scenario["goal2"][0] - MINX,
+    #    scenario["goal2"][1] - MINY,
+    #    color="orange",
+    #    #marker="+",
+    #    ms=12
+    #)
+    #   - `init1` -- green
+    #plt.plot(*plot_car(scenario["init1"]), color="green")
+    #plt.plot(
+    #    scenario["init1"][0] - MINX,
+    #    scenario["init1"][1] - MINY,
+    #    color="green",
+    #    #marker="+",
+    #    ms=12
+    #)
+    #   - `goal1` -- green
+    #plt.plot(*plot_car(scenario["goal1"]), color="green")
+    #plt.plot(
+    #    scenario["goal1"][0] - MINX,
+    #    scenario["goal1"][1] - MINY,
+    #    color="green",
+    #    #marker="+",
+    #    ms=12
+    #)
+
+    # For the Possible Entry Configurations from the paper, use:
+    #if "inits" in scenario:
+    #    #for i in scenario["inits"]:
+    #    for j in range(0, len(scenario["inits"]), 110):
+    #        i = scenario["inits"][j]
+    #        print(i)
+    #        if len(i) == 3:
+    #            plt.plot(*plot_car(i), color="gray")
+    #            plt.plot(
+    #                i[0] - MINX,
+    #                i[1] - MINY,
+    #                color="gray",
+    #                marker="+",
+    #                ms=12,
+    #            )
+    #    #plt.plot(*plot_car(scenario["inits"][0]), color="magenta")
+    #    #plt.plot(
+    #    #    scenario["inits"][0][0] - MINX,
+    #    #    scenario["inits"][0][1] - MINY,
+    #    #    color="magenta",
+    #    #    marker="+",
+    #    #    ms=12,
+    #    #)
+
+    # Plot `init`, `entry`, and `goal` configurations.
     if "init" in scenario and len(scenario["init"]) == 3:
         plt.plot(*plot_car(scenario["init"]), color="red")
         plt.plot(
@@ -147,11 +303,15 @@ if __name__ == "__main__":
             marker="+",
             ms=12
         )
-    if "goals" in scenario:
-        for i in scenario["goals"]:
-            if len(i) == 3:
-                plt.plot(*plot_car(i), color="darkseagreen")
-                plt.plot(i[0] - MINX, i[1] - MINY, color="darkseagreen", marker="+", ms=12)
+    if "entry" in scenario and len(scenario["entry"]) == 3:
+        plt.plot(*plot_car(scenario["entry"]), color="magenta")
+        plt.plot(
+            scenario["entry"][0] - MINX,
+            scenario["entry"][1] - MINY,
+            color="magenta",
+            marker="+",
+            ms=12
+        )
     if "goal" in scenario and len(scenario["goal"]) == 3:
         plt.plot(*plot_car(scenario["goal"]), color="green")
         plt.plot(
@@ -161,13 +321,31 @@ if __name__ == "__main__":
             marker="+",
             ms=12
         )
-    if "starts" in scenario and len(scenario["starts"]) > 0:
-        print("possible starts:")
-        for p in scenario["starts"]:
-            plt.plot(*p, color="red", marker="+", ms=12)
-            print(" {}".format(p))
+
+    # Plot `path` and `max_path`.
+    if sc2 and "path" in sc2 and  len(sc2["path"]) > 0:
+        plt.plot(*plot_nodes(sc2["path"]), color="orange")
+    if "path" in scenario and  len(scenario["path"]) > 0:
+        plt.plot(*plot_nodes(scenario["path"]), color="green")
+
+    # The `scenario` may also include:
+    #   - `last` -- not sure what this is, see the source code. Maybe overlaps
+    #     with the `goal`.
+    #   - `last1` -- used to demonstrate In-Slot Planner (was Parking Slot
+    #     Planner (PSP.))
+    #   - `last2` -- used to demonstrate In-Slot Planner (was Parking Slot
+    #     Planner (PSP.))
+    #   - `max_orig_path` -- maximum original path. I used this when comparing
+    #     original paths but I had to copy the `max_orig_path` by hand from
+    #     different scenario result.
+    #   - `orig_path` -- the path before the optimization.
+    #   - `max_path` -- the maximum path after optimization. Must be copied by
+    #     hand.
+    #   - `path` -- optimized path of the scenario.
 
     handles, labels = ax.get_legend_handles_labels()
 
-    plt.show()
+    # Uncommnent the following line and comment the plt.show() to store to the
+    # file.
+    plt.savefig("out.pdf", bbox_inches="tight")
     plt.close(fig)