"02-26 05:15:26.244 0 0 I [ C0] CAM_ERR: CAM-CCI: cam_cci_irq: 336 Base:0000000000000000, cci: 0, M1_Q1 NACK ERROR: 0x40000000 02-26 05:15:26.244 731 731 I CAM_ERR : CAM-CCI: cam_cci_read: 1450 CCI0_I2C_M1_Q1 ERROR with Slave 0x80 02-26 05:15:26.244 731 731 I CAM_ERR : CAM-CCI: cam_cci_read_bytes: 1803 CCI0_I2C_M1 Failed to read rc:-22 02-26 05:15:26.244 731 731 I CAM_ERR : CAM-SENSOR: cam_cci_i2c_read: 35 rc = -22 02-26 05:15:26.254 731 731 I cam_req_mgr soc: qcom,cam-req-mgr: bound ac15000.qcom,cci0:qcom,eeprom3 (ops cam_eeprom_component_ops [camera]) 02-26 05:15:26.274 0 0 I [ C0] CAM_ERR: CAM-CCI: cam_cci_irq: 336 Base:0000000000000000, cci: 0, M1_Q1 NACK ERROR: 0x40000000 02-26 05:15:26.274 731 731 I CAM_ERR : CAM-CCI: cam_cci_read: 1450 CCI0_I2C_M1_Q1 ERROR with Slave 0x86 02-26 05:15:26.274 731 731 I CAM_ERR : CAM-CCI: cam_cci_read_bytes: 1803 CCI0_I2C_M1 Failed to read rc:-22 02-26 05:15:26.274 731 731 I CAM_ERR : CAM-SENSOR: cam_cci_i2c_read: 35 rc = -22"

时间: 2025-09-12 18:41:51 AIGC 浏览: 14
### **深度分析:相机串行控制接口(CCI)I2C通信故障** #### **1. 核心问题诊断** - **故障模块**: - `CAM-CCI`(相机控制接口) - `CAM-SENSOR`(相机传感器驱动) - **关键错误**: - I2C NACK错误(`NACK ERROR: 0x40000000`) - 从设备地址0x80/0x86读取失败(`rc:-22`,EINVAL无效参数) - 重复性硬件中断触发 #### **2. 故障链分析** ```mermaid graph LR A[CCI中断触发] --> B{I2C总线状态检查} B -->|NACK标志| C[从设备无响应] C --> D[EEPROM/传感器读取失败] D --> E[相机初始化中止] ``` #### **3. 错误模式解码** | 寄存器值 | 含义 | 对应硬件 | |---------|------|---------| | 0x40000000 | Master1 Queue1 NACK | CCI控制器 | | Slave 0x80 | 典型EEPROM地址 | 配置存储器 | | Slave 0x86 | 常见传感器地址 | 图像传感器 | #### **4. 解决方案矩阵** ##### **4.1 紧急恢复措施** ```bash # 重置CCI控制器(需root) adb shell "echo 1 > /sys/devices/platform/ac15000.qcom,cci0/reset" # 强制重新加载传感器驱动 adb shell "rmmod cam_sensor_dev && modprobe cam_sensor_dev" ``` ##### **4.2 硬件级修复方案** **设备树时序调整**: ```diff // arch/arm64/boot/dts/qcom/xxx-camera.dtsi &cci0 { + qcom,i2c-fast-mode = <1>; // 启用快速模式(400kHz) + qcom,wait-cycles = <50>; // 增加等待周期 }; ``` **驱动层补丁**: ```c // drivers/media/platform/msm/cci/msm_cci.c if (irq_status & CCI_IRQ_STATUS_1_I2C_M1_NACK) { + msleep(10); // 增加NACK后延迟 cci_dev->cci_master_info[master].status = -EIO; } ``` #### **5. 影响评估** | 硬件模块 | 正常功能 | 当前状态 | |---------|---------|---------| | CCI控制器 | I2C总线管理 | Master1队列异常 | | EEPROM | 参数存储 | 配置读取失败 | | 图像传感器 | 数据采集 | 初始化受阻 | #### **6. 高级调试技巧** **实时I2C监控**: ```bash adb shell "echo 1 > /sys/kernel/debug/cci0/debug_enable" adb logcat -b kernel | grep CCI ``` **从设备状态检测**: ```bash # 扫描I2C总线(需i2c-tools) adb shell i2cdetect -y 0 # 根据实际总线号调整 ``` **寄存器级诊断**: ```bash adb shell "io -4 0xac15000 0x30" # 读取CCI_IRQ_STATUS_1 ```
阅读全文

相关推荐

cam_sensor_core_power_up+0x22c/0xb38 行 1223: [ 11.508309] cam_sensor_power_up+0x54/0x168 行 1224: [ 11.508312] cam_sensor_driver_cmd+0x35c/0x1378 行 1225: [ 11.508315] cam_sensor_subdev_ioctl+0x28/0x70 行 1240: [ 11.567112] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor0: Linked as a consumer to regulator.1 行 1242: [ 11.591634] CAM_ERR: CAM-CCI: cam_cci_irq: 237 Base:0000000000000000, M0_Q1 NACK ERROR: 0x10000000 行 1293: [ 13.088134] CAM_ERR: CAM-CCI: cam_cci_read: 1305 wait_for_completion_timeout rc = -110 FIFO buf_lvl: 0x0 行 1294: [ 13.088186] CAM_ERR: CAM-CCI: cam_cci_read_bytes_v_1_2: 1575 failed to read rc:-110 行 1295: [ 13.088189] CAM_ERR: CAM-SENSOR: cam_cci_i2c_read: 35 rc = -110 行 1296: [ 13.088194] CAM_WARN: CAM-SENSOR: cam_sensor_match_id: 639 read id: 0x0 expected id 0x258: 行 1324: [ 13.088347] cam_sensor_util_power_down+0x118/0x4e8 行 1325: [ 13.088351] cam_sensor_power_down+0x30/0x128 行 1326: [ 13.088354] cam_sensor_driver_cmd+0x378/0x1378 行 1327: [ 13.088357] cam_sensor_subdev_ioctl+0x28/0x70 行 1339: [ 13.092161] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor0: Dropping the link to regulator.1 行 1341: [ 13.120815] NOT CAMERA 0 行 1342: [ 13.144152] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor2: Linked as a consumer to regulator.1 行 1343: [ 13.171095] CAM_ERR: CAM-CCI: cam_cci_irq: 265 Base:0000000000000000, M1_Q1 NACK ERROR: 0x40000000 行 1366: [ 14.688167] CAM_ERR: CAM-CCI: cam_cci_read: 1305 wait_for_completion_timeout rc = -110 FIFO buf_lvl: 0x0 行 1367: [ 14.688318] CAM_ERR: CAM-CCI: cam_cci_read_bytes_v_1_2: 1575 failed to read rc:-110 行 1368: [ 14.688322] CAM_ERR: CAM-SENSOR: cam_cci_i2c_read: 35 rc = -110 行 1369: [ 14.688326] CAM_WARN: CAM-SENSOR: cam_sensor_match_id: 639 read id: 0x0 expected id 0x30a: 行 1370: [ 14.688329] NOT CAMERA 0 行 1371: [ 14.694628] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor2: Dropping the link to regulator.1 行 1373: [ 14.732853] NOT CAMERA 0 行 1374: [ 14.732904] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor2: Linked as a consumer to regulator.1 行 1385: [ 14.755707] CAM_ERR: CAM-CCI: cam_cci_irq: 265 Base:0000000000000000, M1_Q1 NACK ERROR: 0x40000000 行 1440: [ 16.256086] CAM_ERR: CAM-CCI: cam_cci_read: 1305 wait_for_completion_timeout rc = -110 FIFO buf_lvl: 0x0 行 1441: [ 16.256135] CAM_ERR: CAM-CCI: cam_cci_read_bytes_v_1_2: 1575 failed to read rc:-110 行 1442: [ 16.256138] CAM_ERR: CAM-SENSOR: cam_cci_i2c_read: 35 rc = -110 行 1443: [ 16.256142] CAM_WARN: CAM-SENSOR: cam_sensor_match_id: 639 read id: 0x0 expected id 0x2680: 行 1444: [ 16.256146] NOT CAMERA 0 行 1445: [ 16.260207] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor2: Dropping the link to regulator.1 行 1446: [ 16.284806] NOT CAMERA 0 行 1448: [ 16.337408] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor1: Linked as a consumer to regulator.1 行 1449: [ 16.357108] CAM_ERR: CAM-CCI: cam_cci_irq: 265 Base:0000000000000000, M1_Q1 NACK ERROR: 0x40000000 行 1461: [ 17.856144] CAM_ERR: CAM-CCI: cam_cci_read: 1305 wait_for_completion_timeout rc = -110 FIFO buf_lvl: 0x0 行 1462: [ 17.856433] CAM_ERR: CAM-CCI: cam_cci_read_bytes_v_1_2: 1575 failed to read rc:-110 行 1463: [ 17.856439] CAM_ERR: CAM-SENSOR: cam_cci_i2c_read: 35 rc = -110 行 1464: [ 17.856444] CAM_WARN: CAM-SENSOR: cam_sensor_match_id: 639 read id: 0x0 expected id 0x258: 行 1465: [ 17.856447] NOT CAMERA 0 行 1466: [ 17.860380] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor1: Dropping the link to regulator.1 行 1467: [ 17.892789] NOT CAMERA 0 行 1468: [ 17.916968] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor1: Linked as a consumer to regulator.1 行 1469: [ 17.929590] CAM_ERR: CAM-CCI: cam_cci_irq: 265 Base:0000000000000000, M1_Q1 NACK ERROR: 0x40000000 行 1471: [ 19.456119] CAM_ERR: CAM-CCI: cam_cci_read: 1305 wait_for_completion_timeout rc = -110 FIFO buf_lvl: 0x0 行 1472: [ 19.456153] CAM_ERR: CAM-CCI: cam_cci_read_bytes_v_1_2: 1575 failed to read rc:-110 行 1473: [ 19.456156] CAM_ERR: CAM-SENSOR: cam_cci_i2c_read: 35 rc = -110 行 1474: [ 19.456160] CAM_WARN: CAM-SENSOR: cam_sensor_match_id: 639 read id: 0x0 expected id 0x5035: 行 1475: [ 19.456164] NOT CAMERA 0 行 1476: [ 19.460186] qcom,camera 5c1b000.qcom,cci0:qcom,cam-sensor1: Dropping the link to regulator.1

06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: cam_vfe_bus_ver3_err_irq_top_half: 2946: VFE:4 BUS Err IRQ 06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: cam_vfe_bus_ver3_err_irq_top_half: 2950: VFE:4 BUS IRQ status_0: 0x80000000 06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: cam_vfe_bus_ver3_err_irq_bottom_half: 3040: VFE:4 BUS error image size violation 1 CCIF violation 0 constraint violation 0 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_bus_ver3_err_irq_bottom_half: 3044: Image Size violation status 0x1 CCIF violation status 0x0 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_print_violations: 3009: Image Size Violation 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_bus_ver3_print_wm_info: 2679: VFE:4 WM:0 wm_name:LITE_0 width:120 height:3864 stride:1920 x_init:0 en_cfg:1 acquired width:1280 height:3864 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_bus_ver3_print_wm_info: 2687: hw:4 WM:0 last consumed address:0xff6e000 last frame addr:0x0 fifo cnt:0x1 current client address:0xff66000 06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: __cam_isp_ctx_notify_error_util: 764: Notify CRM about fatal error: 2 req: 2223 frame: 2224 in ctx: 7 on link: 0x8a030d 06-17 07:17:54.770 7798 7798 I CAM_INFO: CAM-ISP: __cam_isp_ctx_flush_req_in_top_state: 5302: Last request id to flush is 2225, ctx_id:7 06-17 07:17:54.770 7798 7798 I CAM_INFO: CAM-ISP: __cam_isp_ctx_flush_req_in_top_state: 5318: Stop HW complete. Reset HW next. 06-17 07:17:54.777 7813 7813 I CAM_WARN: CAM-ISP: __cam_isp_ctx_process_evt: 7884: Get unexpect evt:1 in acquired state 06-17 07:17:54.777 7813 7813 I CAM_INFO: CAM-ISP: cam_ife_mgr_release_hw: 7485: 7:17:54.685 Release HW success ctx id: 2

lixing@lixing:~$ roslaunch fast_livo mapping_mid360.launch ... logging to /home/lixing/.ros/log/26a19042-87dc-11f0-9ea5-7d3779c15a43/roslaunch-lixing-214852.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt WARNING: disk usage in log directory [/home/lixing/.ros/log] is over 1GB. It's recommended that you use the 'rosclean' command. started roslaunch server http://lixing:40781/ SUMMARY ======== PARAMETERS * /common/img_en: 1 * /common/img_topic: /camera/color/ima... * /common/imu_topic: /mavros/imu/data * /common/lid_topic: /scan * /common/lidar_en: 1 * /common/ros_driver_bug_fix: False * /evo/pose_output_en: False * /evo/seq_name: CBD_Building_01 * /extrin_calib/Pcl: [-0.01363, -0.140... * /extrin_calib/Rcl: [-0.34925, -0.928... * /extrin_calib/extrinsic_R: [1, 0, 0, 0, 1, 0... * /extrin_calib/extrinsic_T: [0.011, 0.02329, ... * /imu/acc_cov: 0.8 * /imu/b_acc_cov: 0.001 * /imu/b_gyr_cov: 0.001 * /imu/gyr_cov: 0.5 * /imu/imu_en: True * /imu/imu_int_frame: 30 * /laserMapping/cam_cx: 320 * /laserMapping/cam_cy: 240 * /laserMapping/cam_d0: 0 * /laserMapping/cam_d1: 0 * /laserMapping/cam_d2: 0 * /laserMapping/cam_d3: 0 * /laserMapping/cam_fx: 639.997649 * /laserMapping/cam_fy: 639.997649 * /laserMapping/cam_height: 480 * /laserMapping/cam_model: pinhole * /laserMapping/cam_width: 640 * /laserMapping/scale: 1.0 * /lio/beam_err: 0.15 * /lio/dept_err: 0.02 * /lio/layer_init_num: [5, 5, 5, 5, 5] * /lio/max_iterations: 5 * /lio/max_layer: 2 * /lio/max_points_num: 50 * /lio/min_eigen_value: 0.005 * /lio/voxel_size: 0.5 * /local_map/half_map_size: 100 * /local_map/map_sliding_en: False * /local_map/sliding_thresh: 8 * /pcd_save/colmap_output_en: True * /pcd_save/filter_size_pcd: 0.15 * /pcd_save/interval: -1 * /pcd_save/pcd_save_en: True * /preprocess/blind: 0.5 * /preprocess/filter_size_surf: 0.1 * /preprocess/lidar_type: 1 * /preprocess/point_filter_num: 1 * /preprocess/scan_line: 4 * /publish/blind_rgb_points: 0.0 * /publish/dense_map_en: True * /publish/pub_effect_point_en: False * /publish/pub_plane_en: False * /publish/pub_scan_num: 1 * /rosdistro: noetic * /rosversion: 1.17.4 * /time_offset/exposure_time_init: 0.0 * /time_offset/img_time_offset: 0.1 * /time_offset/imu_time_offset: 0.0 * /uav/gravity_align_en: True * /uav/imu_rate_odom: False * /vio/exposure_estimate_en: True * /vio/img_point_cov: 100 * /vio/inv_expo_cov: 0.1 * /vio/inverse_composition_en: False * /vio/max_iterations: 5 * /vio/normal_en: True * /vio/outlier_threshold: 1000 * /vio/patch_pyrimid_level: 4 * /vio/patch_size: 8 * /vio/raycast_en: False NODES / laserMapping (fast_livo/fastlivo_mapping) republish (image_transport/republish) rviz (rviz/rviz) ROS_MASTER_URI=http://localhost:11311 process[laserMapping-1]: started with pid [214877] process[rviz-2]: started with pid [214878] process[republish-3]: started with pid [214879] Not found: /home/lixing/catkin_ws/src/FAST-LIVO2/Log/Colmap/images Removed: /home/lixing/catkin_ws/src/FAST-LIVO2/Log/Colmap/sparse/0 Created: /home/lixing/catkin_ws/src/FAST-LIVO2/Log/Colmap/images Created: /home/lixing/catkin_ws/src/FAST-LIVO2/Log/Colmap/sparse/0 [INFO] [1756804953.461777121, 995.921000000]: Found parameter: laserMapping/cam_model, value: pinhole terminate called after throwing an instance of 'std::runtime_error' what(): Camera model not correctly specified. [laserMapping-1] process has died [pid 214877, exit code -6, cmd /home/lixing/catkin_ws/devel/lib/fast_livo/fastlivo_mapping __name:=laserMapping __log:=/home/lixing/.ros/log/26a19042-87dc-11f0-9ea5-7d3779c15a43/laserMapping-1.log]. log file: /home/lixing/.ros/log/26a19042-87dc-11f0-9ea5-7d3779c15a43/laserMapping-1*.log [rviz-2] process has finished cleanly log file: /home/lixing/.ros/log/26a19042-87dc-11f0-9ea5-7d3779c15a43/rviz-2*.log

对于以下代码增加转换为txt的函数,原因是images.txt不是直接生成的,而是我们转换而来的import os import glob import json import argparse import subprocess import numpy as np from pyquaternion import Quaternion ''' 计算rot_erro 和 trans_erro的脚本 ''' def extract_frames(video_path, output_dir): """ 使用FFmpeg从视频中提取所有帧 """ if not os.path.exists(output_dir): os.makedirs(output_dir) # 获取原视频总帧数 frame_cmd = f'ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nw=1 "{video_path}"' frame_process = subprocess.run(frame_cmd, shell=True, capture_output=True, text=True) total_frames = int(frame_process.stdout.strip().split('=')[1]) or '100' # 默认100帧回退 # 构建FFmpeg命令 cmd = f""" ffmpeg -i "{video_path}" \ -vframes {total_frames} \ -vsync vfr \ "{output_dir}/frame_%04d.jpg" """ # 执行命令并记录日志 with open("ffmpeg_extract.log", "a") as f: process = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) for line in process.stdout: decoded = line.decode() f.write(decoded) print(decoded.strip()) # 可选:实时输出日志到控制台 return process.returncode def parse_colmap_images(file_path): """ 解析COLMAP images.txt文件,提取旋转矩阵和平移向量 """ R_gen = [] # 生成的旋转矩阵 T_gen = [] # 生成的平移向量 with open(file_path, 'r') as f: lines = f.readlines() for i in range(4, len(lines), 2): # 跳过前4行注释 line = lines[i].strip().split() if not line: continue # 提取四元数和平移向量 q = Quaternion(float(line[1]), float(line[2]), float(line[3]), float(line[4])) R = q.rotation_matrix T = np.array([float(line[5]), float(line[6]), float(line[7])]) R_gen.append(R) T_gen.append(T) return np.array(R_gen), np.array(T_gen) # 按文件名数字排序COLMAP数据 def sort_colmap_by_image_name(colmap_data): # 解析文件名中的数字并排序 def get_frame_num(line): filename = line.strip().split()[-1] return int(filename.split('_')[-1].split('.')[0]) return sorted(colmap_data, key=get_frame_num) def parse_ground_truth(json_path): """ 解析预设轨迹JSON文件,提取旋转矩阵和平移向量 返回两个字典:R_gt_dict(旋转矩阵)和 T_gt_dict(平移向量),键为 cam_type """ with open(json_path, 'r') as f: data = json.load(f) R_gt_dict = {} # 存储旋转矩阵,键为 cam_type T_gt_dict = {} # 存储平移向量,键为 cam_type # 遍历每个帧 for frame in data.values(): # 遍历每个相机类型 for cam_type, cam_pose in frame.items(): # 解析矩阵字符串 matrix_str = cam_pose.replace('[', '').replace(']', '').split() matrix = np.array(matrix_str, dtype=float).reshape(4, 4) R = matrix[:3, :3] # 提取旋转矩阵 T = matrix[:3, 3] # 提取平移向量 # 将数据存入字典 if cam_type not in R_gt_dict: R_gt_dict[cam_type] = [] T_gt_dict[cam_type] = [] R_gt_dict[cam_type].append(R) T_gt_dict[cam_type].append(T) # 将列表转换为 numpy 数组 for cam_type in R_gt_dict: R_gt_dict[cam_type] = np.array(R_gt_dict[cam_type]) T_gt_dict[cam_type] = np.array(T_gt_dict[cam_type]) return R_gt_dict, T_gt_dict def run_colmap_step(command, log_file=None): """ 执行COLMAP命令并记录日志 """ with open(log_file, "w") as f: process = subprocess.Popen( command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, shell=True ) for line in process.stdout: print(line.strip()) # 实时打印日志 if log_file: f.write(line) return process.returncode # 示例:特征提取 def colmap_feature_extractor(image_path, database_path): cmd = f""" colmap feature_extractor \ --image_path {image_path} \ --database_path {database_path} \ --SiftExtraction.use_gpu 1 \ """ return run_colmap_step(cmd, "feature_extractor.log") def run_colmap_pipeline(data_dir): """ 端到端运行COLMAP重建流程 """ # 路径定义 database = os.path.join(data_dir, "database.db") images = os.path.join(data_dir, "images") sparse = os.path.join(data_dir, "sparse") colmap_feature_extractor(images, database) cmd = f""" colmap exhaustive_matcher\ --database_path {database} \ --SiftMatching.use_gpu 1 \ """ run_colmap_step(cmd, "matcher.log") cmd = f""" glomap mapper \ --database_path {database} \ --image_path {images} \ --output_path {sparse} \ """ run_colmap_step(cmd, "mapper.log") def normalize_trajectory(T_gen, T_gt): """ 对生成的轨迹进行尺度归一化 通过前两帧计算缩放因子并调整生成轨迹的平移向量 """ if len(T_gen) < 2 or len(T_gt) < 2: raise ValueError("轨迹至少需要两帧进行归一化") # 计算真实轨迹和生成轨迹的前两帧平移差异 delta_gt = T_gt[1] - T_gt[0] delta_gen = T_gen[1] - T_gen[0] # 计算缩放因子(真实轨迹/生成轨迹) scale_gt = np.linalg.norm(delta_gt) scale_gen = np.linalg.norm(delta_gen) if scale_gen < 1e-8: # 防止除以零 raise ValueError("生成轨迹前两帧平移量过小,无法计算缩放因子") scale_factor = scale_gt / scale_gen # 应用缩放因子到所有平移向量 T_normalized = T_gen * scale_factor # 保持第一帧为原点(可选) # origin = T_normalized[0].copy() # T_normalized -= origin return T_normalized def calculate_camera_errors(R_gen, R_gt, T_gen, T_gt): """ 计算旋转误差和平移误差(包含归一化处理) """ # 新增:轨迹归一化处理 try: T_gen_normalized = normalize_trajectory(T_gen, T_gt) except ValueError as e: print(f"归一化失败: {e},跳过该视频") return float('inf'), float('inf') # 返回极大值表示失败 n = R_gen.shape[0] rot_err = 0.0 trans_err = 0.0 for i in range(n): # 使用原始旋转矩阵计算旋转误差 R_product = np.dot(R_gen[i], R_gt[i].T) tr = np.trace(R_product) frame_rot_err = np.arccos(np.clip((tr - 1)/2, -1, 1)) rot_err += frame_rot_err # 使用归一化后的平移向量计算平移误差 frame_trans_err = np.linalg.norm(T_gt[i] - T_gen_normalized[i]) ** 2 trans_err += frame_trans_err return rot_err, trans_err # def calculate_camera_errors(R_gen, R_gt, T_gen, T_gt): # """ # Calculate the rotation error (RotErr) and translation error (TransErr) between # generated and ground truth camera poses. # Parameters: # - R_gen: Generated rotation matrices, shape (n, 3, 3) # - R_gt: Ground truth rotation matrices, shape (n, 3, 3) # - T_gen: Generated translation vectors, shape (n, 3) # - T_gt: Ground truth translation vectors, shape (n, 3) # Returns: # - rot_err: Rotation error (RotErr) # - trans_err: Translation error (TransErr) # """ # n = R_gen.shape[0] # # Initialize errors # rot_err = 0.0 # trans_err = 0.0 # for i in range(n): # # Compute R_gen^i * R_gt^i.T # R_product = np.dot(R_gen[i], R_gt[i].T) # # Compute the trace of the resulting matrix # tr = np.trace(R_product) # # Compute the rotation error for this frame # frame_rot_err = np.arccos(np.clip((tr - 1) / 2, -1, 1)) # # Add to the total rotation error # rot_err += frame_rot_err # # Compute the translation error for this frame # frame_trans_err = np.linalg.norm(T_gt[i] - T_gen[i]) ** 2 # # Add to the total translation error # trans_err += frame_trans_err # return rot_err, trans_err if __name__ == "__main__": # 解析命令行参数 parser = argparse.ArgumentParser(description="处理视频和摄像头轨迹数据") parser.add_argument("--videos", required=True, type=str, help="视频文件夹路径(包含子文件夹如 cam1, cam2...,每个子文件夹中包含多个视频)") parser.add_argument("--json", required=True, type=str, help="摄像头轨迹 JSON 文件路径") args = parser.parse_args() # 读取真实轨迹数据 R_gt_dict, T_gt_dict = parse_ground_truth(args.json) # 支持的视频扩展名 VIDEO_EXTS = [".mp4", ".avi", ".mov", ".mkv", ".wmv", ".flv"] type_dict = {'cam_type1':'cam01', 'cam_type2':'cam02', 'cam_type3':'cam03', 'cam_type4':'cam04', \ 'cam_type5':'cam05', 'cam_type6':'cam06', 'cam_type7':'cam07', 'cam_type8':'cam08', 'cam_type9':'cam09', 'cam_type10':'cam10'} # 遍历所有摄像头子文件夹 results = [] for cam_folder in os.listdir(args.videos): cam_path = os.path.join(args.videos, cam_folder) if not os.path.isdir(cam_path): continue print(f"Processing camera: {cam_folder}") cam_type = type_dict[os.path.basename(cam_folder)] R_gt = R_gt_dict[cam_type] T_gt = T_gt_dict[cam_type] # 查找所有视频文件 video_files = [] for ext in VIDEO_EXTS: video_files.extend(glob.glob(os.path.join(cam_path, f"*{ext}"))) # 遍历每个视频文件 for video_path in video_files: # import pdb; pdb.set_trace() video_name = os.path.splitext(os.path.basename(video_path))[0] print(f"Processing video: {video_name}") # 2. 创建独立的 COLMAP 处理目录 colmap_dir = os.path.join(cam_path, f"colmap_{video_name}") os.makedirs(colmap_dir, exist_ok=True) # 1. 提取视频帧(以视频文件名命名输出目录) frames_dir = os.path.join(colmap_dir, f"images") extract_frames(video_path, frames_dir) # 3. 运行 COLMAP 重建流程(修改路径参数) run_colmap_pipeline(colmap_dir) # 需要调整 run_colmap_pipeline 的输入参数 # 4. 解析 COLMAP 输出的相机姿态 colmap_path = os.path.join(colmap_dir, "sparse", "images.txt") if not os.path.exists(colmap_path): print(f"COLMAP output not found for {video_name} in {cam_folder}") continue R_gen, T_gen = parse_colmap_images(colmap_path) # 5. 计算误差 rot_err, trans_err = calculate_camera_errors(R_gen, R_gt, T_gen, T_gt) results.append({ "camera": cam_folder, "video": video_name, "rot_err": rot_err, "trans_err": trans_err }) # 6. 保存结果 with open("camera_errors.csv", "w") as f: f.write("camera,video,rot_err,trans_err\n") for res in results: f.write(f"{res['camera']},{res['video']},{res['rot_err']:.4f},{res['trans_err']:.4f}\n") print("处理完成,结果已保存到 camera_errors.csv")

最新推荐

recommend-type

解决vue net :ERR_CONNECTION_REFUSED报错问题

在开发Vue应用时,开发者可能会遇到“net :ERR_CONNECTION_REFUSED”错误,这通常表示浏览器无法连接到指定的服务器。这个错误可能出现在多种场景下,比如本地开发环境配置不正确或者网络环境变化等。本文将重点讲解...
recommend-type

Android 出现:java.lang.NoClassDefFoundError...错误解决办法

在Android开发过程中,有时会遇到一个常见的运行时异常——`java.lang.NoClassDefFoundError`。这个错误通常意味着在编译期间能够找到类的定义,但在运行时却无法加载该类。本文将深入探讨这个问题,特别是在Android...
recommend-type

面板数据-上市公司高校合作文章详情.xlsx

详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/151762470
recommend-type

个人作品:使用React和Material-UI打造的赛车主题个人网站

### 知识点概述 该部分将围绕提供的文件信息进行展开,包含React框架、Material-UI库、网站性能优化、版本控制、网站部署以及相关的标签解析等详细知识点。 ### React框架 #### React简介 React是由Facebook开发和维护的一个用于构建用户界面的JavaScript库。它采用组件化的方式,使得开发者可以将UI分解为独立、可复用的组件。这些组件可以包含自己的状态,且只有状态发生变更时,才会重新渲染相应的组件,从而提高应用性能。 #### React应用生命周期 在React中,组件从创建到挂载、更新再到卸载,均遵循一套生命周期方法。例如,`componentDidMount`是在组件挂载后立即调用的方法,常用于执行如数据获取这类操作。`componentDidUpdate`则是组件更新后调用,可用于与当前和之前的props进行比较,并基于比较结果执行更新操作。 ### Material-UI #### Material-UI简介 Material-UI是一个React的用户界面框架,它提供了一整套现成的组件,符合Google的Material Design设计语言。Material-UI的核心优势在于其能够快速实现美观且一致的UI界面,同时保持高度的可定制性。该框架包含各种常用的UI元素,如按钮、输入框、卡片等,并拥有丰富的主题配置选项来支持不同品牌和风格的设计需求。 #### Material-UI中的组件使用 Material-UI通过组件化的方式提供各种UI元素,开发者可以根据需要自由组合和构建界面。例如,`Button`组件可以用于创建按钮,`Card`组件用于创建卡片布局等。每个组件的使用都遵循Material-UI的设计规范,确保界面美观和用户友好。 ### 网站性能优化 #### 响应式设计 从描述中提到网站支持移动和桌面端的定制设计,这是响应式设计的核心特点。响应式设计意味着网页能够根据不同的屏幕尺寸和分辨率,自动调整布局,提供最优化的浏览体验。 #### 动画和过渡效果 网站引入了新的过渡和动画,这不仅提升了用户体验,也可能有助于页面元素间转换时的直观性。使用React可以轻松地添加和管理动画,因为状态更新时React会自动处理组件树的更新。 ### 版本控制和分叉仓库 #### 版本控制(Git) 从描述中提到可以分叉此仓库,这涉及到了Git版本控制工具的使用。Git是一个分布式版本控制系统,用于跟踪代码变更,并且支持协作开发。通过分叉仓库,开发者可以从原始项目创建一个副本,可以在副本上进行修改而不影响原项目。 #### 分叉(Fork)和克隆(Clone) 分叉操作会创建一个远程仓库的副本,而克隆操作则会将远程仓库的内容复制到本地计算机。这意味着开发者可以在本地进行更改,然后选择将更改推送到自己的远程副本,或贡献回原始项目。 ### 安装与部署 #### 安装依赖项 在分叉/克隆仓库之后,开发者需要在项目目录中运行`npm install`来安装所有必需的依赖项。这一步骤是启动开发服务器前的必要准备。 #### 开发和生产环境 开发者需要区分开发环境和生产环境。开发环境通常包含调试工具,而生产环境需要优化和压缩资源以提升网站性能。通过运行`npm start`可以启动开发服务器,而使用`npm run build`则可以构建用于生产环境的静态文件。 ### 标签解析 #### React 标签提及了React,这意味着项目是基于React框架开发的,相关开发者和招聘者可能会搜索此标签以找到具有React开发经验的人才。 #### Blog & personal-website 标签还提到了博客和个人网站,这可能意味着项目是一个个人博客或者展示个人技能和经历的网站,通常用于职业发展或个人品牌建设。 #### Resume-website 标签提到了简历网站,这可以是一个在线简历或个人作品集的展示平台,提供了一个展示个人技能和经验的数字平台,便于求职者与潜在雇主之间沟通。 ### 结语 以上是根据提供的文件信息总结的详细知识点,涵盖了React和Material-UI框架的使用、网站性能优化、版本控制和仓库分叉、安装和部署流程以及对相关标签的解释和应用。这些内容不仅有助于理解该项目的技术细节,而且对于了解构建现代Web应用所涉及的技术和流程也是十分有帮助的。
recommend-type

活动图设计技巧大公开:如何在StarUML中构建高逻辑性的业务流程?

# 摘要 活动图作为软件系统建模的重要工具,能够有效表达复杂业务流程的逻辑结构与行为关系。本文围绕StarUML平台,系统探讨了活动图的设计原理、建模方法及其在实际项目中的应用价值。文章从活动图的核心元素与建模逻辑入手,分析了结构化建模方法与语义表达机制,并详细阐述了在StarUML中构建标准活动图的操作流程与优化策略。针对复杂业务场景,
recommend-type

模拟经典运放电路结构

<think>嗯,用户想了解经典运放电路的结构、模拟方法和实现方式。首先,我需要回忆运放的基本结构。运放通常由差分输入级、中间增益级和输出级组成,对吧?然后,模拟方法可能涉及虚短和虚断的概念,这是分析运放电路的关键。用户提到的引用里也强调了这两个概念的重要性,所以必须详细解释。接下来,我得考虑不同的经典电路结构,比如反向放大器、同向放大器、电压跟随器、加法器、微分器和积分器。每个电路的结构和公式需要准确描述,并确保使用正确的LaTeX格式。例如,反向放大器的公式是$V_o= -\frac{R_f}{R_1}V_i$,要检查是否用$$...$$还是$...$,根据用户的要求,行内公式用$,独立公
recommend-type

MATLAB模拟无线传感器网络与区块链技术

根据给定文件信息,我们将详细探讨以下几个关键知识点: 1. 无线传感器网络(Wireless Sensor Network, WSN): 无线传感器网络是由一组具有传感器、处理单元和通信能力的小型设备组成的网络,这些设备能够相互协作,完成对环境的监测任务。无线传感器网络具有部署便捷、自组织、灵活性高等特点。它在智能交通、环境监测、智能家居等领域有着广泛的应用。 2. 区块链技术(Blockchain Technology): 区块链是一种分布式数据库技术,其特点是去中心化、数据不可篡改、信息透明。在无线传感器网络中,区块链可用于提高数据的可信度和安全性。每个节点生成的块(block)将包含一段时期内的交易信息,这些块链式地连接在一起,形成链状结构,即区块链。通过共识机制(如工作量证明PoW、权益证明PoS等),网络中的节点对数据的有效性达成一致,从而保证数据的安全性和可靠性。 3. 随机泛洪路由技术(Random Flooding Routing): 随机泛洪路由技术是一种无需路由表的简单、基于概率的路由方法。在泛洪机制中,消息从源节点发出后,每个接收到消息的节点都会以一定的概率转发给其邻居节点。该技术易于实现,但可能会导致大量重复传输,进而增加网络的负载和能量消耗。因此,随机泛洪路由通常用于对实时性要求较高,但对能量和资源消耗要求不高的场合。 4. MATLAB仿真: MATLAB是一种高级数学计算和仿真软件,它广泛应用于工程计算、控制系统、信号处理、通信系统等领域。在无线传感器网络和区块链技术的研究中,MATLAB提供了强大的仿真环境和工具箱,使得研究人员能够模拟网络行为、验证算法性能和优化系统设计。 5. 能量效率(Energy Efficiency): 在无线传感器网络的设计中,能量效率是一个核心考量因素。由于传感器节点通常由电池供电,并且电池的更换或充电往往不便或不可行,因此降低节点能耗,延长网络的生命周期至关重要。研究者需要在保证网络性能的同时,采用各种策略来减少节点的能量消耗。 6. 静态节点(Static Node): 在无线传感器网络中,静态节点指的是那些位置固定不动的节点。与移动节点相比,静态节点的网络拓扑结构相对稳定,这有助于简化路由策略的设计,并且在一定程度上提高了系统的可预测性。静态节点适用于那些对位置变化不敏感的监测任务。 7. 节点块生成(Block Generation at Nodes): 在区块链技术中,节点块生成是指每个节点按照一定的规则(如PoW、PoS等)打包一段时间内的交易记录,生成新的数据块,并将其加入到区块链中的过程。每个新生成的块都包含前一个块的哈希值,确保了链的连续性和不可篡改性。在无线传感器网络中,节点生成块的过程也是数据交换的一部分,每个节点在完成数据处理和转发后,可能会产生新的块。 综合以上知识点,我们可以了解到,给定文件中的MATLAB仿真代码是专门用于无线传感器网络环境的仿真,其中实现了随机泛洪路由技术来模拟数据传输过程,并通过节点上生成块的方式构建了区块链。该代码特别适用于静态节点环境,其目的在于研究如何降低能量消耗,并保证数据传输的可靠性和安全性。代码的开源性将有助于研究人员和开发者访问、使用、修改和进一步优化该仿真模型。
recommend-type

UML状态图深度剖析:掌握对象生命周期建模的7个关键要点

# 摘要 UML状态图是描述系统动态行为的核心建模工具,广泛应用于软件与系统设计中。本文系统阐述了状态图的基本概念与理论基础,深入分析了状态、转移、复合结构及并发机制等关键建模元素,并详细探讨了状态图的构建流程与设计原则,强调行为建模的逻辑完整性与可维护性。结合嵌入式系统、业务流程和设计模式等实际应用场景,展示了状态图在复杂系统状态管理中的有效性。同时,本文研究了状态图与类图、序列图的协同机制,探讨了其在系统架构设计中的整合作用,并介绍了主流建模工具对状态图的支持与自动化实现方法,为工程实践提供了理论指导和技术路径。 # 关键字 UML状态图;状态转移;复合状态;并发建模;行为建模;
recommend-type

dbeaver缩小编辑页面

<think> 首先,用户的问题是:“我想查找在DBeaver中缩小编辑页面的方法 请问DBeaver缩小编辑页面的方法”。这似乎是用户在寻求如何在DBeaver数据库工具中缩小编辑页面的方法。 回顾系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法必须正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 用户提供的引用: - 引用[1]:关于SQL函数和触发器的更新操作,与DBeaver缩小页面无关。 - 引用[2]:提到搜索历史、模糊查询、列编辑模式、自动换行和截图工具snipa
recommend-type

加强Magento管理员密码强度的扩展工具

Magento是一个流行的开源电子商务平台,它允许商家和开发人员构建和管理在线商店。为了确保在线商店的安全性,管理员密码的强度至关重要。Magento默认提供的管理员密码强度规则对于基本安全需求来说已经不错,但往往可以根据不同的安全需求进行增强。 Magento的“magento-admin-password-strength-enforcer”扩展就是用来加强默认密码策略的工具之一。通过这个扩展,网站管理员可以设置一个更高的密码长度阈值,以强制新创建的管理员密码满足一定的安全标准。 知识点说明: 1. Magento平台概述: Magento是一个基于PHP语言和MySQL数据库开发的电子商务解决方案,它具有模块化架构的特点,提供了丰富的扩展性和定制性。平台内置了许多功能,比如目录管理、营销工具、SEO优化等,同时支持多店铺管理和多种支付方式。 2. 管理员密码安全性: 在电子商务平台中,管理面板的访问权限至关重要。管理员账户通常拥有对网站进行设置、配置和维护的权限,因此密码的安全性直接关系到整个网站的安全性。如果密码强度不够,恶意攻击者就可能通过各种手段获取密码,进而对网站进行非法操作。 3. Magento密码强度策略: Magento默认配置中包含了密码强度的验证规则,如要求密码包含一定数量的字符、数字和特殊符号,以及不得包含用户名等。这些规则在一定程度上增强了密码的安全性,但随着网络攻击手段的不断进步,增强密码策略的要求变得越发重要。 4. Magento扩展与增强: Magento社区和开发人员不断提供各种扩展(Extensions)来增加Magento的功能,包括安全增强功能。magento-admin-password-strength-enforcer扩展就是这类工具之一,它允许管理员通过设置来提高密码强度,尤其是通过增加密码长度的要求。 5. 扩展安装和配置: 安装此类Magento扩展通常涉及解压下载的文件到Magento的特定目录,并通过Magento的后台管理系统进行安装配置。该扩展提供了一个简单的配置界面,管理员可以直接在Magento的后台设置界面(System > Configuration > Admin Password Strength)进行操作,输入想要设置的新密码长度阈值。 6. 特征和优势: - 简洁性:该扩展不会修改Magento的核心代码,这意味着它可以更加安全地应用,不会影响Magento平台的其他部分。 - 向后兼容性:扩展设计为向后兼容,因此可以在不影响其他已安装扩展的情况下使用。 - 灵活性:提供了默认密码长度的设置,管理员可以自行定义密码的最小长度要求,以满足自己的安全需求。 - 升级友好:由于不涉及核心代码,该扩展通常能够随着Magento平台的升级而正常工作。 7. 核心代码与扩展开发: Magento的PHP代码库是其架构的重要组成部分,扩展开发通常需要开发者具备良好的PHP开发能力。通过编写代码来增强或修改Magento的功能,是实现特定需求的常用方法。这种开发方式既保留了Magento的核心优势,又能够灵活地根据用户需求进行调整。 8. 安全维护与最佳实践: 在使用和维护电子商务平台时,应该遵循一些最佳实践,如定期更新Magento和扩展,保持软件处于最新版本以避免已知的安全漏洞。此外,还应定期更换密码,不在不同网站使用相同的密码,以减少被攻击的风险。 通过上述详细的知识点阐述,可以看出magento-admin-password-strength-enforcer扩展是如何通过提高管理员密码的最小长度要求来提升Magento平台的安全性的,同时也强调了在实施此类安全措施时需要注意的最佳实践和操作方法。