LingxinMeng 9 månader sedan
förälder
incheckning
1879bd0620

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

@@ -0,0 +1,2 @@
+#!/bin/bash
+ps aux | grep 'python2 camera.py' | grep -v grep | awk '{print $2}' | xargs kill -9

+ 3 - 0
src/python2/pjibot_delivery/camera-nohup.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+mkdir ./log
+nohup python2 camera.py > log/camera.out 2>&1 &

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

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

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

@@ -0,0 +1,102 @@
+# -*- 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/camera.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)
+        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')
+    # 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')
+
+    turn = 1
+    while True:
+        logging.info("当前轮次: %s" % str(turn))
+        turn += 1
+        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))
+
+                    local_delete_list.append(local_merged_bag_path)
+                    # 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))

+ 73 - 0
src/python2/pjibot_delivery/resource/parse_robot_image.py

@@ -0,0 +1,73 @@
+# coding: utf-8
+# !/usr/bin/env python2
+
+import sys
+
+import os
+import rospy
+import rosbag
+import csv
+import cv2
+from cv_bridge import CvBridge, CvBridgeError
+import argparse
+import struct
+import subprocess
+from subprocess import Popen, PIPE
+
+bridge = CvBridge()
+
+
+def parsebag(f, output_dir, target_topic):
+    rosbag_name = f.split("/")[-1].split(".")[0]
+    output_path = os.path.join(output_dir, rosbag_name)
+    camera_exist_flag = False
+
+    with rosbag.Bag(f, 'r') as bag:
+        count = 0
+        start_time = bag.get_start_time()
+        end_time = bag.get_end_time()
+        duration = end_time - start_time
+        print('duration', duration)
+        topics = bag.get_type_and_topic_info()[1].keys()
+        if target_topic in topics:
+            for topic, msg, t in bag.read_messages(topics=[target_topic]):
+                camera_exist_flag = True
+                img = bridge.imgmsg_to_cv2(msg, 'bgr8')
+                img_resized = cv2.resize(img, (1920, 1080))
+                # img = bridge.compressed_imgmsg_to_cv2(msg, 'bgr8')
+                timestr = msg.header.stamp.to_nsec()
+                image_name = str(timestr) + ".jpg"
+                if not os.path.exists(output_path + '_' + 'image'):
+                    os.makedirs(output_path + '_' + 'image')
+                output_path_img = os.path.join(output_path + '_' + 'image', image_name)
+                cv2.imwrite(output_path_img, img_resized)
+                # print(count)
+                count = count + 1
+
+    return count, duration, camera_exist_flag
+
+
+def parse(input_dir, output_dir):
+    # input_dir=sys.argv[1]
+    # output_dir = sys.argv[2]
+    topic = '/image_raw'  # /camera/color/image_raw
+
+    num_count, duration, flag = parsebag(input_dir, output_dir, topic)
+
+    if flag:
+        dirt = os.path.join(output_dir, input_dir.split('/')[-1].split('.')[0] + '_' + 'image')
+        bagtime = duration
+        hz = str(float(num_count) / bagtime)
+        print('bagtime=', bagtime)
+        print('num_count=', num_count)
+
+        command = ['ffmpeg', '-f', 'image2', '-r', hz, '-pattern_type', 'glob', '-i'] + [dirt + '/*.jpg'] + ['-tag:v',
+                                                                                                             'avc1',
+                                                                                                             '-y'] + [
+                      dirt + '/camera.mp4']
+        p = Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        p.communicate()
+        print('done')
+        return flag, dirt
+    else:
+        return flag, ''