上传文件至 /
This commit is contained in:
parent
eab09e5498
commit
705ff60827
131
SensorDetector.py
Normal file
131
SensorDetector.py
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
import serial
|
||||||
|
import serial.tools.list_ports
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import struct
|
||||||
|
import threading
|
||||||
|
import json
|
||||||
|
|
||||||
|
class SensorDetector:
|
||||||
|
def __init__(self, log_path, sensor_configs):
|
||||||
|
"""
|
||||||
|
初始化方法,支持多传感器配置
|
||||||
|
:param log_path: 日志路径
|
||||||
|
:param sensor_configs: 传感器配置列表,格式如[{"port": "COM6", "id": "X11223366S_1"}, {"port": "COM7", "id": "X11223366S_2"}]
|
||||||
|
"""
|
||||||
|
self.log_path = log_path
|
||||||
|
self.sensor_configs = sensor_configs # 新增:多传感器配置
|
||||||
|
self.serials = {} # 新增:存储多个串口连接
|
||||||
|
self.data3 = []
|
||||||
|
self.latest_data = {} # 新增:存储每个传感器的最新数据
|
||||||
|
self.running = True # 新增:轮询控制标志
|
||||||
|
|
||||||
|
# 确保日志目录存在
|
||||||
|
import os
|
||||||
|
if not os.path.exists(self.log_path):
|
||||||
|
os.makedirs(self.log_path)
|
||||||
|
|
||||||
|
def _open_serial_port(self, port, baudrate=38400, timeout=1):
|
||||||
|
"""修改:支持指定端口打开串口"""
|
||||||
|
try:
|
||||||
|
ser = serial.Serial(port=port, baudrate=baudrate, timeout=timeout)
|
||||||
|
if ser.isOpen():
|
||||||
|
print(f"Successfully open serial port {port}")
|
||||||
|
return ser
|
||||||
|
else:
|
||||||
|
print(f"Failure to open serial port {port}")
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
with open(f"{self.log_path}/Exception_log.txt", "a") as f:
|
||||||
|
f.write(f"{now} open serial port {port} error:{e}\n")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _send_command(self, ser, data):
|
||||||
|
"""修改:接受串口对象作为参数"""
|
||||||
|
try:
|
||||||
|
send_data = struct.pack("%dB" % (len(data)), *data)
|
||||||
|
ser.write(send_data)
|
||||||
|
except Exception as e:
|
||||||
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
with open(f"{self.log_path}/Exception_log.txt", "a") as f:
|
||||||
|
f.write(f"{now} send command error:{e}\n")
|
||||||
|
|
||||||
|
def _sensor_worker(self, sensor_id, port, callback):
|
||||||
|
"""新增:单个传感器的工作线程"""
|
||||||
|
ser = self._open_serial_port(port)
|
||||||
|
if not ser:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.serials[sensor_id] = ser
|
||||||
|
# 发送启动指令
|
||||||
|
self._send_command(ser, [0x8A])
|
||||||
|
|
||||||
|
current_second_data = []
|
||||||
|
last_second = time.time()
|
||||||
|
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
count0 = ser.inWaiting()
|
||||||
|
current_time = time.time()
|
||||||
|
|
||||||
|
if count0 > 0:
|
||||||
|
read_buffer = ser.read(88)
|
||||||
|
if len(read_buffer) == 88 and read_buffer[0] == 0xff: # 增加长度校验,修复索引错误
|
||||||
|
sensor_data = {
|
||||||
|
'sensor_id': sensor_id, # 新增:标记传感器ID
|
||||||
|
'heart_rate': read_buffer[65],
|
||||||
|
'blood_oxygen': read_buffer[66],
|
||||||
|
'micro_circulation': read_buffer[67],
|
||||||
|
'fatigue_index': read_buffer[68],
|
||||||
|
'systolic_pressure': read_buffer[71],
|
||||||
|
'diastolic_pressure': read_buffer[72],
|
||||||
|
'cardiac_output': read_buffer[73]
|
||||||
|
}
|
||||||
|
current_second_data.append(sensor_data)
|
||||||
|
|
||||||
|
# 每秒回调一次数据
|
||||||
|
if current_time - last_second >= 1:
|
||||||
|
callback(current_second_data)
|
||||||
|
current_second_data = []
|
||||||
|
last_second = current_time
|
||||||
|
time.sleep(0.01) # 降低CPU占用
|
||||||
|
except Exception as e:
|
||||||
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
with open(f"{self.log_path}/Exception_log.txt", "a") as f:
|
||||||
|
f.write(f"{now} sensor {sensor_id} data reading error:{e}\n")
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
def detect_sensors(self, callback):
|
||||||
|
"""修改:启动多传感器轮询线程"""
|
||||||
|
try:
|
||||||
|
ports = list(serial.tools.list_ports.comports())
|
||||||
|
for p in ports:
|
||||||
|
print(p)
|
||||||
|
|
||||||
|
# 为每个传感器启动工作线程
|
||||||
|
threads = []
|
||||||
|
for config in self.sensor_configs:
|
||||||
|
t = threading.Thread(
|
||||||
|
target=self._sensor_worker,
|
||||||
|
args=(config["id"], config["port"], callback),
|
||||||
|
daemon=True
|
||||||
|
)
|
||||||
|
threads.append(t)
|
||||||
|
t.start()
|
||||||
|
|
||||||
|
# 保持主线程运行
|
||||||
|
while self.running:
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
with open(f"{self.log_path}/Exception_log.txt", "a") as f:
|
||||||
|
f.write(f"{now} overall sensor detection error:{e}\n")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
"""新增:停止所有传感器线程"""
|
||||||
|
self.running = False
|
||||||
|
for ser in self.serials.values():
|
||||||
|
if ser and ser.isOpen():
|
||||||
|
ser.close()
|
||||||
44
kk_mian.py
Normal file
44
kk_mian.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import serial
|
||||||
|
import serial.tools.list_ports
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import struct
|
||||||
|
import threading
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
import json
|
||||||
|
from SensorDetector import SensorDetector
|
||||||
|
import sys
|
||||||
|
sys.path.append('../../net')
|
||||||
|
from mqtt_proxy import MQTTPublisher
|
||||||
|
|
||||||
|
# MQTT配置
|
||||||
|
MQTT_BROKER = "60.204.151.68"
|
||||||
|
MQTT_PORT = 1883
|
||||||
|
mqtt_topic = "senser_MKS_data"
|
||||||
|
|
||||||
|
mqtt_publisher = MQTTPublisher(MQTT_BROKER, MQTT_PORT, mqtt_topic)
|
||||||
|
mqtt_publisher.connect()
|
||||||
|
|
||||||
|
def handle_sensor_data(data_list):
|
||||||
|
"""处理所有传感器的每秒数据"""
|
||||||
|
global mqtt_publisher
|
||||||
|
for data in data_list:
|
||||||
|
print("handle_sensor_data:", data)
|
||||||
|
if data["heart_rate"] == 0:
|
||||||
|
continue
|
||||||
|
json_str = json.dumps(data, ensure_ascii=False, indent=2)
|
||||||
|
print("发布成功,mqtt消息")
|
||||||
|
mqtt_publisher.publish(json_str)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
log_path = "./log_pip6/"
|
||||||
|
sensor_configs = [
|
||||||
|
{"port": "COM6", "id": "X11223366S_1"},
|
||||||
|
{"port": "COM7", "id": "X11223366S_2"}
|
||||||
|
]
|
||||||
|
detector = SensorDetector(log_path, sensor_configs)
|
||||||
|
try:
|
||||||
|
detector.detect_sensors(handle_sensor_data)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("用户中断,停止传感器检测")
|
||||||
|
detector.stop()
|
||||||
156
kk_mysql_save_api.py
Normal file
156
kk_mysql_save_api.py
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def save_mysql_data(sensor_id,json_data,save_path):
|
||||||
|
|
||||||
|
url = "http://47.106.222.181:25081/algorithm/oxygen/result/data_post"
|
||||||
|
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
payload = json.dumps({
|
||||||
|
"sensor_id": "X12345679S",
|
||||||
|
"raw_file_path": save_path
|
||||||
|
})
|
||||||
|
print("payload:",payload)
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
print(response.json())
|
||||||
|
|
||||||
|
def save_mysql_data_with_jpg(device_id,module_code,json_data,save_path,save_jpg_path):
|
||||||
|
|
||||||
|
url = "http://47.106.222.181:25081/algorithm/oxygen/result/data_post"
|
||||||
|
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
payload = json.dumps({
|
||||||
|
"device_id": "d100000002",
|
||||||
|
# "device_id": "d100000002", #机器人ID
|
||||||
|
"module_code": module_code, #传感器ID
|
||||||
|
"timestamp": current_time,
|
||||||
|
"confidence": 0.99,
|
||||||
|
#传感器输出结果
|
||||||
|
"result_data":json_data,
|
||||||
|
# "result_data": {
|
||||||
|
# "detection": "fall",
|
||||||
|
# "position": {
|
||||||
|
# "x": 125,
|
||||||
|
# "y": 80,
|
||||||
|
# "width": 50,
|
||||||
|
# "height": 120
|
||||||
|
# },
|
||||||
|
# "duration": 3.5
|
||||||
|
# },
|
||||||
|
#需要替换
|
||||||
|
# "raw_ref": "/storage/raw/20250814/DEV-001/camera_001.mp4"
|
||||||
|
"raw_ref": save_path,
|
||||||
|
"pic_ref":save_jpg_path
|
||||||
|
})
|
||||||
|
print("payload:",payload)
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
print(response.json())
|
||||||
|
|
||||||
|
|
||||||
|
def save_senser_mysql_data(device_id, module_code, json_data, save_path):
|
||||||
|
# def save_senser_mysql_data():
|
||||||
|
|
||||||
|
url = "http://47.106.222.181:25081/elderly/health/data"
|
||||||
|
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
payload = json.dumps({
|
||||||
|
"elderly_id": 1, # 必选,关联老人ID
|
||||||
|
"sensor_id": "X12345679S", # 必选,传感器设备ID
|
||||||
|
"module_code": module_code, # 可选,算法模块编码
|
||||||
|
# "sensor_data_path": "http://47.106.222.181:25079/sftp-images/uploads/device_info/data/device_info/d80801000058/senser_001/20250826/20250826_09/20250826_09_33_01_d80801000058_senser_001.json", # 可选,传感器原始数据存储路径
|
||||||
|
"sensor_data_path": save_path, # 可选,传感器原始数据存储路径
|
||||||
|
"algorithm_data_path": "/processed/202508/oxygen_1005_1030.json", # 可选,算法处理数据存储路径
|
||||||
|
"data_time": current_time # 可选,数据采集时间,默认当前时间
|
||||||
|
})
|
||||||
|
print("payload:", payload)
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
print(response.json())
|
||||||
|
|
||||||
|
|
||||||
|
def test_main():
|
||||||
|
start_time = time.time() # 获取开始时间
|
||||||
|
|
||||||
|
save_path = "/d100000002/X12345681S/20251101/20251101_11/20251101_11_11_11_d100000002_X12345681S.json"
|
||||||
|
json_data = {'heart_rate': 0, 'blood_oxygen': 0, 'micro_circulation': 0, 'fatigue_index': 0, 'systolic_pressure': 0, 'diastolic_pressure': 0, 'cardiac_output': 0}
|
||||||
|
|
||||||
|
save_mysql_data("X11223366S",json_data,save_path)
|
||||||
|
|
||||||
|
end_time = time.time() # 获取结束时间
|
||||||
|
|
||||||
|
# 计算耗时
|
||||||
|
duration = end_time - start_time
|
||||||
|
print(f"Function 'save_mysql_data' took {duration} seconds to execute.")
|
||||||
|
#0.668 秒
|
||||||
|
|
||||||
|
def test_main_jpg():
|
||||||
|
start_time = time.time() # 获取开始时间
|
||||||
|
|
||||||
|
json_data = {
|
||||||
|
"detection": "fall",
|
||||||
|
"position": {
|
||||||
|
"x": 125,
|
||||||
|
"y": 80,
|
||||||
|
"width": 50,
|
||||||
|
"height": 120
|
||||||
|
},
|
||||||
|
"duration": 3.5
|
||||||
|
}
|
||||||
|
|
||||||
|
save_path = "/storage/raw/20250814/DEV-001/camera_001.mp4"
|
||||||
|
save_jpg_path = "/storage/raw/20250814/DEV-001/camera_001.jpg"
|
||||||
|
|
||||||
|
save_mysql_data_with_jpg("d80801000062", "A0001", json_data, save_path, save_jpg_path)
|
||||||
|
|
||||||
|
end_time = time.time() # 获取结束时间
|
||||||
|
|
||||||
|
# 计算耗时
|
||||||
|
duration = end_time - start_time
|
||||||
|
print(f"Function 'save_mysql_data' took {duration} seconds to execute.")
|
||||||
|
#0.668 秒
|
||||||
|
|
||||||
|
def test_main_1():
|
||||||
|
start_time = time.time() # 获取开始时间
|
||||||
|
|
||||||
|
json_data = {
|
||||||
|
"detection": "fall",
|
||||||
|
"position": {
|
||||||
|
"x": 125,
|
||||||
|
"y": 80,
|
||||||
|
"width": 50,
|
||||||
|
"height": 120
|
||||||
|
},
|
||||||
|
"duration": 3.5
|
||||||
|
}
|
||||||
|
|
||||||
|
save_path = "/storage/raw/20250814/DEV-001/camera_001.mp4"
|
||||||
|
|
||||||
|
save_senser_mysql_data( "d100000002","A0001",json_data,save_path)
|
||||||
|
|
||||||
|
end_time = time.time() # 获取结束时间
|
||||||
|
|
||||||
|
# 计算耗时
|
||||||
|
duration = end_time - start_time
|
||||||
|
print(f"Function 'save_mysql_data' took {duration} seconds to execute.")
|
||||||
|
#0.668 秒
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
test_main()
|
||||||
|
# test_main_jpg()
|
||||||
|
# save_senser_mysql_data()
|
||||||
90
kk_sftp_save_api.py
Normal file
90
kk_sftp_save_api.py
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import paramiko
|
||||||
|
import os
|
||||||
|
import posixpath
|
||||||
|
|
||||||
|
def mkdir_p(sftp, remote_dir):
|
||||||
|
"""递归创建远程目录(类似 mkdir -p)"""
|
||||||
|
if remote_dir == '/':
|
||||||
|
return # 根目录假设已存在
|
||||||
|
try:
|
||||||
|
sftp.stat(remote_dir)
|
||||||
|
return
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
parent_dir = posixpath.dirname(remote_dir)
|
||||||
|
if parent_dir != '/':
|
||||||
|
mkdir_p(sftp, parent_dir)
|
||||||
|
try:
|
||||||
|
sftp.mkdir(remote_dir)
|
||||||
|
except Exception as e:
|
||||||
|
raise RuntimeError(f"创建目录失败: {remote_dir}, 错误: {str(e)}")
|
||||||
|
|
||||||
|
def sftp_upload(host, port, username, password, local_path, remote_path,file_name):
|
||||||
|
# 创建SSH对象
|
||||||
|
ssh = paramiko.SSHClient()
|
||||||
|
# 允许连接不在know_hosts文件中的主机
|
||||||
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
# 连接服务器
|
||||||
|
ssh.connect(host, port, username, password)
|
||||||
|
|
||||||
|
# 创建SFTP会话
|
||||||
|
sftp = ssh.open_sftp()
|
||||||
|
result = False
|
||||||
|
return_path = ""
|
||||||
|
try:
|
||||||
|
mkdir_p(sftp, remote_path)
|
||||||
|
# 上传文件
|
||||||
|
target_path = remote_path+"/"+file_name
|
||||||
|
sftp.put(local_path, target_path)
|
||||||
|
print(f"文件上传成功: {local_path} -> {target_path}")
|
||||||
|
result = True
|
||||||
|
return_path = target_path
|
||||||
|
|
||||||
|
finally:
|
||||||
|
# 关闭SFTP会话和SSH连接
|
||||||
|
sftp.close()
|
||||||
|
ssh.close()
|
||||||
|
return result,return_path
|
||||||
|
|
||||||
|
def sftp_upload_one_file(local_path,mkdir_remote_path,file_name):
|
||||||
|
|
||||||
|
HOSTNAME = '47.106.222.181'
|
||||||
|
PORT = 25078 # 默认SSH端口是22
|
||||||
|
USERNAME = 'user'
|
||||||
|
PASSWORD = 'password'
|
||||||
|
# local_path = '/home/cat/shuikeWorkSpace/vscode_code/2025_workspace/shuike_dev/3rdparty/rk3576_NDK/app/node/save_data_app/Snipaste_2025-07-22_16-28-55.jpg' # 本地文件路径
|
||||||
|
# remote_path = '/files/
|
||||||
|
remote_base_path = "/files/uploads/device_info" #文件系统的鹿鸣
|
||||||
|
|
||||||
|
remote_path = remote_base_path+"/"+ mkdir_remote_path # 远程文件路径
|
||||||
|
print("remote_path1:",remote_path)
|
||||||
|
|
||||||
|
flag,remote_path = sftp_upload(HOSTNAME, PORT, USERNAME, PASSWORD, local_path, remote_path,file_name)
|
||||||
|
|
||||||
|
if flag:
|
||||||
|
print("上传成功")
|
||||||
|
|
||||||
|
#远程路径
|
||||||
|
print("remote_path2:",remote_path)
|
||||||
|
remote_path_without_prefix = remote_path.replace("/files/", "") # /uploads/device_info
|
||||||
|
get_url = "http://47.106.222.181:25079/sftp-images/" + remote_path_without_prefix
|
||||||
|
# http://47.106.222.181:25079/sftp-images/uploads/device_info
|
||||||
|
print("get_url:",get_url)
|
||||||
|
|
||||||
|
return get_url
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# 使用示例
|
||||||
|
#本地图片
|
||||||
|
# local_path = '/home/cat/shuikeWorkSpace/vscode_code/2025_WorkSpace/snapshot_1.jpg' # 本地文件路径
|
||||||
|
local_path = r'D:/ntxm/sensor_data/snapshot_1.jpg'
|
||||||
|
|
||||||
|
#远程路径
|
||||||
|
mkdir_remote_path = "d80801000058/sensor/20250814/20250814_01" #本地存储路径
|
||||||
|
|
||||||
|
#图片链接
|
||||||
|
file_name = 'Snipaste_2025-07-22_16-28-55.jpg' # 远程文件路径
|
||||||
|
|
||||||
|
#进行上传
|
||||||
|
down_url = sftp_upload_one_file(local_path,mkdir_remote_path,file_name)
|
||||||
|
|
||||||
253
kk_tfcard_save_api.py
Normal file
253
kk_tfcard_save_api.py
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
import os
|
||||||
|
import json
|
||||||
|
import random
|
||||||
|
from datetime import datetime
|
||||||
|
import time
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
#pip install Pillow 2_28
|
||||||
|
#python -m pip install Pillow -i https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
#python -m pip install spdlog -i https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
# python -m pip install paramiko -i https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
|
||||||
|
class save_data_manager:
|
||||||
|
def __init__(self,base_path,robot_id):
|
||||||
|
self.base_path_ = base_path # TF卡挂载点
|
||||||
|
self.robot_id_ = robot_id
|
||||||
|
#数据库对象
|
||||||
|
|
||||||
|
def save_data_to_tfcard_json(self,json_data,dir_name,json_type):
|
||||||
|
"""生成并保存数据到TF卡"""
|
||||||
|
now = datetime.now()
|
||||||
|
date_str = now.strftime("%Y%m%d")
|
||||||
|
hour_str = now.strftime("%H")
|
||||||
|
|
||||||
|
# 1. 创建目录
|
||||||
|
save_dir = os.path.join(self.base_path_, "data", "device_info", self.robot_id_, dir_name, date_str, f"{date_str}_{hour_str}")
|
||||||
|
os.makedirs(save_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# 2. 创建文件
|
||||||
|
timestamp = None
|
||||||
|
if json_data['timestamp']:
|
||||||
|
timestamp = json_data['timestamp']
|
||||||
|
else:
|
||||||
|
timestamp = datetime.now().strftime("%Y%m%d_%H_%M_%S")
|
||||||
|
filename = f"{timestamp}_{self.robot_id_}_{json_type}.json"
|
||||||
|
|
||||||
|
# 3. 写入json
|
||||||
|
json_save_path = os.path.join(save_dir, filename)
|
||||||
|
print("json_path:",json_save_path)
|
||||||
|
with open(json_save_path, "w") as f:
|
||||||
|
json.dump(json_data, f, indent=2)
|
||||||
|
print(f"Saved face data: {filename}")
|
||||||
|
|
||||||
|
return json_save_path
|
||||||
|
|
||||||
|
|
||||||
|
def save_data_to_tfcard_jpg(self,frame_data,dir_name,jpg_type):
|
||||||
|
"""生成并保存数据到TF卡"""
|
||||||
|
now = datetime.now()
|
||||||
|
date_str = now.strftime("%Y%m%d")
|
||||||
|
hour_str = now.strftime("%H")
|
||||||
|
|
||||||
|
# 1. 创建目录
|
||||||
|
save_dir = os.path.join(self.base_path_, "data", "device_info", self.robot_id_, dir_name, date_str, f"{date_str}_{hour_str}")
|
||||||
|
os.makedirs(save_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# 2. 创建文件
|
||||||
|
timestamp = datetime.now().strftime("%Y%m%d_%H_%M_%S")
|
||||||
|
filename = f"{timestamp}_{self.robot_id_}_{jpg_type}.jpg"
|
||||||
|
|
||||||
|
# 3. 写入jpg
|
||||||
|
jpg_save_path = os.path.join(save_dir, filename)
|
||||||
|
print("jpg_save_path:",jpg_save_path)
|
||||||
|
|
||||||
|
cv2.imwrite(jpg_save_path,frame_data)
|
||||||
|
|
||||||
|
return jpg_save_path
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"""生成模拟人脸关键点数据"""
|
||||||
|
def generate_fake_face_data(self):
|
||||||
|
"""生成模拟人脸关键点数据"""
|
||||||
|
return {
|
||||||
|
"timestamp": datetime.now().strftime("%Y%m%d_%H_%M_%S"),
|
||||||
|
"robot_id": self.robot_id_,
|
||||||
|
"results": [
|
||||||
|
{"x": round(random.uniform(0, 200),0), "y": round(random.uniform(0, 1),0)} for _ in range(68)
|
||||||
|
],
|
||||||
|
"confidence": random.uniform(0.7, 0.99)
|
||||||
|
}
|
||||||
|
|
||||||
|
"""生成模拟人体姿态数据"""
|
||||||
|
def generate_fake_pose_data(self):
|
||||||
|
"""生成模拟人体姿态数据"""
|
||||||
|
keypoints = ["nose", "left_eye", "right_eye", "left_ear", "right_ear",
|
||||||
|
"left_shoulder", "right_shoulder", "left_elbow", "right_elbow",
|
||||||
|
"left_wrist", "right_wrist", "left_hip", "right_hip",
|
||||||
|
"left_knee", "right_knee", "left_ankle", "right_ankle"]
|
||||||
|
|
||||||
|
return {
|
||||||
|
"timestamp": datetime.now().strftime("%Y%m%d_%H_%M_%S"),
|
||||||
|
"robot_id": self.robot_id_,
|
||||||
|
"results": {kp: {
|
||||||
|
"x": round(random.uniform(0, 200),0),
|
||||||
|
"y": round(random.uniform(0, 200),0),
|
||||||
|
"score": round(random.uniform(0.7, 0.99),2)
|
||||||
|
} for kp in keypoints}
|
||||||
|
}
|
||||||
|
"""生成模拟-血样-传感器数据"""
|
||||||
|
def generate_fake_sensor_001_data(self):
|
||||||
|
print("生成模拟-血样-传感器数据")
|
||||||
|
mks_data_random = {
|
||||||
|
'heart_rate': random.randint(60, 100), # 假设 心率 在60到180之间
|
||||||
|
'blood_oxygen': random.randint(85, 100), # 假设 血氧 在85到100之间
|
||||||
|
'micro_circulation': random.randint(50, 100), # 假设 微循环值 在50到100之间
|
||||||
|
'fatigue_index': random.randint(0, 100), # 假设 疲劳 指数在0到100之间
|
||||||
|
'systolic_pressure': random.randint(90, 180), # 假设 收缩压 在90到180之间
|
||||||
|
'diastolic_pressure': random.randint(60, 120), # 假设 舒张压 在60到120之间
|
||||||
|
'cardiac_output': random.randint(40, 100) # 假设 心输出 在40到100之间
|
||||||
|
}
|
||||||
|
print("mks_data_random:",mks_data_random)
|
||||||
|
return {
|
||||||
|
"timestamp": datetime.now().strftime("%Y%m%d_%H_%M_%S"),
|
||||||
|
"robot_id": self.robot_id_,
|
||||||
|
"result": mks_data_random,
|
||||||
|
}
|
||||||
|
|
||||||
|
def generate_sensor_001_data(self,mks_data_random):
|
||||||
|
print("生成模拟-血样-传感器数据")
|
||||||
|
# mks_data_random = {
|
||||||
|
# 'heart_rate': random.randint(60, 100), # 假设 心率 在60到180之间
|
||||||
|
# 'blood_oxygen': random.randint(85, 100), # 假设 血氧 在85到100之间
|
||||||
|
# 'micro_circulation': random.randint(50, 100), # 假设 微循环值 在50到100之间
|
||||||
|
# 'fatigue_index': random.randint(0, 100), # 假设 疲劳 指数在0到100之间
|
||||||
|
# 'systolic_pressure': random.randint(90, 180), # 假设 收缩压 在90到180之间
|
||||||
|
# 'diastolic_pressure': random.randint(60, 120), # 假设 舒张压 在60到120之间
|
||||||
|
# 'cardiac_output': random.randint(40, 100) # 假设 心输出 在40到100之间
|
||||||
|
# }
|
||||||
|
print("mks_data_random:",mks_data_random)
|
||||||
|
return {
|
||||||
|
"timestamp": datetime.now().strftime("%Y%m%d_%H_%M_%S"),
|
||||||
|
"robot_id": self.robot_id_,
|
||||||
|
"result": mks_data_random,
|
||||||
|
}
|
||||||
|
|
||||||
|
"""生成模拟-毫米波-传感器数据"""
|
||||||
|
def generate_fake_sensor_002_data(self):
|
||||||
|
print("生成模拟-毫米波-传感器数据")
|
||||||
|
sensor_data = {
|
||||||
|
"Part1Rst": {
|
||||||
|
"Battery": 100,
|
||||||
|
"Status": ["01"],
|
||||||
|
"CountNum": random.randint(1, 4),
|
||||||
|
"IsFall": 0
|
||||||
|
},
|
||||||
|
"Part2Rst": {
|
||||||
|
"TargetNum": 1,
|
||||||
|
"Target0": {
|
||||||
|
"ID": 16,
|
||||||
|
"PtNum": 22,
|
||||||
|
"PointCloud": [
|
||||||
|
[-0.0691750283216743, 0.13160428640200078, 1.3956739328119288],
|
||||||
|
[-0.07847705523541838, 0.15392815246426594, 1.383871249877477],
|
||||||
|
[-0.08118316058836383, 0.15254387167066272, 1.3841153359302658],
|
||||||
|
[-0.08118316058836383, 0.15254387167066272, 1.3841153359302658],
|
||||||
|
[-0.0929625, 0.17252076850321676, 1.3695799337803236],
|
||||||
|
[-0.08985277963433623, 0.1735465559405953, 1.366252506565061],
|
||||||
|
[-0.08981986049799257, 0.1729446846963683, 1.3632120794907499],
|
||||||
|
[-0.09402106608514023, 0.2008075149795186, 1.3752118342759272],
|
||||||
|
[-0.16259914164055408, 0.3659265315697133, 1.2686130237385964],
|
||||||
|
[-0.16217132883698243, 0.36379021511710175, 1.2623032883896637],
|
||||||
|
[-0.16910310730617623, 0.3631439575505753, 1.2691036666139888],
|
||||||
|
[-0.1638440883521219, 0.3831408593633806, 1.2404052475851655],
|
||||||
|
[-0.17067092536679368, 0.3803548338347067, 1.2408964990548133],
|
||||||
|
[-0.17067092536679368, 0.3803548338347067, 1.2408964990548133],
|
||||||
|
[-0.17294653770501756, 0.4044264626613462, 1.2315388724510081],
|
||||||
|
[-0.17294653770501756, 0.4044264626613462, 1.2315388724510081],
|
||||||
|
[-0.17235096722025173, 0.40169857121649716, 1.224546809430924],
|
||||||
|
[-0.16789502279593474, 0.4368924567706128, 1.236433858829858],
|
||||||
|
[-0.16789502279593474, 0.4368924567706128, 1.236433858829858],
|
||||||
|
[-0.16789502279593474, 0.4368924567706128, 1.236433858829858],
|
||||||
|
[-0.16719017622805205, 0.5141370904782002, 1.2188803542752917],
|
||||||
|
[-0.16758717901763867, 0.5169416889917281, 1.227432168376347]
|
||||||
|
],
|
||||||
|
"CenterPoint": [-0.12395, 0.34706, 1.27605]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Part3Rst": {
|
||||||
|
"TargetNum": 1,
|
||||||
|
"Target0": {
|
||||||
|
"ID": 16,
|
||||||
|
"Point": [-0.12395, 0.32227, 1.2512599999999998],
|
||||||
|
"HeartRate": random.randint(50, 65),
|
||||||
|
"BreathRate": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print("sensor_data:",sensor_data)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"timestamp": datetime.now().strftime("%Y%m%d_%H_%M_%S"),
|
||||||
|
"robot_id": self.robot_id_,
|
||||||
|
"result": sensor_data,
|
||||||
|
}
|
||||||
|
|
||||||
|
"""生成模拟图片"""
|
||||||
|
def generate_fake_image(self,width=640, height=480):
|
||||||
|
"""生成模拟图片"""
|
||||||
|
img = Image.new("RGB", (width, height), color=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
|
||||||
|
# 添加一些随机形状
|
||||||
|
for _ in range(random.randint(3, 10)):
|
||||||
|
x1 = random.randint(0, width)
|
||||||
|
y1 = random.randint(0, height)
|
||||||
|
x2 = random.randint(x1, width)
|
||||||
|
y2 = random.randint(y1, height)
|
||||||
|
draw.rectangle([x1, y1, x2, y2],
|
||||||
|
fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
|
||||||
|
|
||||||
|
# 将 PIL 图像转换为 NumPy 数组
|
||||||
|
numpy_image = np.array(img)
|
||||||
|
|
||||||
|
return numpy_image
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
base_path = "./sftp-data_1" # TF卡挂载点
|
||||||
|
robot_id = "d80801000058"
|
||||||
|
|
||||||
|
#json写入管理(完成)
|
||||||
|
test = save_data_manager(base_path,robot_id)
|
||||||
|
|
||||||
|
#数据插入管理
|
||||||
|
|
||||||
|
#数据库同步管理(完成)
|
||||||
|
|
||||||
|
#生成人脸数据
|
||||||
|
# face_data = test.generate_fake_face_data()
|
||||||
|
# test.save_data_to_tfcard_json(face_data,dir_name="face",json_type="face")
|
||||||
|
# #TODO 插入数据库
|
||||||
|
|
||||||
|
# #人体人脸数据
|
||||||
|
# pose_data = test.generate_fake_pose_data()
|
||||||
|
# test.save_data_to_tfcard_json(pose_data,dir_name="pose",json_type="pose")
|
||||||
|
# #TODO 插入数据库
|
||||||
|
|
||||||
|
#传感器数据
|
||||||
|
sensor_data = test.generate_fake_sensor_001_data()
|
||||||
|
test.save_data_to_tfcard_json(sensor_data,dir_name="sensor_001",json_type="sensor_001")
|
||||||
|
|
||||||
|
sensor_data = test.generate_fake_sensor_002_data()
|
||||||
|
test.save_data_to_tfcard_json(sensor_data,dir_name="sensor_002",json_type="sensor_002")
|
||||||
|
#TODO 插入数据
|
||||||
|
|
||||||
|
# frame_data = test.generate_fake_image()
|
||||||
|
# test.save_data_to_tfcard_jpg(frame_data,dir_name="face_jpg",jpg_type="jpg")
|
||||||
|
#TODO 插入数据库
|
||||||
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user