LingxinMeng 7 mesiacov pred
rodič
commit
0aba772578

+ 8 - 0
src/python2/pjibot_delivery/2callback-nohup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ ! -d "./log" ]; then
+    mkdir "./log"
+    echo "Directory './log' created."
+else
+    echo "Directory './log' already exists."
+fi
+nohup python2 2callback-pjibot_delivery.py > log/2callback.out 2>&1 &

+ 150 - 0
src/python2/pjibot_delivery/2callback-pjibot_delivery.py

@@ -0,0 +1,150 @@
+# -*- coding: utf-8 -*-
+import json
+import time
+import urllib2
+import oss2
+from datetime import datetime, timedelta
+
+import logging
+
+path1 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/'
+
+logging.basicConfig(filename=path1 + 'log/2callback.log', level=logging.INFO,
+                    format='%(asctime)s - %(levelname)s - %(message)s')
+
+key1 = 'pjibot_delivery/'
+key2 = 'data/'
+key3 = 'data_merge/'
+key4 = 'data_parse/'
+path2 = 'data/'
+path3 = 'data_merge/'
+path4 = 'data_parse/'
+url1_private = "http://10.14.86.147:9081/device/auth"
+url2_private = "http://10.14.86.147:9081/device/data/callback"
+
+
+def add_hour(date_string, hour_number):
+    original_date = datetime.strptime(date_string, "%Y-%m-%d-%H-%M-%S")
+    new_date = original_date + timedelta(hours=hour_number)
+    return new_date.strftime("%Y-%m-%d-%H-%M-%S")
+
+if __name__ == '__main__':
+    auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
+    endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
+    bucket_name = 'open-bucket'
+    bucket = oss2.Bucket(auth, endpoint, bucket_name)
+    while True:
+        logging.info("开始新一轮扫描")
+        try:
+            local_delete_list = []
+            oss_delete_list = []
+            upload_completed_prefix_list = []
+            # 4 获取即将被合并的bag目录
+            for obj1 in oss2.ObjectIterator(bucket, prefix=key1):
+                try:
+                    if 'callback.json' in str(obj1.key):
+                        prefix = '/'.join(str(obj1.key).split('/')[:-1])
+
+                        file1 = False
+                        file2 = False
+                        file3 = False
+                        file4 = False
+                        file5 = False
+                        file7 = False
+                        file8 = False
+                        file9 = False
+                        for obj2 in oss2.ObjectIterator(bucket, prefix=prefix):
+                            if '/callback.json' in str(obj2.key):
+                                file1 = True
+                            if '/ego_pji.csv' in str(obj2.key):
+                                file2 = True
+                            if '/objects_pji.csv' in str(obj2.key):
+                                file3 = 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):
+                                file7 = True
+                            if '/simulation.xosc' or '/scenario.xosc' in str(obj2.key):
+                                file8 = True
+                            if '/trajectory_pji.csv' in str(obj2.key):
+                                file9 = True
+                        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", str(obj1.key))
+                        # 1 获取json内容
+                        json_content = bucket.get_object(str(obj1.key)).read()
+                        # 2 获取token
+                        json_object = json.loads(json_content)
+                        data1 = {
+                            "equipmentNo": json_object['equipmentNo'],
+                            "secretKey": json_object['secretKey']
+                        }
+                        json_data1 = json.dumps(data1)
+                        logging.info("授权接口请求中: %s" % url1_private)
+                        logging.info("授权发送参数为: %s" % str(data1))
+                        request1 = urllib2.Request(url1_private, json_data1,
+                                                   headers={'Content-Type': 'application/json'})
+                        response1 = urllib2.urlopen(request1)
+                        result_json1 = response1.read()
+                        result_object1 = json.loads(result_json1)
+                        logging.info("授权接口请求结果为: %s", result_object1)
+                        access_token = result_object1.get('data').get('accessToken')
+                        # 要发送的JSON参数
+                        try:
+                            # logging.info("bag文件为: %s", json_object['rosBagPath'])
+                            old_date = json_object['dataName']
+                            data_size = bucket.get_object_meta(json_object['rosBagPath']).content_length
+                            equipment_no = json_object['equipmentNo']
+                            old_file_path = json_object['filePath']
+                            old_ros_bag_path = json_object['rosBagPath']
+                            task_id = json_object['taskId']
+                            trigger_id = json_object['triggerId']
+                        except Exception as e:
+                            logging.exception("callback报错:%s", str(e))
+                            continue
+
+                        # 将时区统一(室外不需要需要加8,根据机器人终端的时区判断)
+                        # new_date = add_hour(old_date, 8)
+                        new_date = old_date
+                        old_delete_list = []
+                        for obj_old in oss2.ObjectIterator(bucket, prefix=old_file_path):
+                            old_delete_list.append(str(obj_old.key))
+                            if 'callback.json' in str(obj_old.key):
+                                bucket.copy_object(bucket_name, str(obj_old.key),
+                                                   str(obj_old.key).replace(old_date, new_date).replace('callback.json',
+                                                                                                        'callback_done.json'))
+                                bucket.delete_object(str(obj_old.key)) # 删除 callback.json
+                        # todo 时区不变也就不需要移动文件了
+                        #     else:
+                        #         bucket.copy_object(bucket_name, str(obj_old.key),
+                        #                            str(obj_old.key).replace(old_date, new_date))
+                        # bucket.copy_object(bucket_name, old_ros_bag_path, old_ros_bag_path.replace(old_date, new_date))
+                        # bucket.delete_object(old_ros_bag_path)
+                        # bucket.batch_delete_objects(old_delete_list)
+
+                        data2 = {
+                            "dataName": new_date,
+                            "dataSize": data_size,
+                            "equipmentNo": equipment_no,
+                            "filePath": old_file_path.replace(old_date, new_date),
+                            "rosBagPath": old_ros_bag_path.replace(old_date, new_date),
+                            "taskId": task_id,
+                            "triggerId": trigger_id
+                        }
+                        json_data2 = json.dumps(data2)
+                        logging.info("回调接口请求中:%s" % url2_private)
+                        request2 = urllib2.Request(url2_private, json_data2,
+                                                   headers={'Content-Type': 'application/json',
+                                                            'authorization': access_token})
+                        response2 = urllib2.urlopen(request2)
+                        result_json2 = response2.read()
+                        result_object2 = json.loads(result_json2)
+                        logging.info("回调接口请求结果为: %s", result_object2)
+                except Exception as e:
+                    logging.exception("局部异常处理: %s" % str(e))
+            time.sleep(30)
+        except Exception as e:
+            logging.exception("全局错误处理: %s" % str(e))

+ 8 - 0
src/python2/pjibot_delivery/2camera-nohup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ ! -d "./log" ]; then
+    mkdir "./log"
+    echo "Directory './log' created."
+else
+    echo "Directory './log' already exists."
+fi
+nohup python2 2camera-pjibot_delivery.py > log/2camera.out 2>&1 &

+ 99 - 0
src/python2/pjibot_delivery/2camera-pjibot_delivery.py

@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+import oss2
+
+from resource import parse_robot_image
+
+import logging
+
+path1 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/'
+
+logging.basicConfig(filename=path1 + 'log/2camera.log', level=logging.INFO,
+                    format='%(asctime)s - %(levelname)s - %(message)s')
+
+key1 = 'pjibot_delivery/'
+sleep_time = 30  # 每多少秒扫描一次
+
+
+def parse_to_mp4(merged_bag_file_path, parse_prefix1, local_parse_dir2, local_delete_list3):
+    try:
+        flag, local_mp4_dir = parse_robot_image.parse(merged_bag_file_path, local_parse_dir2 + '/camera/')
+        if flag:  # 没有话题就不生成视频了
+            mp4_file_name = 'camera'
+            local_mp4_file_path1 = local_mp4_dir + '/' + mp4_file_name + '.mp4'
+            local_delete_list3.append(local_mp4_file_path1)
+            oss_csv_object_key1 = parse_prefix1 + mp4_file_name + '.mp4'
+            bucket.put_object_from_file(oss_csv_object_key1, local_mp4_file_path1)
+            local_delete_list.append(local_merged_bag_path)
+        else:
+            # 有图像话题,解析完就删除,没有则不删除
+            logging.info("没有图像话题: %s", merged_bag_file_path)
+    except Exception as e2:
+        logging.exception("生成摄像头视频报错: %s", e2)
+
+
+# ------- 获取合并之后的bag包,解析出csv -------
+if __name__ == '__main__':
+    # 1 创建阿里云对象
+    auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
+    endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
+    bucket = oss2.Bucket(auth, endpoint, 'open-bucket')
+
+    while True:
+        logging.info("开始新一轮扫描")
+        try:
+            local_delete_list = []
+            oss_delete_list = []
+            prefix_list = []
+            # 2 获取已经上传完成的所有目录并分组
+            for obj1 in oss2.ObjectIterator(bucket, prefix=key1):
+                # 获取合并后的包
+                merged_bag_object_key = str(obj1.key)
+                # print(f'判断1{merged_bag_object_key}')
+                if 'data_merge' in str(obj1.key) and str(obj1.key).endswith('.bag'):
+                    merged_bag_object_key_split = merged_bag_object_key.split('/')
+                    merged_prefix = '/'.join(merged_bag_object_key_split[:-1])
+                    parse_prefix = merged_prefix.replace('data_merge', 'data_parse')
+                    parse_prefix_full = merged_bag_object_key.replace('data_merge', 'data_parse')[:-4] + '/'
+                    camera_done = False
+                    callback_done = False
+                    for obj2 in oss2.ObjectIterator(bucket, prefix=parse_prefix_full):
+                        if '/callback.json' in str(obj2.key):
+                            callback_done = True
+                        if '/camera.mp4' in str(obj2.key):
+                            camera_done = True
+                    if camera_done:
+                        continue
+                    if not callback_done:  # 不存在存在callback.json的就不处理了
+                        continue
+
+                    local_merged_bag_path = path1 + 'camera/' + merged_bag_object_key
+                    local_merged_dir = '/'.join(local_merged_bag_path.split('/')[:-1])
+                    local_parse_dir = local_merged_dir.replace('data_merge', 'data_parse')
+                    if not os.path.exists(local_merged_dir):
+                        os.makedirs(local_merged_dir)
+                    if not os.path.exists(local_parse_dir):
+                        os.makedirs(local_parse_dir)
+                    merged_bag_full_name = merged_bag_object_key_split[-1]
+                    merged_bag_name = merged_bag_full_name.split('.')[0]
+                    try:
+                        bucket.get_object_to_file(merged_bag_object_key, local_merged_bag_path)
+                    except Exception as e:
+                        logging.exception("下载合并后的bag包失败: %s" % str(e))
+
+                    # 2 生成 pos_orig.csv 和 pos_hmi.csv
+                    logging.info("生成视频: %s" % str(obj1.key))
+                    parse_to_mp4(local_merged_bag_path, parse_prefix_full, local_parse_dir, local_delete_list)
+
+            # 删除本地临时文件
+            if len(local_delete_list) > 0:
+                for local_delete in local_delete_list:
+                    try:
+                        os.remove(local_delete)
+                    except Exception as e:
+                        pass
+                        # logging.exception("捕获到一个异常: %s" % str(e))
+            time.sleep(sleep_time)
+        except Exception as e:
+            logging.exception("全局错误处理: %s" % str(e))

+ 8 - 0
src/python2/pjibot_delivery/2csv-nohup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ ! -d "./log" ]; then
+    mkdir "./log"
+    echo "Directory './log' created."
+else
+    echo "Directory './log' already exists."
+fi
+nohup python2 2csv-pjibot_delivery.py > log/2csv.out 2>&1 &

+ 173 - 0
src/python2/pjibot_delivery/2csv-pjibot_delivery.py

@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+import os
+import shutil
+import subprocess
+import time
+import oss2
+
+from resource import bagtocsv_robot
+
+import logging
+
+path1 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/'
+path2 = '/mnt/disk001/pdf_outdoor/run/'
+path3 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/csv/'
+logging.basicConfig(filename=path1 + 'log/2csv.log', level=logging.INFO,
+                    format='%(asctime)s - %(levelname)s - %(message)s')
+
+key1 = 'pjibot_delivery/'
+sleep_time = 30  # 每多少秒扫描一次
+
+
+def parse_csv(data_bag, parse_prefix, local_parse_dir, local_delete_list):
+    try:
+        bagtocsv_robot.parse(data_bag, local_parse_dir + '/csv/')
+        bagname = data_bag.split('/')[-1].split('.')[0]
+        local_csv_dir = os.path.join(local_parse_dir + '/csv/', bagname)  # 最终生成四个csv文件的目录
+
+        csv_file_name1 = 'trajectory_pji'
+        local_csv_file_path1 = str(local_csv_dir) + '/' + str(csv_file_name1) + '.csv'
+        oss_csv_object_key1 = parse_prefix + csv_file_name1 + '.csv'
+        bucket.put_object_from_file(oss_csv_object_key1, local_csv_file_path1)
+
+        csv_file_name2 = 'ego_pji'
+        local_csv_file_path2 = str(local_csv_dir) + '/' + str(csv_file_name2) + '.csv'
+        oss_csv_object_key2 = parse_prefix + csv_file_name2 + '.csv'
+        bucket.put_object_from_file(oss_csv_object_key2, local_csv_file_path2)
+
+        csv_file_name3 = 'pos_pji'
+        local_csv_file_path3 = str(local_csv_dir) + '/' + str(csv_file_name3) + '.csv'
+        oss_csv_object_key3 = parse_prefix + csv_file_name3 + '.csv'
+        bucket.put_object_from_file(oss_csv_object_key3, local_csv_file_path3)
+
+        csv_file_name4 = 'objects_pji'
+        local_csv_file_path4 = str(local_csv_dir) + '/' + str(csv_file_name4) + '.csv'
+        oss_csv_object_key4 = parse_prefix + csv_file_name4 + '.csv'
+        bucket.put_object_from_file(oss_csv_object_key4, local_csv_file_path4)
+
+        # 生成pdf
+        try:
+            os.chdir(path2)
+            # 构造命令
+            command1 = ['./pji_outdoor_real',
+                        os.path.join(local_csv_dir, ''),  # 注意:这里可能不需要末尾的 '/',取决于程序要求
+                        os.path.join(local_csv_dir, ''),  # 同上
+                        os.path.join(local_csv_dir, 'trajectory.png'),
+                        bagname]
+
+            # 记录调用命令的信息
+            logging.info("调用生成pdf 报告命令: %s" % ' '.join(command1))
+
+            # 使用 subprocess.Popen 执行命令
+            process = subprocess.Popen(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+            stdout, stderr = process.communicate()  # 等待命令执行完成
+
+            # 检查是否有输出或错误
+            if stdout:
+                logging.info("命令的标准输出:")
+                logging.info(stdout.decode('utf-8'))  # Python 2 中需要解码
+            if stderr:
+                logging.error("命令的错误输出:")
+                logging.error(stderr.decode('utf-8'))  # Python 2 中需要解码
+
+            # 检查命令是否成功执行
+            if process.returncode == 0:
+                logging.info("命令执行成功")
+            else:
+                logging.error("命令执行失败,退出码: %s" % process.returncode)
+
+        except OSError as e:
+            # 如果更改目录失败或命令不存在等
+            logging.error("在执行过程中发生错误: %s" % e)
+
+        oss_csv_object_key5 = parse_prefix + 'report.pdf'
+        bucket.put_object_from_file(oss_csv_object_key5, str(local_csv_dir) + '/report.pdf')
+        logging.info("pdf 报告生成并上传完成。")
+
+        # 记得删除
+        local_delete_list.append(local_csv_file_path1)
+        local_delete_list.append(local_csv_file_path2)
+        local_delete_list.append(local_csv_file_path3)
+        local_delete_list.append(local_csv_file_path4)
+        local_delete_list.append(str(local_csv_dir) + '/report.pdf')
+
+    except Exception as e2:
+        # 当出现异常时执行的代码
+        logging.exception("生成csv报错: %s", e2)
+
+
+# ------- 获取合并之后的bag包,解析出csv -------
+if __name__ == '__main__':
+    # 1 创建阿里云对象
+    auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
+    endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
+    bucket = oss2.Bucket(auth, endpoint, 'open-bucket')
+    while True:
+        logging.info("开始新一轮扫描")
+        try:
+            local_delete_list = []
+            oss_delete_list = []
+            prefix_list = []
+            # 2 获取已经上传完成的所有目录并分组
+            for obj1 in oss2.ObjectIterator(bucket, prefix=key1):
+                # 获取合并后的包
+                merged_bag_object_key = str(obj1.key)
+                # print(f'判断1{merged_bag_object_key}')
+                if 'data_merge' in str(obj1.key) and str(obj1.key).endswith('.bag'):
+                    merged_bag_object_key_split = merged_bag_object_key.split('/')
+                    merged_prefix = '/'.join(merged_bag_object_key_split[:-1])
+                    parse_prefix = merged_prefix.replace('data_merge', 'data_parse')
+                    parse_prefix_full = merged_bag_object_key.replace('data_merge', 'data_parse')[:-4] + '/'
+                    callback_undone = False
+                    csv1_done = False
+                    csv2_done = False
+                    csv3_done = False
+                    csv4_done = False
+                    pdf_done = False
+                    for obj2 in oss2.ObjectIterator(bucket, prefix=parse_prefix_full):
+                        if '/callback.json' in str(obj2.key):
+                            callback_undone = True
+                        if '/trajectory_pji.csv' in str(obj2.key):
+                            csv1_done = True
+                        if '/ego_pji.csv' in str(obj2.key):
+                            csv2_done = True
+                        if '/pos_pji.csv' in str(obj2.key):
+                            csv3_done = True
+                        if '/objects_pji.csv' in str(obj2.key):
+                            csv4_done = True
+                        if '/report.pdf' in str(obj2.key):
+                            pdf_done = True
+                    if not callback_undone:  # 没有 callback.json
+                        continue
+                    if csv1_done and csv2_done and csv3_done and csv4_done and pdf_done:
+                        continue
+
+                    logging.info("开始生成场景还原csv: %s" % str(obj1.key))
+                    local_merged_bag_path = path3 + merged_bag_object_key
+                    local_merged_dir = '/'.join(local_merged_bag_path.split('/')[:-1])
+                    local_parse_dir = local_merged_dir.replace('data_merge', 'data_parse')
+                    if not os.path.exists(local_merged_dir):
+                        os.makedirs(local_merged_dir)
+                    if not os.path.exists(local_parse_dir):
+                        os.makedirs(local_parse_dir)
+                    merged_bag_full_name = merged_bag_object_key_split[-1]
+                    merged_bag_name = merged_bag_full_name.split('.')[0]
+                    try:
+                        bucket.get_object_to_file(merged_bag_object_key, local_merged_bag_path)
+                    except Exception as e:
+                        logging.exception("下载合并后的bag包失败: %s" % str(e))
+
+                    local_delete_list.append(local_merged_bag_path)
+                    # 2 生成 pos_orig.csv 和 pos_hmi.csv
+                    parse_csv(local_merged_bag_path, parse_prefix_full, local_parse_dir, local_delete_list)
+
+            # 删除本地临时文件
+            if len(local_delete_list) > 0:
+                for local_delete in local_delete_list:
+                    try:
+                        os.remove(local_delete)
+                    except Exception as e:
+                        logging.exception("捕获到一个异常: %s" % str(e))
+        except Exception as e:
+            logging.exception("全局错误处理: %s" % str(e))
+        time.sleep(sleep_time)

+ 8 - 0
src/python2/pjibot_delivery/2pcd-nohup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ ! -d "./log" ]; then
+    mkdir "./log"
+    echo "Directory './log' created."
+else
+    echo "Directory './log' already exists."
+fi
+nohup python2 2pcd-pjibot_delivery.py > log/2pcd.out 2>&1 &

+ 90 - 0
src/python2/pjibot_delivery/2pcd-pjibot_delivery.py

@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+import oss2
+
+from resource import pcdtovideo_monitor_overlook
+
+import logging
+
+path1 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/'
+logging.basicConfig(filename=path1 + 'log/2pcd.log', level=logging.INFO,
+                    format='%(asctime)s - %(levelname)s - %(message)s')
+
+key1 = 'pjibot_delivery/'
+path1 = '/root/'
+sleep_time = 30  # 每多少秒扫描一次
+
+
+def parse_to_pcd_mp4(merged_bag_file_path, parse_prefix2, local_parse_dir, local_delete_list):
+    global bucket
+    try:
+        local_pcd_mp4_dir = pcdtovideo_monitor_overlook.parse(merged_bag_file_path, local_parse_dir + '/pcd/')
+        pcd_mp4_file_name = 'pcd_overlook'
+        local_delete_list.append(str(local_pcd_mp4_dir) + '/pcd_overlook.mp4')
+        oss_csv_object_key3 = parse_prefix2 + pcd_mp4_file_name + '.mp4'
+        bucket.put_object_from_file(oss_csv_object_key3, str(local_pcd_mp4_dir) + '/' + pcd_mp4_file_name + '.mp4')
+        logging.info("上传点云视频到: %s", oss_csv_object_key3)
+    except Exception as e:
+        logging.exception("生成点云视频报错: %s" % str(e))
+
+
+# ------- 获取合并之后的bag包,解析出csv -------
+if __name__ == '__main__':
+    # 1 创建阿里云对象
+    auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
+    endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
+    bucket = oss2.Bucket(auth, endpoint, 'open-bucket')
+    while True:
+        logging.info("开始新一轮扫描")
+        try:
+            local_delete_list = []
+            oss_delete_list = []
+            prefix_list = []
+            # 2 获取已经上传完成的所有目录并分组
+            for obj1 in oss2.ObjectIterator(bucket, prefix=key1):
+                try:
+                    # 获取合并后的包
+                    merged_bag_object_key = str(obj1.key)
+                    if 'data_merge' in str(obj1.key) and str(obj1.key).endswith('.bag'):
+                        merged_bag_object_key_split = merged_bag_object_key.split('/')
+                        merged_prefix = '/'.join(merged_bag_object_key_split[:-1])
+                        parse_prefix = merged_prefix.replace('data_merge', 'data_parse')
+                        parse_prefix_full = merged_bag_object_key.replace('data_merge', 'data_parse')[:-4] + '/'
+                        pcd_done = False
+                        callback_done = False
+                        for obj2 in oss2.ObjectIterator(bucket, prefix=parse_prefix_full):
+                            if '/callback.json' in str(obj2.key):
+                                callback_done = True
+                            if '/pcd_overlook.mp4' in str(obj2.key):
+                                pcd_done = True
+                        if not callback_done:
+                            continue
+                        if pcd_done:
+                            continue
+                        logging.info("%s 需要生成点云视频 pcd_overlook.mp4" % str(parse_prefix_full))
+                        local_merged_bag_path = path1 + 'pcd/' + merged_bag_object_key
+                        local_merged_dir = '/'.join(local_merged_bag_path.split('/')[:-1])
+                        local_parse_dir = local_merged_dir.replace('data_merge', 'data_parse')
+                        if not os.path.exists(local_merged_dir):
+                            os.makedirs(local_merged_dir)
+                        if not os.path.exists(local_parse_dir):
+                            os.makedirs(local_parse_dir)
+                        merged_bag_full_name = merged_bag_object_key_split[-1]
+                        merged_bag_name = merged_bag_full_name.split('.')[0]
+                        bucket.get_object_to_file(merged_bag_object_key, local_merged_bag_path)
+                        local_delete_list.append(local_merged_bag_path)
+                        # 2 生成 pos_orig.csv 和 pos_hmi.csv
+                        parse_to_pcd_mp4(local_merged_bag_path, parse_prefix_full, local_parse_dir, local_delete_list)
+                except Exception as e:
+                    logging.exception("报错: %s" % str(e))
+            # 删除本地临时文件
+            if len(local_delete_list) > 0:
+                for local_delete in local_delete_list:
+                    try:
+                        os.remove(local_delete)
+                    except Exception as e:
+                        logging.exception("删除本地临时文件报错: %s" % str(e))
+            time.sleep(sleep_time)
+        except Exception as e:
+            logging.exception("全局异常处理: %s" % str(e))

+ 8 - 0
src/python2/pjibot_delivery/2simulation-nohup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ ! -d "./log" ]; then
+    mkdir "./log"
+    echo "Directory './log' created."
+else
+    echo "Directory './log' already exists."
+fi
+nohup python2 2simulation-pjibot_delivery.py > log/2simulation.out 2>&1 &

+ 161 - 0
src/python2/pjibot_delivery/2simulation-pjibot_delivery.py

@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+import oss2
+import xml.etree.ElementTree as ET
+import shutil
+import docker
+import logging
+
+key1 = 'pjibot_delivery/'
+path1 = '/scenarios1/'
+path2 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/'
+xodr_src = '/mnt/disk001/simulation_outdoor/thq_20240706.xodr'
+osgb_src = '/mnt/disk001/simulation_outdoor/thq_20230710.osgb'
+# xodr = 'thq_1116.xodr'
+# osgb = 'thq_1116.opt.osgb'
+xodr = 'thq_20240706.xodr'
+osgb = 'thq_20230710.osgb'
+
+vehicle_name = 'PuJin_distribution'  # 配送 PuJin_distribution 巡检 PuJin_patrol_robot
+xoscName = 'scenario.xosc'
+logging.basicConfig(filename=path2 + 'log/2simulation.log', level=logging.INFO,
+                    format='%(asctime)s - %(levelname)s - %(message)s')
+
+sleep_time = 60  # 每多少秒扫描一次
+
+
+def move_xosc_before_simulation(root_path):
+    try:
+        xosc_path = root_path + 'scenario_orig.xosc'
+        xodr_path = root_path + xodr
+        osgb_path = root_path + osgb
+        logging.info('仿真还原需要的 xosc 路径为:%s' % xosc_path)
+        tree1 = ET.parse(xosc_path)
+
+        root1 = tree1.getroot()
+        for node0 in root1:
+            if node0.tag == 'RoadNetwork':
+                for node1 in node0:
+                    # 打印根元素的标签名
+                    if 'LogicFile' == node1.tag:
+                        shutil.copy(xodr_src, xodr_path)
+                        node1.set('filepath', xodr_path)
+                        logging.info('更新 xodr 路径为:%s' % xodr_path)
+                    if 'SceneGraphFile' == node1.tag:
+                        shutil.copy(osgb_src, osgb_path)
+                        node1.set('filepath', osgb_path)
+                        logging.info('更新 osgb 路径为:%s' % osgb_path)
+            if node0.tag == 'Entities':
+                for node1 in node0:
+                    if node1.get("name") == 'Ego':
+                        for node2 in node1:
+                            if node2.tag == 'Vehicle':
+                                node2.set('name', vehicle_name)
+        tree1.write(root_path + 'openx0.xosc')
+
+    except Exception as e:
+        logging.exception("修改xosc报错: %s" % str(e))
+
+
+def upload_simulation(parse_prefix, mp41):
+    try:
+        # 上传两次吧,对应上
+        bucket.put_object_from_file(parse_prefix + 'scenario_orig.mp4', mp41)
+        bucket.put_object_from_file(parse_prefix + 'scenario_hmi.mp4', mp41)
+        logging.info('上传仿真视频到 %s' % parse_prefix + 'scenario_orig.mp4')
+        shutil.rmtree(path1)  # 仿真完就删除
+    except Exception as e:
+        logging.exception("上传视频报错 %s" % str(e))
+
+
+def simulation(parse_prefix, mp41):
+    try:
+        os.system("docker start vtd1")
+        # 实例化Docker客户端
+        client = docker.from_env()
+        while True:
+            time.sleep(5)
+            # 获取容器列表
+            containers = client.containers.list()
+            run = False
+            # 打印容器列表
+            for container in containers:
+                if 'vtd1' == container.name:
+                    run = True
+                    break
+            if not run:
+                break
+        time.sleep(5)
+        upload_simulation(parse_prefix, mp41)
+    except Exception as e:
+        logging.exception("生成仿真视频报错 %s" % str(e))
+
+
+def is_upload_completed(bucket, prefix):
+    target_number = str(prefix).split('_')[-1][:-1]
+    count = 0
+    for obj in oss2.ObjectIterator(bucket, prefix=prefix):
+        if obj.key != prefix:
+            count += 1
+    return int(count) == int(target_number)
+
+
+# ------- 获取合并之后的bag包,解析出csv -------
+if __name__ == '__main__':
+    # 1 创建阿里云对象
+    auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
+    endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
+    bucket = oss2.Bucket(auth, endpoint, 'open-bucket')
+    while True:
+        try:
+            logging.info("开始新一轮扫描")
+            local_delete_list = []
+            oss_delete_list = []
+            prefix_list = []
+            # 2 获取已经上传完成的所有目录并分组
+            for obj1 in oss2.ObjectIterator(bucket, prefix=key1):
+                try:
+                    # 获取合并后的包
+                    merged_bag_object_key = str(obj1.key)
+                    if 'data_merge' in str(obj1.key) and str(obj1.key).endswith('.bag'):
+                        merged_bag_object_key_split = merged_bag_object_key.split('/')
+                        merged_prefix = '/'.join(merged_bag_object_key_split[:-1])
+                        parse_prefix = merged_prefix.replace('data_merge', 'data_parse')
+                        parse_prefix_full = merged_bag_object_key.replace('data_merge', 'data_parse')[:-4] + '/'
+                        xosc_done = False
+                        mp4_done = False
+                        for obj3 in oss2.ObjectIterator(bucket, prefix=str(parse_prefix_full)):
+                            if xoscName in str(obj3.key):
+                                xosc_done = True
+                            if '/scenario_orig.mp4' in str(obj3.key):
+                                mp4_done = True
+                        if not xosc_done:
+                            continue
+                        if mp4_done:
+                            continue
+                        logging.info("需要生成仿真视频: %s" % str(parse_prefix_full))
+                        parse_prefix_full = str(parse_prefix_full)
+                        local_dir_full = path1 + parse_prefix_full
+                        if not os.path.exists(local_dir_full):
+                            os.makedirs(local_dir_full)
+                        # 下载两个csv
+                        root_path1 = local_dir_full + 'orig/'
+                        if not os.path.exists(root_path1):
+                            os.makedirs(root_path1)
+                        bucket.get_object_to_file(parse_prefix_full + xoscName, root_path1 + 'scenario_orig.xosc')
+                        local_delete_list.append(root_path1 + 'scenario_orig.xosc')
+                        move_xosc_before_simulation(root_path1)
+                        simulation(parse_prefix_full, root_path1 + 'simulation.mp4')
+                except Exception as e:
+                    logging.exception("局部异常处理: %s", str(e))
+            # 删除本地临时文件
+            if len(local_delete_list) > 0:
+                for local_delete in local_delete_list:
+                    try:
+                        os.remove(local_delete)
+                    except Exception as e:
+                        pass
+            time.sleep(sleep_time)
+        except Exception as e:
+            logging.exception("全局异常处理: %s", str(e))

+ 8 - 0
src/python2/pjibot_delivery/2xosc-nohup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ ! -d "./log" ]; then
+    mkdir "./log"
+    echo "Directory './log' created."
+else
+    echo "Directory './log' already exists."
+fi
+nohup python2 2xosc-pjibot_delivery.py > log/2xosc.out 2>&1 &

+ 91 - 0
src/python2/pjibot_delivery/2xosc-pjibot_delivery.py

@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+import oss2
+import logging
+
+path1 = '/mnt/disk001/dcl_data_process/src/python2/pjibot_delivery/'
+path2 = '/mnt/disk001/dcl_data_process/src/python3/pjibot_outdoor/'
+
+logging.basicConfig(filename=path1 + 'log/2xosc.log', level=logging.INFO,
+                    format='%(asctime)s - %(levelname)s - %(message)s')
+
+key1 = 'pjibot_delivery/'
+sleep_time = 60  # 每多少秒扫描一次
+
+
+def generate_xosc(parse_prefix, local_parse_dir, local_delete_list):
+    try:
+        os.chdir(path2)
+        command2 = 'python3 jiqiren_outdoor.py ' + local_parse_dir[:-1] + ' 0'  # 配送机器人0 巡检机器人1
+        logging.info("调用命令2: %s" % str(command2))
+        os.system(command2)
+        local_xosc_path2 = local_parse_dir + 'simulation/xosc/openx_outdoor0.xosc'
+        bucket.put_object_from_file(parse_prefix + 'scenario.xosc', local_xosc_path2)
+        bucket.put_object_from_file(parse_prefix + 'scenario_hmi.xosc', local_xosc_path2)
+        logging.info("上传 simulation.xosc(scenario.xosc) 成功: %s" % str(parse_prefix + 'scenario.xosc'))
+        local_delete_list.append(local_xosc_path2)
+    except Exception as e:
+        logging.exception("生成xosc报错: %s" % str(e))
+
+
+# ------- 获取合并之后的bag包,解析出csv -------
+if __name__ == '__main__':
+    # 1 创建阿里云对象
+    auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
+    endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
+    bucket = oss2.Bucket(auth, endpoint, 'open-bucket')
+    while True:
+        try:
+            logging.info("开始新一轮扫描")
+            local_delete_list = []
+            oss_delete_list = []
+            prefix_list = []
+            # 2 获取已经上传完成的所有目录并分组
+            for obj1 in oss2.ObjectIterator(bucket, prefix=key1):
+                try:
+                    # 获取合并后的包
+                    merged_bag_object_key = str(obj1.key)
+                    if 'data_merge' in str(obj1.key) and str(obj1.key).endswith('.bag'):
+                        merged_bag_object_key_split = merged_bag_object_key.split('/')
+                        merged_prefix = '/'.join(merged_bag_object_key_split[:-1])
+                        parse_prefix = merged_prefix.replace('data_merge', 'data_parse')
+                        parse_prefix_full = merged_bag_object_key.replace('data_merge', 'data_parse')[:-4] + '/'
+                        xosc_done = False
+                        csv1_done = False
+                        csv2_done = False
+                        for obj3 in oss2.ObjectIterator(bucket, prefix=str(parse_prefix_full)):
+                            if '/simulation.xosc' in str(obj3.key) or '/scenario.xosc' in str(obj3.key):
+                                xosc_done = True
+                            if '/objects_pji.csv' in str(obj3.key):
+                                csv1_done = True
+                            if '/pos_pji.csv' in str(obj3.key):
+                                csv2_done = True
+                        if xosc_done:
+                            logging.info("存在 simulation.xosc(scenario.xosc): %s" % str(parse_prefix_full))
+                            continue
+                        if not csv1_done:
+                            logging.info("不存在 /objects_pji.csv: %s" % str(parse_prefix_full))
+                            continue
+                        if not csv2_done:
+                            logging.info("不存在 /pos_pji.csv: %s" % str(parse_prefix_full))
+                            continue
+                        logging.info("需要生成 simulation.xosc: %s" % str(parse_prefix_full))
+                        local_dir_full = path1 + parse_prefix_full
+                        if not os.path.exists(local_dir_full):
+                            os.makedirs(local_dir_full)
+                        bucket.get_object_to_file(parse_prefix_full + 'objects_pji.csv', local_dir_full + 'objects_pji.csv')
+                        bucket.get_object_to_file(parse_prefix_full+'pos_pji.csv', local_dir_full+'pos_pji.csv')
+                        generate_xosc(parse_prefix_full, local_dir_full, local_delete_list)
+                except Exception as e:
+                    logging.exception("局部异常处理: %s", str(e))
+            # 删除本地临时文件
+            if len(local_delete_list) > 0:
+                for local_delete in local_delete_list:
+                    try:
+                        os.remove(local_delete)
+                    except Exception as e:
+                        logging.exception("删除本地临时文件报错: %s" % str(e))
+            time.sleep(sleep_time)
+        except Exception as e:
+            logging.exception("全局异常处理: %s", str(e))

+ 0 - 7
src/python2/pjibot_delivery/callback-pjibot_delivery.py

@@ -29,13 +29,6 @@ def add_hour(date_string, hour_number):
     return new_date.strftime("%Y-%m-%d-%H-%M-%S")
 
 
-'''
-cname:http://open-bucket.oss.icvdc.com
-内网endpoint: oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com
-oss桶名: open-bucket
-keyid:n8glvFGS25MrLY7j
-secret:xZ2Fozoarpfw0z28FUhtg8cu0yDc5d
-'''
 if __name__ == '__main__':
     auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
     endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'

+ 0 - 2
src/python2/pjibot_delivery/callback-tail.sh

@@ -1,2 +0,0 @@
-#!/bin/bash
-tail -f log/callback.log

+ 0 - 2
src/python2/pjibot_delivery/camera-pjibot_delivery.py

@@ -37,8 +37,6 @@ def parse_to_mp4(merged_bag_file_path, parse_prefix1, local_parse_dir2, local_de
 if __name__ == '__main__':
     # 1 创建阿里云对象
     auth = oss2.Auth('n8glvFGS25MrLY7j', 'xZ2Fozoarpfw0z28FUhtg8cu0yDc5d')
-    # cname = 'http://open-bucket.oss.icvdc.com'
-    # bucket = oss2.Bucket(auth, cname, 'open-bucket', is_cname=True)
     endpoint = 'oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com'
     bucket = oss2.Bucket(auth, endpoint, 'pji-bucket1')
 

+ 0 - 2
src/python2/pjibot_delivery/camera-tail.sh

@@ -1,2 +0,0 @@
-#!/bin/bash
-tail -f log/camera.log

+ 0 - 2
src/python2/pjibot_delivery/pcd-tail.sh

@@ -1,2 +0,0 @@
-#!/bin/bash
-tail -f log/pcd.log

+ 0 - 2
src/python2/pjibot_delivery/simulation-tail.sh

@@ -1,2 +0,0 @@
-#!/bin/bash
-tail -f log/simulation.log

+ 0 - 2
src/python2/pjibot_delivery/xosc-tail.sh

@@ -1,2 +0,0 @@
-#!/bin/bash
-tail -f log/xosc.log