LingxinMeng 6 kuukautta sitten
vanhempi
commit
88b70f53d1

+ 3 - 1
src/python2/pjibot/camera-errorBag.json

@@ -58,5 +58,7 @@
     "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-27-25/", 
     "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-47-59/", 
     "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-40-28/", 
-    "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-45-29/"
+    "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-45-29/", 
+    "pjibot/pjibot-P1YNYD1M223000101/data_parse/2024-11-29-09-46-26_obstacledetection_42/", 
+    "pjibot/pjibot-P1YNYD1M223000101/data_parse/2024-11-29-11-18-30_obstacledetection_30/"
 ]

+ 3 - 1
src/python2/pjibot/csv-errorBag.json

@@ -78,5 +78,7 @@
     "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-30-25/", 
     "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-47-59/", 
     "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-40-28/", 
-    "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-45-29/"
+    "pjibot/pjibot-P1YNYD1M225000112/data_parse/TS100M36-BJ-dock-2024-09-29-15-45-29/", 
+    "pjibot/pjibot-P1YNYD1M223000101/data_parse/2024-11-29-09-46-26_obstacledetection_42/", 
+    "pjibot/pjibot-P1YNYD1M223000101/data_parse/2024-11-29-11-18-30_obstacledetection_30/"
 ]

+ 4 - 4
src/python2/pjibot_delivery/callback-pjibot_delivery.py

@@ -49,7 +49,7 @@ if __name__ == '__main__':
                         file1 = False
                         file2 = False
                         file3 = False
-                        # file4 = False
+                        file4 = False
                         file5 = False
                         file7 = False
                         file8 = False
@@ -61,8 +61,8 @@ if __name__ == '__main__':
                                 file2 = True
                             if '/objects_pji.csv' in str(obj2.key):
                                 file3 = True
-                            # if '/pcd_overlook.mp4' in str(obj2.key):
-                            #     file4 = True
+                            if '/pcd_overlook.mp4' in str(obj2.key):
+                                file4 = True
                             if '/pos_pji.csv' in str(obj2.key):
                                 file5 = True
                             if '/scenario_orig.mp4' in str(obj2.key):
@@ -71,7 +71,7 @@ if __name__ == '__main__':
                                 file8 = True
                             if '/trajectory_pji.csv' in str(obj2.key):
                                 file9 = True
-                        if not file1 or not file2 or not file3 or not file5 or not file7 or not file8 or not file9:
+                        if not file1 or not file2 or not file3 or not file4 or not file5 or not file7 or not file8 or not file9:
                             continue
                         time.sleep(1)
                         logging.info("发送:%s", prefix)

+ 6 - 1
src/python2/pjibot_delivery/csv-errorBag.json

@@ -159,5 +159,10 @@
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-47-59/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-40-28/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-45-29/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-09-14-11-15-02/"
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-09-14-11-15-02/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VP100M23-BJ-movebase-2024-11-15-14-19-41/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/2024-10-24-15-48-07/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/test_1128/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/pji-2024-10-24-15-48-07/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/36110-2024-10-24-15-49-34/"
 ]

+ 92 - 46
src/python2/pjibot_delivery/pcd-errorBag.json

@@ -1,4 +1,22 @@
 [
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-10-23-14-32-20/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-11-14-17-47-50/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-11-14-17-51-19/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-11-14-17-52-58/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-11-14-17-53-56/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-22-14/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-22-59/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-24-20/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-26-54/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-27-39/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-28-17/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-29-00/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-29-33/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-30-32/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-33-35/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-35-15/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-36-31/", 
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M6-BJ-Perception2024-10-24-15-53-24/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-11-39-55/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-27-25/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-30-25/", 
@@ -9,51 +27,79 @@
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-43-02/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-45-29/", 
     "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/TS100M36-BJ-dock-2024-09-29-15-47-59/", 
-    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M21-BJ-dock-2024-09-26-10-12-24/", 
-    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M21-BJ-dock-2024-09-26-10-15-01/", 
-    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M21-BJ-dock-2024-09-26-10-18-40/", 
-    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M21-BJ-dock-2024-09-26-10-20-45/", 
-    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M21-BJ-dock-2024-09-26-10-24-03/", 
-    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M21-BJ-dock-2024-09-26-10-25-48/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-09-52-53/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-06-42/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-09-05/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-11-32/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-12-43/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-33-53/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-34-39/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-37-46/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-40-05/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-42-33/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-10-43-45/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Locate-2024-09-29-16-05-42/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-22-14/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-22-59/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-24-20/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-26-54/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-27-39/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-28-17/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-29-00/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-29-33/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-30-32/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-33-35/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-35-15/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-36-31/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-10-24-15-53-24/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-26-31/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-29-07/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-31-59/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-36-33/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-37-51/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-39-44/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-45-05/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-46-29/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-Perception2024-11-08-16-48-55/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-11-39-55/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-27-25/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-30-25/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-31-10/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-32-26/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-34-00/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-40-28/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-43-02/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-45-29/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-dock-2024-09-29-15-47-59/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-50-39/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-52-00/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-53-23/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-54-17/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-55-28/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-56-50/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-57-57/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-15-58-52/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-00-45/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-02-11/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-05-42/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-07-32/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-08-46/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-09-43/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-10-44/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-11-42/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VD100M6-BJ-movebase-2024-09-29-16-12-44/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/VP100M23-BJ-movebase-2024-11-15-14-19-41/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩前倾10°_2024-09-29-15-47-59/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩前方障碍物穿梭2024-09-29-15-32-26/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩前方障碍物遮挡2024-09-29-15-31-10/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩右偏斜30°_2024-09-29-15-43-02/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩右偏移15cm_2024-09-29-15-40-28/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩左偏移30°_2024-09-29-15-45-29/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩有电 轮廓遮挡2024-09-29-15-30-25/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩没电 轮廓遮挡2024-09-29-15-27-25/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/充电桩没电2024-09-29-11-39-55/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/障碍物跟随2024-09-29-15-34-00/", 
     "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/2024-10-23-14-10-28_obstacledetection_30/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M20-BJ-dock-2024-11-14-18-31-39/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-23-26/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-24-07/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-24-29/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-25-51/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-26-31/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-27-16/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-28-34/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-29-11/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-29-42/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-32-12/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-33-00/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-33-27/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-35-02/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-35-42/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-36-22/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-37-34/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-38-21/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-38-50/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-43-32/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-44-11/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-44-41/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-45-08/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-45-50/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-10-23-17-46-23/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-31-57/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-32-42/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-33-17/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-34-23/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-34-51/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-35-28/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-37-00/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-37-29/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-14-17-38-45/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-15-15-43-28/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-15-15-44-11/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-Perception2024-11-15-15-44-42/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-09-12-11-29-38/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-09-12-16-46-00/", 
-    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/VD100M21-BJ-movebase-2024-09-14-11-09-38/"
+    "pjibot_delivery/pjibot-P1YVPS1M22CM00020/data_parse/test_1128/", 
+    "pjibot_delivery/pjibot-P1YYPS1M227M00107/data_parse/2024-10-24-15-48-07/"
 ]

+ 273 - 181
src/python2/pjibot_delivery/resource/bagtocsv_robot.py

@@ -11,6 +11,7 @@ import numpy as np
 from datetime import datetime
 import argparse
 import pandas as pd
+import json
 
 
 def quaternion_to_euler(x, y, z, w):
@@ -32,199 +33,286 @@ def quaternion_to_euler(x, y, z, w):
 
 
 
-def parsehancheng(input_dir, output_dir):   
-    dic_trajectory = ['Time','simTime','simFrame','PointNumber','posX','posY','posZ','posH',
-    'TargetX','TargetY','TargetZ','TargetH']
-    trajectory_file = open(output_dir + "/"+"trajectory_pji.csv", 'w')
-    writer_trajectory = csv.writer(trajectory_file)
-    writer_trajectory.writerow(dic_trajectory)
+def parsehancheng(input_dir, output_dir):  
     
-    dic_EgoState = ['Time','simTime','simFrame','posX','posY','posZ','posH','speedX','speedH','cmd_speedX','cmd_speedH','obstacle','task_error_code']
+    json_path=os.path.join(output_dir,'output.json')
+    try:
+        dic_trajectory = ['Time','simTime','simFrame','PointNumber','posX','posY','posZ','posH',
+        'TargetX','TargetY','TargetZ','TargetH']
+        trajectory_file = open(output_dir + "/"+"trajectory_pji.csv", 'w')
+        writer_trajectory = csv.writer(trajectory_file)
+        writer_trajectory.writerow(dic_trajectory)
+        
+        
+        dic_EgoState = ['Time','simTime','simFrame','posX','posY','posZ','posH','speedX','speedH','cmd_speedX','cmd_speedH','obstacle','task_error_code','latitude','longitude']
+        
+        EgoState_file = open(output_dir + "/"+"ego_pji.csv", 'w')
+        
+        writer_EgoState = csv.writer(EgoState_file)
+        writer_EgoState.writerow(dic_EgoState)
+        
+        
+        dic_drive=['Time', 'Real_Speed', 'latitude', 'longitude', 'angular_velocity_z']
+        drive_file = open(output_dir + "/"+"drive.csv", 'w')
+        writer_drive = csv.writer(drive_file)
+        writer_drive.writerow(dic_drive)
+        
     
-    EgoState_file = open(output_dir + "/"+"ego_pji.csv", 'w')
+        #dic_robot_pos = ['Time','simtime','FrameID','HeadingAngle','X', 'Y' ,'Z','latitude','longitude']
+        #robot_pos_file = open(output_dir + "/"+"pos_pji.csv", 'w')
+        #writer_robot_pos = csv.writer(robot_pos_file)
+        #writer_robot_pos.writerow(dic_robot_pos)
     
-    writer_EgoState = csv.writer(EgoState_file)
-    writer_EgoState.writerow(dic_EgoState)
-
-    dic_robot_pos = ['Time','simtime','FrameID','HeadingAngle','X', 'Y' ,'Z','latitude','longitude']
-    robot_pos_file = open(output_dir + "/"+"pos_pji.csv", 'w')
-    writer_robot_pos = csv.writer(robot_pos_file)
-    writer_robot_pos.writerow(dic_robot_pos)
-
-    dic_objects = ['Time','simtime','FrameID','playerId','posH','posX', 'posY' ,'posZ','label','dimX','dimY','dimZ',
-                   'speedX','speedY','speedZ','speedH_X','speedH_Y','speedH_Z','accelX','accelY','accelZ','accelH_X','accelH_Y','accelH_Z']
-    objects_file = open(output_dir + "/"+"objects_pji.csv", 'w')
-    writer_objects = csv.writer(objects_file)
-    writer_objects.writerow(dic_objects)
-
-    frame_max=sys.maxsize
-    with rosbag.Bag(input_dir ,'r') as bag:
-        #wheel_odom_flag=False
-        #cmd_vel_flag=False
-        first_message_time = None
-        Frame_robot_pose=1
-        obstacle_state=0
-        speed_linear=0
-        speed_angular=0
-        speed_linear2=0
-        speed_angular2=0
-        cmd_speed_angular=0
-        cmd_speed_linear=0
-        first_message_time = None
-        framenum_ego = 1
-        task_error_code=0
-        #framenum_obj = 1
-        locationsimtime=' '
-        date_time=' '
-        simFrame=1
-        latitude=0
-        longitude=0
-        ego_posx,ego_posy,ego_posz,ego_posH=0,0,0,0
-        for topic,msg,t in bag.read_messages(topics=['/wheel','/obstacle_detection','/wheel_odom','/cmd_vel','/robot_pose','/tracking/objects','/nav/task_feedback_info','/robot/final_trajectory','/gnss']):   
+        dic_objects = ['Time','simTime','simFrame','playerId','posH','posX', 'posY' ,'posZ','label','dimX','dimY','dimZ',
+                       'speedX','speedY','speedZ','speedH_X','speedH_Y','speedH_Z','accelX','accelY','accelZ','accelH_X','accelH_Y','accelH_Z']
+        objects_file = open(output_dir + "/"+"objects_pji.csv", 'w')
+        writer_objects = csv.writer(objects_file)
+        writer_objects.writerow(dic_objects)
+    
+        frame_max=sys.maxsize
+        with rosbag.Bag(input_dir ,'r') as bag:
+            #wheel_odom_flag=False
+            #cmd_vel_flag=False
+            first_message_time = None
+            Frame_robot_pose=1
+            obstacle_state=0
+            speed_linear=0
+            speed_angular=0
+            speed_linear2=0
+            speed_angular2=0
+            cmd_speed_angular=0
+            cmd_speed_linear=0
+            first_message_time = None
+            framenum_ego = 1
+            task_error_code=0
+            #framenum_obj = 1
+            locationsimtime=' '
+            date_time=' '
+            simFrame=1
+            latitude=0
+            longitude=0
+            ego_posx,ego_posy,ego_posz,ego_posH=0,0,0,0
             
-            if first_message_time is None:  
-                first_message_time = t
-                first_message_time = rospy.Time.to_sec(first_message_time)
-                first_message_time = datetime.fromtimestamp(first_message_time)
-                
-            if topic == "/gnss":
-                latitude=msg.latitude/10000000
-                longitude=msg.longitude/10000000
             
-            if topic == "/obstacle_detection":
-                obstacle_state=msg.data
-                #print(msg.data)
-
+            #用来判断机器人点云/图像/规划/定位是否丢帧↓↓↓
+            #num_image_raw=0
+            #rate_image_raw=10
+            
+            num_velodyne_points=0
+            rate_velodyne_points=10
             
-            #之前的解析用的是这个话题,现在改成/wheel了
-            '''
-            if topic == "/wheel_odom": 
-                #wheel_odom_flag=True 
-                speed_linear=msg.twist.twist.linear.x*3.6
-                speed_angular=msg.twist.twist.angular.z
-            '''
+            bag_start_time = bag.get_start_time()
+            bag_end_time = bag.get_end_time()
+            duration=bag_end_time-bag_start_time
+            Theoretical_velodyne_points_num=int(duration*rate_velodyne_points)
+            #Theoretical_image_raw_num=int(duration*rate_image_raw)
+            #print(duration)   
+            robot_pose_lost_flag=True
+            final_trajectorye_lost_flag=True
+            gnss_lost_flag=True
             
+            pcd_exist_flag=False
             
-            if topic == "/wheel": 
-                #wheel_odom_flag=True 
-                speed_linear2=(msg.twist.twist.linear.x+msg.twist.twist.linear.y)*0.5*3.6
-                speed_angular2=(msg.twist.twist.linear.y-msg.twist.twist.linear.x)/0.5
-                #print('speed_linear2=',speed_linear2,'speed_angular2=',speed_angular2)
-             
-            if topic == "/cmd_vel": 
-                #cmd_vel_flag=True
-                cmd_speed_linear=msg.linear.x*3.6
-                cmd_speed_angular=msg.angular.z
+            
+            #用来判断机器人点云/图像/规划/定位是否丢帧↑↑↑
+            
+            for topic,msg,t in bag.read_messages(topics=['/wheel','/obstacle_detection','/wheel_odom','/cmd_vel','/robot_pose','/tracking/objects','/nav/task_feedback_info',
+                                                         '/robot/final_trajectory','/gnss','/image_raw','/velodyne_points']):   
                 
-            if topic == "/nav/task_feedback_info":
-                task_error_code=msg.task_error_code
+                if first_message_time is None:  
+                    first_message_time = t
+                    first_message_time = rospy.Time.to_sec(first_message_time)
+                    first_message_time = datetime.fromtimestamp(first_message_time)
                 
-            if topic == "/robot_pose":
                 
-                timestamp = rospy.Time.to_sec(t)
-                date_time = datetime.fromtimestamp(timestamp)
-                locationsimtime=(date_time-first_message_time).total_seconds()
-                ego_posx=msg.pose.position.x
-                poseX=ego_posx
-                #poseX=ego_posx-88.96626338170609
-                ego_posy=msg.pose.position.y
-                poseY=ego_posy
-                #poseY=ego_posy-40.553671177476645 
-                poseZ=msg.pose.position.z
-                orientationX=msg.pose.orientation.x
-                orientationY=msg.pose.orientation.y
-                orientationZ=msg.pose.orientation.z
-                orientationW=msg.pose.orientation.w
-                egoyaw=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
-                message_location =[date_time,locationsimtime,framenum_ego,egoyaw,poseX,poseY,poseZ,latitude,longitude]    
-                #print(f'date_time={date_time},  locationtime={locationsimtime}')
-                writer_robot_pos.writerow(message_location)
-                #if wheel_odom_flag and cmd_vel_flag:
-                message_EgoState =[date_time,locationsimtime,Frame_robot_pose,poseX,poseY,poseZ,egoyaw,
-                                   speed_linear2,speed_angular2,cmd_speed_linear,cmd_speed_angular,obstacle_state,task_error_code]
-             
-                writer_EgoState.writerow(message_EgoState)
-                framenum_ego+=1
-                Frame_robot_pose+=1
-
-        
-            if topic == "/tracking/objects":
-                msg_l = len(msg.objects)
-                if msg_l and (locationsimtime != ' ') and (date_time != ' '):
-                    #timestamp = rospy.Time.to_sec(t)
-                    #date_time = datetime.fromtimestamp(timestamp)
-                    #simtime=(date_time-first_message_time).total_seconds()
-                    for i in range(msg_l):
-                        obj_ID = msg.objects[i].id
-                        obj_x = msg.objects[i].pose.position.x
-                        #obj_x = msg.objects[i].pose.position.x-88.96626338170609
-                        obj_y = msg.objects[i].pose.position.y
-                        #obj_y = msg.objects[i].pose.position.y-40.553671177476645
-                        obj_z = msg.objects[i].pose.position.z
-                        obj_orientationX=msg.objects[i].pose.orientation.x
-                        obj_orientationY=msg.objects[i].pose.orientation.y
-                        obj_orientationZ=msg.objects[i].pose.orientation.z
-                        obj_orientationW=msg.objects[i].pose.orientation.w
-                        objyaw=quaternion_to_euler(obj_orientationX,obj_orientationY,obj_orientationZ,obj_orientationW)
-                        obj_lable=msg.objects[i].label
-                        obj_dimX=msg.objects[i].dimensions.x
-                        obj_dimY=msg.objects[i].dimensions.y
-                        obj_dimZ=msg.objects[i].dimensions.z
-                        velocity_linear_x=msg.objects[i].velocity.linear.x
-                        velocity_linear_y=msg.objects[i].velocity.linear.y
-                        velocity_linear_z=msg.objects[i].velocity.linear.z
-                        
-                        velocity_angular_x=msg.objects[i].velocity.angular.x
-                        velocity_angular_y=msg.objects[i].velocity.angular.y
-                        velocity_angular_z=msg.objects[i].velocity.angular.z
-                        
-                        acceleration_linear_x=msg.objects[i].acceleration.linear.x
-                        acceleration_linear_y=msg.objects[i].acceleration.linear.y
-                        acceleration_linear_z=msg.objects[i].acceleration.linear.z
-                        
-                        acceleration_angular_x=msg.objects[i].acceleration.angular.x
-                        acceleration_angular_y=msg.objects[i].acceleration.angular.y
-                        acceleration_angular_z=msg.objects[i].acceleration.angular.z
+                    
+                if topic == "/velodyne_points":
+                    pcd_exist_flag=True
+                    num_velodyne_points+=1
+                '''  
+                if topic == "/image_raw":
+                    num_image_raw+=1
+                '''    
+                if topic == "/gnss":
+                    latitude=msg.latitude/10000000
+                    longitude=msg.longitude/10000000
+                    gnss_lost_flag=False
+                
+                if topic == "/obstacle_detection":
+                    obstacle_state=msg.data
+                    #print(msg.data)
+    
+                
+                #之前的解析用的是这个话题,现在改成/wheel了
+                '''
+                if topic == "/wheel_odom": 
+                    #wheel_odom_flag=True 
+                    speed_linear=msg.twist.twist.linear.x*3.6
+                    speed_angular=msg.twist.twist.angular.z
+                '''
+                
+                
+                if topic == "/wheel": 
+                    #wheel_odom_flag=True 
+                    speed_linear2=(msg.twist.twist.linear.x+msg.twist.twist.linear.y)*0.5*3.6
+                    speed_angular2=(msg.twist.twist.linear.y-msg.twist.twist.linear.x)/0.5
+                    #print('speed_linear2=',speed_linear2,'speed_angular2=',speed_angular2)
+                 
+                if topic == "/cmd_vel": 
+                    #cmd_vel_flag=True
+                    cmd_speed_linear=msg.linear.x*3.6
+                    cmd_speed_angular=msg.angular.z
+                    
+                if topic == "/nav/task_feedback_info":
+                    task_error_code=msg.task_error_code
+                    
+                if topic == "/robot_pose":
+                    
+                    timestamp = rospy.Time.to_sec(t)
+                    date_time = datetime.fromtimestamp(timestamp)
+                    locationsimtime=(date_time-first_message_time).total_seconds()
+                    ego_posx=msg.pose.position.x
+                    poseX=ego_posx
+                    #poseX=ego_posx-88.96626338170609
+                    ego_posy=msg.pose.position.y
+                    poseY=ego_posy
+                    #poseY=ego_posy-40.553671177476645 
+                    poseZ=msg.pose.position.z
+                    orientationX=msg.pose.orientation.x
+                    orientationY=msg.pose.orientation.y
+                    orientationZ=msg.pose.orientation.z
+                    orientationW=msg.pose.orientation.w
+                    egoyaw=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
+                    
+                    if poseX!=0.0 and poseY!=0.0:
+                        robot_pose_lost_flag=False
+                    
+                    #message_location =[date_time,locationsimtime,framenum_ego,egoyaw,poseX,poseY,poseZ,latitude,longitude]    
+                    #print(f'date_time={date_time},  locationtime={locationsimtime}')
+                    #writer_robot_pos.writerow(message_location)
+                    #if wheel_odom_flag and cmd_vel_flag:
+                    message_EgoState =[str(t)[:-6],locationsimtime,Frame_robot_pose,poseX,poseY,poseZ,egoyaw,
+                                       speed_linear2,speed_angular2,cmd_speed_linear,cmd_speed_angular,obstacle_state,task_error_code,latitude,longitude]
+                    
+                    message_drive=[str(t)[:-6],speed_linear2,latitude,longitude,speed_angular2]
+                   
+                    writer_EgoState.writerow(message_EgoState)
+                    writer_drive.writerow(message_drive)
+                    framenum_ego+=1
+                    Frame_robot_pose+=1
+    
+            
+                if topic == "/tracking/objects":
+                    msg_l = len(msg.objects)
+                    if msg_l and (locationsimtime != ' ') and (date_time != ' '):
+                        #timestamp = rospy.Time.to_sec(t)
+                        #date_time = datetime.fromtimestamp(timestamp)
+                        #simtime=(date_time-first_message_time).total_seconds()
+                        for i in range(msg_l):
+                            obj_ID = msg.objects[i].id
+                            obj_x = msg.objects[i].pose.position.x
+                            #obj_x = msg.objects[i].pose.position.x-88.96626338170609
+                            obj_y = msg.objects[i].pose.position.y
+                            #obj_y = msg.objects[i].pose.position.y-40.553671177476645
+                            obj_z = msg.objects[i].pose.position.z
+                            obj_orientationX=msg.objects[i].pose.orientation.x
+                            obj_orientationY=msg.objects[i].pose.orientation.y
+                            obj_orientationZ=msg.objects[i].pose.orientation.z
+                            obj_orientationW=msg.objects[i].pose.orientation.w
+                            objyaw=quaternion_to_euler(obj_orientationX,obj_orientationY,obj_orientationZ,obj_orientationW)
+                            obj_lable=msg.objects[i].label
+                            obj_dimX=msg.objects[i].dimensions.x
+                            obj_dimY=msg.objects[i].dimensions.y
+                            obj_dimZ=msg.objects[i].dimensions.z
+                            velocity_linear_x=msg.objects[i].velocity.linear.x
+                            velocity_linear_y=msg.objects[i].velocity.linear.y
+                            velocity_linear_z=msg.objects[i].velocity.linear.z
+                            
+                            velocity_angular_x=msg.objects[i].velocity.angular.x
+                            velocity_angular_y=msg.objects[i].velocity.angular.y
+                            velocity_angular_z=msg.objects[i].velocity.angular.z
+                            
+                            acceleration_linear_x=msg.objects[i].acceleration.linear.x
+                            acceleration_linear_y=msg.objects[i].acceleration.linear.y
+                            acceleration_linear_z=msg.objects[i].acceleration.linear.z
+                            
+                            acceleration_angular_x=msg.objects[i].acceleration.angular.x
+                            acceleration_angular_y=msg.objects[i].acceleration.angular.y
+                            acceleration_angular_z=msg.objects[i].acceleration.angular.z
+                            
+                            message_obj =[str(t)[:-6],locationsimtime,Frame_robot_pose,obj_ID,objyaw,obj_x,obj_y,obj_z,obj_lable,obj_dimX,obj_dimY,obj_dimZ,
+                                          velocity_linear_x,velocity_linear_y,velocity_linear_z,velocity_angular_x,velocity_angular_y,
+                                          velocity_angular_z,acceleration_linear_x,acceleration_linear_y,acceleration_linear_z,
+                                          acceleration_angular_x,acceleration_angular_y,acceleration_angular_z]
+                            #print(f'{date_time},  {locationsimtime}')
+                            writer_objects.writerow(message_obj)
+                        #framenum_obj+=1 
+                if topic == "/robot/final_trajectory":
+                    PointNumber=1
+                    timestamp1 = rospy.Time.to_sec(t)
+                    date_time1 = datetime.fromtimestamp(timestamp1)
+                    locationsimtime1=(date_time1-first_message_time).total_seconds()
+                    if ego_posx!=0 or ego_posy!=0:
                         
-                        message_obj =[date_time,locationsimtime,Frame_robot_pose,obj_ID,objyaw,obj_x,obj_y,obj_z,obj_lable,obj_dimX,obj_dimY,obj_dimZ,
-                                      velocity_linear_x,velocity_linear_y,velocity_linear_z,velocity_angular_x,velocity_angular_y,
-                                      velocity_angular_z,acceleration_linear_x,acceleration_linear_y,acceleration_linear_z,
-                                      acceleration_angular_x,acceleration_angular_y,acceleration_angular_z]
-                        #print(f'{date_time},  {locationsimtime}')
-                        writer_objects.writerow(message_obj)
-                    #framenum_obj+=1 
-            if topic == "/robot/final_trajectory":
-                PointNumber=1
-                timestamp1 = rospy.Time.to_sec(t)
-                date_time1 = datetime.fromtimestamp(timestamp1)
-                locationsimtime1=(date_time1-first_message_time).total_seconds()
-                if ego_posx!=0 or ego_posy!=0:
-                    for i in range(len(msg.waypoints)):
-                        Targetx=msg.waypoints[i].pose.pose.position.x
-                        Targety=msg.waypoints[i].pose.pose.position.y
-                        Targetz=msg.waypoints[i].pose.pose.position.z
-                        orientationX=msg.waypoints[i].pose.pose.orientation.x
-                        orientationY=msg.waypoints[i].pose.pose.orientation.y
-                        orientationZ=msg.waypoints[i].pose.pose.orientation.z
-                        orientationW=msg.waypoints[i].pose.pose.orientation.w
-                        TargetH=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
-                        message_trajectory =[date_time1,locationsimtime1,simFrame,PointNumber,ego_posx,ego_posy,poseZ,egoyaw,Targetx,Targety,Targetz,TargetH]
-                        writer_trajectory.writerow(message_trajectory)
-                        PointNumber+=1
-                    simFrame+=1
+                        if msg.waypoints!=[]:#判断规划是否丢帧
+                            final_trajectorye_lost_flag=False
+                            
+                        for i in range(len(msg.waypoints)):
+                            Targetx=msg.waypoints[i].pose.pose.position.x
+                            Targety=msg.waypoints[i].pose.pose.position.y
+                            Targetz=msg.waypoints[i].pose.pose.position.z
+                            orientationX=msg.waypoints[i].pose.pose.orientation.x
+                            orientationY=msg.waypoints[i].pose.pose.orientation.y
+                            orientationZ=msg.waypoints[i].pose.pose.orientation.z
+                            orientationW=msg.waypoints[i].pose.pose.orientation.w
+                            TargetH=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
+                            message_trajectory =[date_time1,locationsimtime1,simFrame,PointNumber,ego_posx,ego_posy,poseZ,egoyaw,Targetx,Targety,Targetz,TargetH]
+                            writer_trajectory.writerow(message_trajectory)
+                            PointNumber+=1
+                        simFrame+=1
+                    
+            #robot_pos_file.close()
+            objects_file.close()
+            EgoState_file.close()
+            trajectory_file.close()
+            
+        
+        with open(json_path, "w") as file:
+            data = []
+            if pcd_exist_flag:
+                if (Theoretical_velodyne_points_num - num_velodyne_points) / Theoretical_velodyne_points_num > 0.6:
+                    data.append('点云丢帧')
+                '''
+                if (Theoretical_image_raw_num - num_image_raw) / Theoretical_image_raw_num > 0.6:
+                    data.append('图像丢帧')
+                '''
+            else:
+                data.append('点云缺失')
                 
-        robot_pos_file.close()
-        objects_file.close()
-        EgoState_file.close()
-        trajectory_file.close()
+            if robot_pose_lost_flag or gnss_lost_flag:
+                data.append('自车数据缺失')
+            if final_trajectorye_lost_flag:
+                data.append('无规划路径')
+        
+            if data == []:
+                data = ['正常']
+        
+            # 将数据转换为 JSON 格式并写入文件
+            json.dump(data, file, ensure_ascii=False)
+    except:
+        with open(json_path, "w") as file:
+            data = ['解析程序错误']
+            json.dump(data, file, ensure_ascii=False)
+
+
         
         
 
 # if __name__ == "__main__":
-#    input_dir='/media/dell/HIKSEMI/scenario_hmi._2024-11-20-02-21-25.bag'
-#    output_dir='/media/dell/HIKSEMI'
-#    #input_dir=sys.argv[1]
-#    #output_dir = sys.argv[2]
+#    #input_dir='/home/dell/下载/VD100M6-BJ-Perception2024-10-24-15-48-07.bag'
+#    #output_dir='/home/dell/下载'
+#    input_dir=sys.argv[1]
+#    output_dir = sys.argv[2]
 #    bagname=input_dir.split('/')[-1].split('.bag')[0]
 
    
@@ -234,15 +322,19 @@ def parsehancheng(input_dir, output_dir):
 #    parsehancheng(input_dir, output_dir)
 
 
+
+
 # if __name__ == '__main__':
 def parse(input_dir, output_dir):
     # input_dir='/media/dell/HIKSEMI/pji_DGNC/pjioutrobot_2024-08-21-15-12-04.bag'
     # output_dir='/media/dell/HIKSEMI/pji_DGNC'
     # input_dir=sys.argv[1]
     # output_dir = sys.argv[2]
-    bagname = input_dir.split('/')[-1].split('.bag')[0]
+   bagname=input_dir.split('/')[-1].split('.bag')[0]
+
+   
+   output_dir=os.path.join(output_dir, bagname)
+   if not os.path.exists(output_dir):
+       os.makedirs(output_dir)
+   parsehancheng(input_dir, output_dir)
 
-    output_dir = os.path.join(output_dir, bagname)
-    if not os.path.exists(output_dir):
-        os.makedirs(output_dir)
-    parsehancheng(input_dir, output_dir)

+ 273 - 181
src/python2/pjibot_patrol/resource/bagtocsv_robot.py

@@ -11,6 +11,7 @@ import numpy as np
 from datetime import datetime
 import argparse
 import pandas as pd
+import json
 
 
 def quaternion_to_euler(x, y, z, w):
@@ -32,199 +33,286 @@ def quaternion_to_euler(x, y, z, w):
 
 
 
-def parsehancheng(input_dir, output_dir):   
-    dic_trajectory = ['Time','simTime','simFrame','PointNumber','posX','posY','posZ','posH',
-    'TargetX','TargetY','TargetZ','TargetH']
-    trajectory_file = open(output_dir + "/"+"trajectory_pji.csv", 'w')
-    writer_trajectory = csv.writer(trajectory_file)
-    writer_trajectory.writerow(dic_trajectory)
+def parsehancheng(input_dir, output_dir):  
     
-    dic_EgoState = ['Time','simTime','simFrame','posX','posY','posZ','posH','speedX','speedH','cmd_speedX','cmd_speedH','obstacle','task_error_code']
+    json_path=os.path.join(output_dir,'output.json')
+    try:
+        dic_trajectory = ['Time','simTime','simFrame','PointNumber','posX','posY','posZ','posH',
+        'TargetX','TargetY','TargetZ','TargetH']
+        trajectory_file = open(output_dir + "/"+"trajectory_pji.csv", 'w')
+        writer_trajectory = csv.writer(trajectory_file)
+        writer_trajectory.writerow(dic_trajectory)
+        
+        
+        dic_EgoState = ['Time','simTime','simFrame','posX','posY','posZ','posH','speedX','speedH','cmd_speedX','cmd_speedH','obstacle','task_error_code','latitude','longitude']
+        
+        EgoState_file = open(output_dir + "/"+"ego_pji.csv", 'w')
+        
+        writer_EgoState = csv.writer(EgoState_file)
+        writer_EgoState.writerow(dic_EgoState)
+        
+        
+        dic_drive=['Time', 'Real_Speed', 'latitude', 'longitude', 'angular_velocity_z']
+        drive_file = open(output_dir + "/"+"drive.csv", 'w')
+        writer_drive = csv.writer(drive_file)
+        writer_drive.writerow(dic_drive)
+        
     
-    EgoState_file = open(output_dir + "/"+"ego_pji.csv", 'w')
+        #dic_robot_pos = ['Time','simtime','FrameID','HeadingAngle','X', 'Y' ,'Z','latitude','longitude']
+        #robot_pos_file = open(output_dir + "/"+"pos_pji.csv", 'w')
+        #writer_robot_pos = csv.writer(robot_pos_file)
+        #writer_robot_pos.writerow(dic_robot_pos)
     
-    writer_EgoState = csv.writer(EgoState_file)
-    writer_EgoState.writerow(dic_EgoState)
-
-    dic_robot_pos = ['Time','simtime','FrameID','HeadingAngle','X', 'Y' ,'Z','latitude','longitude']
-    robot_pos_file = open(output_dir + "/"+"pos_pji.csv", 'w')
-    writer_robot_pos = csv.writer(robot_pos_file)
-    writer_robot_pos.writerow(dic_robot_pos)
-
-    dic_objects = ['Time','simtime','FrameID','playerId','posH','posX', 'posY' ,'posZ','label','dimX','dimY','dimZ',
-                   'speedX','speedY','speedZ','speedH_X','speedH_Y','speedH_Z','accelX','accelY','accelZ','accelH_X','accelH_Y','accelH_Z']
-    objects_file = open(output_dir + "/"+"objects_pji.csv", 'w')
-    writer_objects = csv.writer(objects_file)
-    writer_objects.writerow(dic_objects)
-
-    frame_max=sys.maxsize
-    with rosbag.Bag(input_dir ,'r') as bag:
-        #wheel_odom_flag=False
-        #cmd_vel_flag=False
-        first_message_time = None
-        Frame_robot_pose=1
-        obstacle_state=0
-        speed_linear=0
-        speed_angular=0
-        speed_linear2=0
-        speed_angular2=0
-        cmd_speed_angular=0
-        cmd_speed_linear=0
-        first_message_time = None
-        framenum_ego = 1
-        task_error_code=0
-        #framenum_obj = 1
-        locationsimtime=' '
-        date_time=' '
-        simFrame=1
-        latitude=0
-        longitude=0
-        ego_posx,ego_posy,ego_posz,ego_posH=0,0,0,0
-        for topic,msg,t in bag.read_messages(topics=['/wheel','/obstacle_detection','/wheel_odom','/cmd_vel','/robot_pose','/tracking/objects','/nav/task_feedback_info','/robot/final_trajectory','/gnss']):   
+        dic_objects = ['Time','simTime','simFrame','playerId','posH','posX', 'posY' ,'posZ','label','dimX','dimY','dimZ',
+                       'speedX','speedY','speedZ','speedH_X','speedH_Y','speedH_Z','accelX','accelY','accelZ','accelH_X','accelH_Y','accelH_Z']
+        objects_file = open(output_dir + "/"+"objects_pji.csv", 'w')
+        writer_objects = csv.writer(objects_file)
+        writer_objects.writerow(dic_objects)
+    
+        frame_max=sys.maxsize
+        with rosbag.Bag(input_dir ,'r') as bag:
+            #wheel_odom_flag=False
+            #cmd_vel_flag=False
+            first_message_time = None
+            Frame_robot_pose=1
+            obstacle_state=0
+            speed_linear=0
+            speed_angular=0
+            speed_linear2=0
+            speed_angular2=0
+            cmd_speed_angular=0
+            cmd_speed_linear=0
+            first_message_time = None
+            framenum_ego = 1
+            task_error_code=0
+            #framenum_obj = 1
+            locationsimtime=' '
+            date_time=' '
+            simFrame=1
+            latitude=0
+            longitude=0
+            ego_posx,ego_posy,ego_posz,ego_posH=0,0,0,0
             
-            if first_message_time is None:  
-                first_message_time = t
-                first_message_time = rospy.Time.to_sec(first_message_time)
-                first_message_time = datetime.fromtimestamp(first_message_time)
-                
-            if topic == "/gnss":
-                latitude=msg.latitude/10000000
-                longitude=msg.longitude/10000000
             
-            if topic == "/obstacle_detection":
-                obstacle_state=msg.data
-                #print(msg.data)
-
+            #用来判断机器人点云/图像/规划/定位是否丢帧↓↓↓
+            #num_image_raw=0
+            #rate_image_raw=10
+            
+            num_velodyne_points=0
+            rate_velodyne_points=10
             
-            #之前的解析用的是这个话题,现在改成/wheel了
-            '''
-            if topic == "/wheel_odom": 
-                #wheel_odom_flag=True 
-                speed_linear=msg.twist.twist.linear.x*3.6
-                speed_angular=msg.twist.twist.angular.z
-            '''
+            bag_start_time = bag.get_start_time()
+            bag_end_time = bag.get_end_time()
+            duration=bag_end_time-bag_start_time
+            Theoretical_velodyne_points_num=int(duration*rate_velodyne_points)
+            #Theoretical_image_raw_num=int(duration*rate_image_raw)
+            #print(duration)   
+            robot_pose_lost_flag=True
+            final_trajectorye_lost_flag=True
+            gnss_lost_flag=True
             
+            pcd_exist_flag=False
             
-            if topic == "/wheel": 
-                #wheel_odom_flag=True 
-                speed_linear2=(msg.twist.twist.linear.x+msg.twist.twist.linear.y)*0.5*3.6
-                speed_angular2=(msg.twist.twist.linear.y-msg.twist.twist.linear.x)/0.5
-                #print('speed_linear2=',speed_linear2,'speed_angular2=',speed_angular2)
-             
-            if topic == "/cmd_vel": 
-                #cmd_vel_flag=True
-                cmd_speed_linear=msg.linear.x*3.6
-                cmd_speed_angular=msg.angular.z
+            
+            #用来判断机器人点云/图像/规划/定位是否丢帧↑↑↑
+            
+            for topic,msg,t in bag.read_messages(topics=['/wheel','/obstacle_detection','/wheel_odom','/cmd_vel','/robot_pose','/tracking/objects','/nav/task_feedback_info',
+                                                         '/robot/final_trajectory','/gnss','/image_raw','/velodyne_points']):   
                 
-            if topic == "/nav/task_feedback_info":
-                task_error_code=msg.task_error_code
+                if first_message_time is None:  
+                    first_message_time = t
+                    first_message_time = rospy.Time.to_sec(first_message_time)
+                    first_message_time = datetime.fromtimestamp(first_message_time)
                 
-            if topic == "/robot_pose":
                 
-                timestamp = rospy.Time.to_sec(t)
-                date_time = datetime.fromtimestamp(timestamp)
-                locationsimtime=(date_time-first_message_time).total_seconds()
-                ego_posx=msg.pose.position.x
-                poseX=ego_posx
-                #poseX=ego_posx-88.96626338170609
-                ego_posy=msg.pose.position.y
-                poseY=ego_posy
-                #poseY=ego_posy-40.553671177476645 
-                poseZ=msg.pose.position.z
-                orientationX=msg.pose.orientation.x
-                orientationY=msg.pose.orientation.y
-                orientationZ=msg.pose.orientation.z
-                orientationW=msg.pose.orientation.w
-                egoyaw=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
-                message_location =[date_time,locationsimtime,framenum_ego,egoyaw,poseX,poseY,poseZ,latitude,longitude]    
-                #print(f'date_time={date_time},  locationtime={locationsimtime}')
-                writer_robot_pos.writerow(message_location)
-                #if wheel_odom_flag and cmd_vel_flag:
-                message_EgoState =[date_time,locationsimtime,Frame_robot_pose,poseX,poseY,poseZ,egoyaw,
-                                   speed_linear2,speed_angular2,cmd_speed_linear,cmd_speed_angular,obstacle_state,task_error_code]
-             
-                writer_EgoState.writerow(message_EgoState)
-                framenum_ego+=1
-                Frame_robot_pose+=1
-
-        
-            if topic == "/tracking/objects":
-                msg_l = len(msg.objects)
-                if msg_l and (locationsimtime != ' ') and (date_time != ' '):
-                    #timestamp = rospy.Time.to_sec(t)
-                    #date_time = datetime.fromtimestamp(timestamp)
-                    #simtime=(date_time-first_message_time).total_seconds()
-                    for i in range(msg_l):
-                        obj_ID = msg.objects[i].id
-                        obj_x = msg.objects[i].pose.position.x
-                        #obj_x = msg.objects[i].pose.position.x-88.96626338170609
-                        obj_y = msg.objects[i].pose.position.y
-                        #obj_y = msg.objects[i].pose.position.y-40.553671177476645
-                        obj_z = msg.objects[i].pose.position.z
-                        obj_orientationX=msg.objects[i].pose.orientation.x
-                        obj_orientationY=msg.objects[i].pose.orientation.y
-                        obj_orientationZ=msg.objects[i].pose.orientation.z
-                        obj_orientationW=msg.objects[i].pose.orientation.w
-                        objyaw=quaternion_to_euler(obj_orientationX,obj_orientationY,obj_orientationZ,obj_orientationW)
-                        obj_lable=msg.objects[i].label
-                        obj_dimX=msg.objects[i].dimensions.x
-                        obj_dimY=msg.objects[i].dimensions.y
-                        obj_dimZ=msg.objects[i].dimensions.z
-                        velocity_linear_x=msg.objects[i].velocity.linear.x
-                        velocity_linear_y=msg.objects[i].velocity.linear.y
-                        velocity_linear_z=msg.objects[i].velocity.linear.z
-                        
-                        velocity_angular_x=msg.objects[i].velocity.angular.x
-                        velocity_angular_y=msg.objects[i].velocity.angular.y
-                        velocity_angular_z=msg.objects[i].velocity.angular.z
-                        
-                        acceleration_linear_x=msg.objects[i].acceleration.linear.x
-                        acceleration_linear_y=msg.objects[i].acceleration.linear.y
-                        acceleration_linear_z=msg.objects[i].acceleration.linear.z
-                        
-                        acceleration_angular_x=msg.objects[i].acceleration.angular.x
-                        acceleration_angular_y=msg.objects[i].acceleration.angular.y
-                        acceleration_angular_z=msg.objects[i].acceleration.angular.z
+                    
+                if topic == "/velodyne_points":
+                    pcd_exist_flag=True
+                    num_velodyne_points+=1
+                '''  
+                if topic == "/image_raw":
+                    num_image_raw+=1
+                '''    
+                if topic == "/gnss":
+                    latitude=msg.latitude/10000000
+                    longitude=msg.longitude/10000000
+                    gnss_lost_flag=False
+                
+                if topic == "/obstacle_detection":
+                    obstacle_state=msg.data
+                    #print(msg.data)
+    
+                
+                #之前的解析用的是这个话题,现在改成/wheel了
+                '''
+                if topic == "/wheel_odom": 
+                    #wheel_odom_flag=True 
+                    speed_linear=msg.twist.twist.linear.x*3.6
+                    speed_angular=msg.twist.twist.angular.z
+                '''
+                
+                
+                if topic == "/wheel": 
+                    #wheel_odom_flag=True 
+                    speed_linear2=(msg.twist.twist.linear.x+msg.twist.twist.linear.y)*0.5*3.6
+                    speed_angular2=(msg.twist.twist.linear.y-msg.twist.twist.linear.x)/0.5
+                    #print('speed_linear2=',speed_linear2,'speed_angular2=',speed_angular2)
+                 
+                if topic == "/cmd_vel": 
+                    #cmd_vel_flag=True
+                    cmd_speed_linear=msg.linear.x*3.6
+                    cmd_speed_angular=msg.angular.z
+                    
+                if topic == "/nav/task_feedback_info":
+                    task_error_code=msg.task_error_code
+                    
+                if topic == "/robot_pose":
+                    
+                    timestamp = rospy.Time.to_sec(t)
+                    date_time = datetime.fromtimestamp(timestamp)
+                    locationsimtime=(date_time-first_message_time).total_seconds()
+                    ego_posx=msg.pose.position.x
+                    poseX=ego_posx
+                    #poseX=ego_posx-88.96626338170609
+                    ego_posy=msg.pose.position.y
+                    poseY=ego_posy
+                    #poseY=ego_posy-40.553671177476645 
+                    poseZ=msg.pose.position.z
+                    orientationX=msg.pose.orientation.x
+                    orientationY=msg.pose.orientation.y
+                    orientationZ=msg.pose.orientation.z
+                    orientationW=msg.pose.orientation.w
+                    egoyaw=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
+                    
+                    if poseX!=0.0 and poseY!=0.0:
+                        robot_pose_lost_flag=False
+                    
+                    #message_location =[date_time,locationsimtime,framenum_ego,egoyaw,poseX,poseY,poseZ,latitude,longitude]    
+                    #print(f'date_time={date_time},  locationtime={locationsimtime}')
+                    #writer_robot_pos.writerow(message_location)
+                    #if wheel_odom_flag and cmd_vel_flag:
+                    message_EgoState =[str(t)[:-6],locationsimtime,Frame_robot_pose,poseX,poseY,poseZ,egoyaw,
+                                       speed_linear2,speed_angular2,cmd_speed_linear,cmd_speed_angular,obstacle_state,task_error_code,latitude,longitude]
+                    
+                    message_drive=[str(t)[:-6],speed_linear2,latitude,longitude,speed_angular2]
+                   
+                    writer_EgoState.writerow(message_EgoState)
+                    writer_drive.writerow(message_drive)
+                    framenum_ego+=1
+                    Frame_robot_pose+=1
+    
+            
+                if topic == "/tracking/objects":
+                    msg_l = len(msg.objects)
+                    if msg_l and (locationsimtime != ' ') and (date_time != ' '):
+                        #timestamp = rospy.Time.to_sec(t)
+                        #date_time = datetime.fromtimestamp(timestamp)
+                        #simtime=(date_time-first_message_time).total_seconds()
+                        for i in range(msg_l):
+                            obj_ID = msg.objects[i].id
+                            obj_x = msg.objects[i].pose.position.x
+                            #obj_x = msg.objects[i].pose.position.x-88.96626338170609
+                            obj_y = msg.objects[i].pose.position.y
+                            #obj_y = msg.objects[i].pose.position.y-40.553671177476645
+                            obj_z = msg.objects[i].pose.position.z
+                            obj_orientationX=msg.objects[i].pose.orientation.x
+                            obj_orientationY=msg.objects[i].pose.orientation.y
+                            obj_orientationZ=msg.objects[i].pose.orientation.z
+                            obj_orientationW=msg.objects[i].pose.orientation.w
+                            objyaw=quaternion_to_euler(obj_orientationX,obj_orientationY,obj_orientationZ,obj_orientationW)
+                            obj_lable=msg.objects[i].label
+                            obj_dimX=msg.objects[i].dimensions.x
+                            obj_dimY=msg.objects[i].dimensions.y
+                            obj_dimZ=msg.objects[i].dimensions.z
+                            velocity_linear_x=msg.objects[i].velocity.linear.x
+                            velocity_linear_y=msg.objects[i].velocity.linear.y
+                            velocity_linear_z=msg.objects[i].velocity.linear.z
+                            
+                            velocity_angular_x=msg.objects[i].velocity.angular.x
+                            velocity_angular_y=msg.objects[i].velocity.angular.y
+                            velocity_angular_z=msg.objects[i].velocity.angular.z
+                            
+                            acceleration_linear_x=msg.objects[i].acceleration.linear.x
+                            acceleration_linear_y=msg.objects[i].acceleration.linear.y
+                            acceleration_linear_z=msg.objects[i].acceleration.linear.z
+                            
+                            acceleration_angular_x=msg.objects[i].acceleration.angular.x
+                            acceleration_angular_y=msg.objects[i].acceleration.angular.y
+                            acceleration_angular_z=msg.objects[i].acceleration.angular.z
+                            
+                            message_obj =[str(t)[:-6],locationsimtime,Frame_robot_pose,obj_ID,objyaw,obj_x,obj_y,obj_z,obj_lable,obj_dimX,obj_dimY,obj_dimZ,
+                                          velocity_linear_x,velocity_linear_y,velocity_linear_z,velocity_angular_x,velocity_angular_y,
+                                          velocity_angular_z,acceleration_linear_x,acceleration_linear_y,acceleration_linear_z,
+                                          acceleration_angular_x,acceleration_angular_y,acceleration_angular_z]
+                            #print(f'{date_time},  {locationsimtime}')
+                            writer_objects.writerow(message_obj)
+                        #framenum_obj+=1 
+                if topic == "/robot/final_trajectory":
+                    PointNumber=1
+                    timestamp1 = rospy.Time.to_sec(t)
+                    date_time1 = datetime.fromtimestamp(timestamp1)
+                    locationsimtime1=(date_time1-first_message_time).total_seconds()
+                    if ego_posx!=0 or ego_posy!=0:
                         
-                        message_obj =[date_time,locationsimtime,Frame_robot_pose,obj_ID,objyaw,obj_x,obj_y,obj_z,obj_lable,obj_dimX,obj_dimY,obj_dimZ,
-                                      velocity_linear_x,velocity_linear_y,velocity_linear_z,velocity_angular_x,velocity_angular_y,
-                                      velocity_angular_z,acceleration_linear_x,acceleration_linear_y,acceleration_linear_z,
-                                      acceleration_angular_x,acceleration_angular_y,acceleration_angular_z]
-                        #print(f'{date_time},  {locationsimtime}')
-                        writer_objects.writerow(message_obj)
-                    #framenum_obj+=1 
-            if topic == "/robot/final_trajectory":
-                PointNumber=1
-                timestamp1 = rospy.Time.to_sec(t)
-                date_time1 = datetime.fromtimestamp(timestamp1)
-                locationsimtime1=(date_time1-first_message_time).total_seconds()
-                if ego_posx!=0 or ego_posy!=0:
-                    for i in range(len(msg.waypoints)):
-                        Targetx=msg.waypoints[i].pose.pose.position.x
-                        Targety=msg.waypoints[i].pose.pose.position.y
-                        Targetz=msg.waypoints[i].pose.pose.position.z
-                        orientationX=msg.waypoints[i].pose.pose.orientation.x
-                        orientationY=msg.waypoints[i].pose.pose.orientation.y
-                        orientationZ=msg.waypoints[i].pose.pose.orientation.z
-                        orientationW=msg.waypoints[i].pose.pose.orientation.w
-                        TargetH=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
-                        message_trajectory =[date_time1,locationsimtime1,simFrame,PointNumber,ego_posx,ego_posy,poseZ,egoyaw,Targetx,Targety,Targetz,TargetH]
-                        writer_trajectory.writerow(message_trajectory)
-                        PointNumber+=1
-                    simFrame+=1
+                        if msg.waypoints!=[]:#判断规划是否丢帧
+                            final_trajectorye_lost_flag=False
+                            
+                        for i in range(len(msg.waypoints)):
+                            Targetx=msg.waypoints[i].pose.pose.position.x
+                            Targety=msg.waypoints[i].pose.pose.position.y
+                            Targetz=msg.waypoints[i].pose.pose.position.z
+                            orientationX=msg.waypoints[i].pose.pose.orientation.x
+                            orientationY=msg.waypoints[i].pose.pose.orientation.y
+                            orientationZ=msg.waypoints[i].pose.pose.orientation.z
+                            orientationW=msg.waypoints[i].pose.pose.orientation.w
+                            TargetH=quaternion_to_euler(orientationX,orientationY,orientationZ,orientationW)
+                            message_trajectory =[date_time1,locationsimtime1,simFrame,PointNumber,ego_posx,ego_posy,poseZ,egoyaw,Targetx,Targety,Targetz,TargetH]
+                            writer_trajectory.writerow(message_trajectory)
+                            PointNumber+=1
+                        simFrame+=1
+                    
+            #robot_pos_file.close()
+            objects_file.close()
+            EgoState_file.close()
+            trajectory_file.close()
+            
+        
+        with open(json_path, "w") as file:
+            data = []
+            if pcd_exist_flag:
+                if (Theoretical_velodyne_points_num - num_velodyne_points) / Theoretical_velodyne_points_num > 0.6:
+                    data.append('点云丢帧')
+                '''
+                if (Theoretical_image_raw_num - num_image_raw) / Theoretical_image_raw_num > 0.6:
+                    data.append('图像丢帧')
+                '''
+            else:
+                data.append('点云缺失')
                 
-        robot_pos_file.close()
-        objects_file.close()
-        EgoState_file.close()
-        trajectory_file.close()
+            if robot_pose_lost_flag or gnss_lost_flag:
+                data.append('自车数据缺失')
+            if final_trajectorye_lost_flag:
+                data.append('无规划路径')
+        
+            if data == []:
+                data = ['正常']
+        
+            # 将数据转换为 JSON 格式并写入文件
+            json.dump(data, file, ensure_ascii=False)
+    except:
+        with open(json_path, "w") as file:
+            data = ['解析程序错误']
+            json.dump(data, file, ensure_ascii=False)
+
+
         
         
 
 # if __name__ == "__main__":
-#    input_dir='/media/dell/HIKSEMI/scenario_hmi._2024-11-20-02-21-25.bag'
-#    output_dir='/media/dell/HIKSEMI'
-#    #input_dir=sys.argv[1]
-#    #output_dir = sys.argv[2]
+#    #input_dir='/home/dell/下载/VD100M6-BJ-Perception2024-10-24-15-48-07.bag'
+#    #output_dir='/home/dell/下载'
+#    input_dir=sys.argv[1]
+#    output_dir = sys.argv[2]
 #    bagname=input_dir.split('/')[-1].split('.bag')[0]
 
    
@@ -234,15 +322,19 @@ def parsehancheng(input_dir, output_dir):
 #    parsehancheng(input_dir, output_dir)
 
 
+
+
 # if __name__ == '__main__':
 def parse(input_dir, output_dir):
     # input_dir='/media/dell/HIKSEMI/pji_DGNC/pjioutrobot_2024-08-21-15-12-04.bag'
     # output_dir='/media/dell/HIKSEMI/pji_DGNC'
     # input_dir=sys.argv[1]
     # output_dir = sys.argv[2]
-    bagname = input_dir.split('/')[-1].split('.bag')[0]
+   bagname=input_dir.split('/')[-1].split('.bag')[0]
+
+   
+   output_dir=os.path.join(output_dir, bagname)
+   if not os.path.exists(output_dir):
+       os.makedirs(output_dir)
+   parsehancheng(input_dir, output_dir)
 
-    output_dir = os.path.join(output_dir, bagname)
-    if not os.path.exists(output_dir):
-        os.makedirs(output_dir)
-    parsehancheng(input_dir, output_dir)

+ 2 - 1
src/python2/pjisuv/camera-nohup.sh

@@ -5,4 +5,5 @@ if [ ! -d "./log" ]; then
 else
     echo "Directory './log' already exists."
 fi
-nohup python2 camera-pjisuv.py > log/camera.out 2>&1 &
+rm -rf log/camera-pjisuv.out log/camera-pjisuv.log log/camera.out log/camera.log
+nohup python2 camera-pjisuv.py > log/camera-pjisuv.out 2>&1 &

+ 1 - 1
src/python2/pjisuv/camera-pjisuv.py

@@ -14,7 +14,7 @@ logging.basicConfig(filename=path1 + 'log/camera-pjisuv.log', level=logging.INFO
                     format='%(asctime)s - %(levelname)s - %(message)s')
 
 key1 = 'pjisuv/'
-sleep_time = 60  # 每多少秒扫描一次
+sleep_time = 10  # 每多少秒扫描一次
 
 
 def zip_jpg_files(directory):

+ 2 - 1
src/python2/pjisuv/errorBag.json

@@ -13,5 +13,6 @@
     "pjisuv/pjisuv-013/data_parse/2024-08-06-03-10-21_ControlJump_FindTrafficLight_40/", 
     "pjisuv/pjisuv-012/data_parse/2024-08-15-01-43-24_UnknownBigTargetAhead_MultiBicycleAhead_27/", 
     "pjisuv/pjisuv-013/data_parse/2024-08-06-03-02-13_FindTrafficLight_117/", 
-    "pjisuv/pjisuv-012/data_parse/2024-07-06-14-11-05_TTC_brake_rapidaccel_23/"
+    "pjisuv/pjisuv-012/data_parse/2024-07-06-14-11-05_TTC_brake_rapidaccel_23/", 
+    "pjisuv/pjisuv-004/data_parse/mlx11291/"
 ]

+ 1 - 1
src/python2/pjisuv/merge-pjisuv.py

@@ -15,7 +15,7 @@ key1 = 'pjisuv/'
 key2 = 'data/'
 key3 = 'data_merge/'
 key4 = 'data_parse/'
-sleep_time = 60  # 每多少秒扫描一次
+sleep_time = 10  # 每多少秒扫描一次
 compress_way = Compression.BZ2
 car_list = ['pjisuv-002', 'pjisuv-005']
 

+ 1 - 0
src/python2/pjisuv/pcd-nohup.sh

@@ -5,4 +5,5 @@ if [ ! -d "./log" ]; then
 else
     echo "Directory './log' already exists."
 fi
+rm -rf log/pcd*
 nohup python2 pcd-pjisuv.py > log/pcd-pjisuv.out 2>&1 &

+ 16 - 0
src/python2/pjisuv/xosc-errorBag.json

@@ -0,0 +1,16 @@
+[
+    "pjisuv/pjisuv-012/data_parse/2024-08-15-01-44-45_UnknownBigTargetAhead_71/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-06-32_EnterTjunction_27/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-08-26_FindTrafficLight_EnterTjunction_93/", 
+    "pjisuv/pjisuv-004/data_parse/mlx11291/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-03-22_FindTrafficLight_86/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-07-56_FindTrafficLight_65/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-06-49_EnterTjunction_ControlJump_57/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-05-06_FindTrafficLight_102/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-11-26_ControlJump_20/", 
+    "pjisuv/pjisuv-012/data_parse/2024-08-15-01-43-44_UnknownBigTargetAhead_MultiBicycleAhead_65/", 
+    "pjisuv/pjisuv-012/data_parse/2024-08-15-01-44-05_UnknownBigTargetAhead_23/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-10-21_ControlJump_FindTrafficLight_40/", 
+    "pjisuv/pjisuv-012/data_parse/2024-08-15-01-43-24_UnknownBigTargetAhead_MultiBicycleAhead_27/", 
+    "pjisuv/pjisuv-013/data_parse/2024-08-06-03-02-13_FindTrafficLight_117/"
+]

+ 2 - 1
src/python2/pjisuv/xosc-nohup.sh

@@ -5,4 +5,5 @@ if [ ! -d "./log" ]; then
 else
     echo "Directory './log' already exists."
 fi
-nohup python2 xosc-pjisuv.py > log/xosc.out 2>&1 &
+rm -rf log/xosc*
+nohup python2 xosc-pjisuv.py > log/xosc-pjisuv.out 2>&1 &

+ 1 - 1
src/python2/pjisuv/xosc-pjisuv.py

@@ -12,7 +12,7 @@ logging.basicConfig(filename=path1 + 'log/xosc-pjisuv.log', level=logging.INFO,
                     format='%(asctime)s - %(levelname)s - %(message)s')
 
 key1 = 'pjisuv/'
-sleep_time = 60  # 每多少秒扫描一次
+sleep_time = 10  # 每多少秒扫描一次
 
 error_bag_json = "/mnt/disk001/dcl_data_process/src/python2/pjisuv/xosc-errorBag.json"
 

+ 94 - 40
src/python3/pjibot_outdoor/jiqiren_outdoor.py

@@ -8,13 +8,21 @@ import multiprocessing
 from pyproj import CRS, Transformer
 from scipy.spatial.transform import Rotation as R
 from scipy.signal import savgol_filter
+from datetime import datetime
 import xml.etree.ElementTree as ET
 import sys
+import re
+import json
 # 导入进程模块
 from functools import partial  # 导入偏函数
+from openx_outdoor import Scenario, formatThree, formatTwo, change_CDATA
 import warnings
 warnings.filterwarnings("ignore")
-from openx_outdoor import Scenario, formatThree, formatTwo, change_CDATA
+
+
+xodr_list = ['/home/hancheng/maps/taiheqiao_map/thq_1116.xodr', '/home/hancheng/maps/anqing/anqing.xodr']
+map_engine = '/media/hancheng/Simulation5/pujin/a.out'
+
 
 class Batchrun:
     def __init__(self, path, keyFileName):
@@ -57,9 +65,12 @@ class Batchrun:
 
         # 读取自车数据
         posObs = os.path.join(absPath, 'objects_pji.csv')  # 用来生成场景中障碍物的路径
-        posEgo = os.path.join(absPath, "pos_pji.csv")
+        posEgo = os.path.join(absPath, "ego_pji.csv")
         posdata_obs = pd.read_csv(posObs)
         posdata_ego = pd.read_csv(posEgo)
+        timestamp_s = posdata_ego['Time'].iloc[0] / 1000
+        dt_object = datetime.fromtimestamp(timestamp_s)
+        hour = dt_object.hour - 8
         posdata_obs = posdata_obs.drop('Time', axis=1)
         posdata_ego = posdata_ego.drop('Time', axis=1)
         posdata_obs.rename(columns={'posX': 'pos_x'}, inplace=True)
@@ -67,8 +78,29 @@ class Batchrun:
         posdata_obs.rename(columns={'posH': 'HeadingAngle'}, inplace=True)
         posdata_obs.rename(columns={'speedX': 'AbsVel'}, inplace=True)
         posdata_obs.rename(columns={'playerId': 'ID'}, inplace=True)
-        posdata_ego.rename(columns={'X': 'pos_x'}, inplace=True)
-        posdata_ego.rename(columns={'Y': 'pos_y'}, inplace=True)
+        posdata_ego.rename(columns={'posX': 'pos_x'}, inplace=True)
+        posdata_ego.rename(columns={'posY': 'pos_y'}, inplace=True)
+        posdata_ego.rename(columns={'posH': 'HeadingAngle'}, inplace=True)
+
+        def get_road_info(command):
+            # 使用 subprocess.run 运行命令
+            result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
+
+            # 获取命令的输出
+            output = result.stdout if result.stdout else result.stderr
+            if output == "not found\n":
+                return "不在道路范围"
+            # 使用正则表达式提取数字
+            track_match = re.search(r'track\s*=\s*(-?\d+)', output)
+            lane_match = re.search(r'lane\s*=\s*(-?\d+)', output)
+            offset_match = re.search(r'offset\s*=\s*(-?\d+\.?\d*)', output)
+            h_match = re.search(r'h\s*=\s*(-?\d+\.?\d*)', output)
+            # 如果匹配成功,提取对应的值
+            track_id = int(track_match.group(1)) if track_match else None
+            lane_id = int(lane_match.group(1)) if lane_match else None
+            offset = float(offset_match.group(1)) if offset_match else None
+            h_value = float(h_match.group(1)) if h_match else None
+            return track_id, lane_id, offset, h_value
 
         def get_map_id(df):
             # 太和桥园区经纬度
@@ -117,10 +149,32 @@ class Batchrun:
 
         map_id = get_map_id(posdata_ego)
         # map_id = 0
-        posdata_obs = trans_pos(posdata_obs, map_id)
         posdata_ego = trans_pos(posdata_ego, map_id)
-        posdata_obs['simtime'] = np.round(posdata_obs['simtime'], decimals=1)
-        posdata_ego['simtime'] = np.round(posdata_ego['simtime'], decimals=1)
+        ego_init_x = posdata_ego['pos_x'].iloc[0]
+        ego_init_y = posdata_ego['pos_y'].iloc[0]
+        # 检查自车起始位置是否在地图外,如果在地图外抛出错误信息
+        command = [
+            map_engine,
+            xodr_list[map_id],
+            f'{ego_init_x}',
+            f'{ego_init_y}'
+        ]
+        if get_road_info(command) == "不在道路范围":
+            # 定义日志文件路径
+            log_file_path = os.path.join(absPath, "output.json")  # 日志文件存储在 rootPath 下
+
+            # 写入错误信息数组
+            error_message = ["不在道路范围"]
+            with open(log_file_path, "w") as log_file:
+                json.dump(error_message, log_file, ensure_ascii=False)  # 使用 json.dump 写入数组格式
+
+            print(f"自车位置不在道路范围,已记录到 {log_file_path}")
+
+            # 终止程序运行
+            sys.exit()
+
+        posdata_obs['simTime'] = np.round(posdata_obs['simTime'], decimals=1)
+        posdata_ego['simTime'] = np.round(posdata_ego['simTime'], decimals=1)
 
         # 对障碍物数据进行处理
         def filter_rows(group):
@@ -133,26 +187,28 @@ class Batchrun:
             return group
 
         def interpolate_missing_values(df):
-            # 1. 生成一个完整的以0.1秒为间隔的simtime
-            new_simtime = np.arange(df['simtime'].min(), df['simtime'].max() + 0.1, 0.1)
+            # 1. 生成一个完整的以0.1秒为间隔的simTime
+            new_simTime = np.arange(df['simTime'].min(), df['simTime'].max() + 0.1, 0.1)
 
             # 2. 创建新的DataFrame,并与原始DataFrame对齐
-            new_df = pd.DataFrame(new_simtime, columns=['simtime'])
-            new_df['simtime'] = np.round(new_df['simtime'], decimals=1)
-            # 3. 将原始DataFrame与新simtime进行合并
-            new_df = pd.merge(new_df, df, on='simtime', how='left')
+            new_df = pd.DataFrame(new_simTime, columns=['simTime'])
+            new_df['simTime'] = np.round(new_df['simTime'], decimals=1)
+            # 3. 将原始DataFrame与新simTime进行合并
+            new_df = pd.merge(new_df, df, on='simTime', how='left')
             # 4. 对列进行插值(线性插值)
             new_df = new_df.interpolate(method='linear')
 
             return new_df
 
-        posdata_obs = posdata_obs.groupby(['simtime', 'pos_y'], group_keys=False).apply(filter_rows)
+        posdata_obs = trans_pos(posdata_obs, map_id)
+        posdata_obs = posdata_obs.groupby(['simTime', 'pos_y'], group_keys=False).apply(filter_rows)
         posdata_obs.reset_index(drop=True, inplace=True)
+        posdata_obs['Type'] = 10
 
         # start_time_ego = posdata_ego['Time'].iloc[0]
         # posdata_ego['Time'] = posdata_ego['Time'] - start_time_ego
         # posdata_ego['Time'] = (posdata_ego['Time'] - (posdata_ego['Time'] % 100)) / 1000
-        posdata_ego = posdata_ego.drop_duplicates(subset='simtime', keep='first')
+        posdata_ego = posdata_ego.drop_duplicates(subset='simTime', keep='first')
         posdata_ego = interpolate_missing_values(posdata_ego)
         posdata_ego['Type'] = 2
         posdata_ego['ID'] = -1
@@ -165,15 +221,14 @@ class Batchrun:
             # 将负角度值转换为正值
             posdata_ego['HeadingAngle'] = posdata_ego['HeadingAngle'].apply(lambda x: x + 360 if x < 0 else x)
 
-        posdata_obs['Type'] = 10
 
         # posdata_obs['ID'] = range(len(posdata_obs))
-        posdata_obs = posdata_obs[['simtime', 'pos_x', 'pos_y', 'HeadingAngle', 'ID', 'Type', 'AbsVel']]
+        posdata_obs = posdata_obs[['simTime', 'pos_x', 'pos_y', 'HeadingAngle', 'ID', 'Type', 'AbsVel']]
         # posdata_obs['Time'] = posdata_obs['Time'].rank(method='dense') - 1
         # posdata_obs['Time'] = posdata_obs['Time'] * 1
 
         # 获取唯一时间点
-        # unique_times = posdata_obs['simtime'].unique()
+        # unique_times = posdata_obs['simTime'].unique()
         #
         # new_rows = []  # 用于存储新行的列表
         #
@@ -184,16 +239,16 @@ class Batchrun:
         #     time_diff = next_time - current_time  # 计算时间差
         #
         #     # 获取当前时间点的所有行
-        #     current_group = posdata_obs[posdata_obs['simtime'] == current_time]
+        #     current_group = posdata_obs[posdata_obs['simTime'] == current_time]
         #
         #     # 为当前组基于时间差生成新行
         #     # 时间差一半的新行
         #     half_time_diff_rows = current_group.copy()
-        #     half_time_diff_rows['simtime'] = current_time + time_diff / 2
+        #     half_time_diff_rows['simTime'] = current_time + time_diff / 2
         #
         #     # 与下一组时间相同的新行(保留其他数据不变)
         #     same_time_diff_rows = current_group.copy()
-        #     same_time_diff_rows['simtime'] = next_time
+        #     same_time_diff_rows['simTime'] = next_time
         #
         #     # 收集新行
         #     new_rows.append(half_time_diff_rows)
@@ -201,24 +256,24 @@ class Batchrun:
         #
         # # 将新行添加到原始DataFrame
         # new_rows_df = pd.concat(new_rows, ignore_index=True)
-        # posdata_obs = pd.concat([posdata_obs, new_rows_df], ignore_index=True).sort_values(by='simtime').reset_index(
+        # posdata_obs = pd.concat([posdata_obs, new_rows_df], ignore_index=True).sort_values(by='simTime').reset_index(
         #     drop=True)
 
         posdata = pd.concat([posdata_obs, posdata_ego], ignore_index=True)
-        posdata = posdata.sort_values(by='simtime')
+        posdata = posdata.sort_values(by='simTime')
 
         altitude_dict = {0: 19.27, 1: 8.48332}
         posdata['altitude'] = altitude_dict[map_id]
         posdata['AbsVel'] = 0
 
-        pos_ego = posdata.loc[posdata['ID'] == -1, ['simtime', 'pos_x', 'pos_y', 'HeadingAngle', 'altitude', 'Type']]
+        pos_ego = posdata.loc[posdata['ID'] == -1, ['simTime', 'pos_x', 'pos_y', 'HeadingAngle', 'altitude', 'Type']]
         pos_ego = pos_ego.reset_index(drop=True)
 
         # offset_x = -float(pos_ego.at[0, 'East'])  # 初始East 设为0
         # offset_y = -float(pos_ego.at[0, 'North']) # 初始North 设为0
 
-        start_time = pos_ego.at[0, 'simtime']
-        ego_points, gps_time, ego_type = Scenario.getXoscPosition(pos_ego, 'simtime', 'pos_x', 'pos_y', 'HeadingAngle',
+        start_time = pos_ego.at[0, 'simTime']
+        ego_points, gps_time, ego_type = Scenario.getXoscPosition(pos_ego, 'simTime', 'pos_x', 'pos_y', 'HeadingAngle',
                                                                   'altitude', 'Type', 0, 0, 0, start_time)
 
         # 读取目标数据
@@ -226,7 +281,7 @@ class Batchrun:
         # pos_obs = posdata[posdata['Type'] != 10]  # 排除非目标物的物体
         pos_obs['Type'].replace([103, 10], 7, inplace=True)
         pos_obs = pos_obs.loc[
-            pos_obs['ID'] != -1, ['simtime', 'ID', 'pos_x', 'pos_y', 'HeadingAngle', 'AbsVel', 'altitude', 'Type']]
+            pos_obs['ID'] != -1, ['simTime', 'ID', 'pos_x', 'pos_y', 'HeadingAngle', 'AbsVel', 'altitude', 'Type']]
         pos_obs = pos_obs.reset_index(drop=True)
 
         # def calculate_heading_angle(group):
@@ -374,7 +429,7 @@ class Batchrun:
                 continue
             # value = smooth_1(value)
             object_points.append(
-                Scenario.getXoscPosition(value, 'simtime', 'pos_x', 'pos_y', 'HeadingAngle', 'altitude', 'Type', 0, 0, 0,
+                Scenario.getXoscPosition(value, 'simTime', 'pos_x', 'pos_y', 'HeadingAngle', 'altitude', 'Type', 0, 0, 0,
                                          start_time))
             # object_points.append(Scenario.getXoscPosition(value, 'Time', 'position_x', 'position_y', 'HeadingAngle', 'type', offset_x, offset_y, offset_h,start_time))
 
@@ -382,15 +437,14 @@ class Batchrun:
         period = math.ceil(gps_time[-1] - gps_time[0])
         work_mode = 0  # 0为CICV车端数据
 
-        # hour = int(absPath.split('/')[-1].split('-')[3])
-        # if hour + 8 >= 24:
-        #     hour = hour - 16
-        # else:
-        #     hour = hour + 8
-        # time_of_day = hour * 3600
-        # # 没有路灯防止天过暗
-        # if time_of_day >= 64800:
-        #     time_of_day = 64800
+        if hour + 8 >= 24:
+            hour = hour - 16
+        else:
+            hour = hour + 8
+        time_of_day = hour * 3600
+        # 没有路灯防止天过暗
+        if time_of_day >= 64800:
+            time_of_day = 64800
 
         s = Scenario(ego_points, object_points, gps_time, ego_speed, work_mode, period, absPath, 0, vehicle_type, map_id)
         filename = absPath + '/simulation'
@@ -440,7 +494,6 @@ class Batchrun:
 
         for di, absPath in enumerate(sorted(files)):
             print(absPath)
-            # try:
             self.generateScenarios_raw(absPath, param)
             # except:
             #     print('Augmentation failed!!!!')
@@ -467,13 +520,14 @@ class Batchrun:
 
 
 if __name__ == "__main__":
-    # rootPath = "/media/hancheng/Simulation5/pujin/pujin_outdoor/11_12"  # 跟车
+    # rootPath = "/media/hancheng/Simulation5/pujin/pujin_outdoor/11_22"  # 跟车
     # vehicle_type = "0"
     rootPath = sys.argv[1]
     vehicle_type = sys.argv[2]
     # 生成场景
-    a = Batchrun(rootPath, "pos_pji.csv")
+    a = Batchrun(rootPath, "ego_pji.csv")
     a.batchRun(rootPath, vehicle_type)  # 0为占位参数
+
     # a.multiRun(rootPath, 0)
 
     # 生成视频

+ 7 - 6
src/python3/pjisuv/simulation_hmi.py

@@ -203,16 +203,17 @@ class Batchrun:
         ego_speed = 5
         period = math.ceil(gps_time[-1] - gps_time[0])
         work_mode = 0  # 0为CICV车端数据
-        hour = int(absPath.split('/')[-1].split('-')[3])
-        #hour = 8
+
+        # 转换为可读的日期时间
+        timestamp_s = pos_ego['Time'].iloc[0] / 1000
+        dt_object = datetime.fromtimestamp(timestamp_s)
+        hour = dt_object.hour - 8
         if hour + 8 >= 24:
             hour = hour - 16
         else:
             hour = hour + 8
         time_of_day = hour * 3600
-        # 没有路灯防止天过暗
-        if time_of_day >= 64800:
-            time_of_day = 64800
+
         s = Scenario(ego_points, object_points, gps_time, ego_speed, work_mode, period, absPath, time_of_day)
         filename = absPath + '/simulation' + '_' + param.split("_")[1].split(".")[0]
         files = s.generate(filename)
@@ -284,7 +285,7 @@ class Batchrun:
 
 
 if __name__ == "__main__":
-    #rootPath = "/media/hancheng/Simulation5/question_sce/question_1"  # 跟车
+    # rootPath = "/media/hancheng/Simulation5/pujin/pujin_util"  # 跟车
     rootPath = sys.argv[1]  # 跟车
     # 生成场景
     a = Batchrun(rootPath, "pos_orig.csv")