ROS机器人-从零开始每日日志记录day5
首次使用深度相机编译完 ROS 驱动后成功获取了深度点云信息遇到以下问题。问题一深度点云太多打开可视化就卡死原始深度图得到的点云数量大约有百万甚至千万级。如果逐一对这些点进行渲染显示对于边缘计算的工控机来说简直是噩梦。如何在减少点数量的同时保留物体特征这里我采用的是体素下采样Voxel Downsampling的方式对深度点云进行稀疏化将点云所在的三维空间划分为若干个边长为 5 cm可根据需求调整的体素Voxel将同一体素内所有点的坐标取均值最终仅用一个点来代表该体素内的所有点。问题二深度点云坐标转换坐标系定义坐标系名称含义color_0RGB 点云坐标系depth_0深度点云坐标系link_0相机刚体基座坐标系为什么一个深度相机会有这么多坐标系深度相机内部集成了多颗摄像头RGB 摄像头、红外/深度摄像头等每颗摄像头有自己独立的光学坐标系同时相机本体还有一个机械基座坐标系。各坐标系之间存在固定的物理偏移外参。配准模式开启前深度点云发布在depth_0坐标系下RGB 点云发布在color_0坐标系下两者通过各自的 TF 变换挂载到link_0深度link_0→depth_0parent link_0, child depth_0RGBlink_0→color_0parent link_0, child color_0配准模式开启后深度点云与 RGB 点云对齐统一发布在color_0坐标系下再由 TF 变换到link_0。遇到的驱动 Bug开启配准模式后驱动仅仅将深度点云 TF 的child_frame_id从depth_0改成了color_0但底层使用的变换矩阵仍然是link_0 → depth_0的那组外参。这就导致了一个诡异的现象在 rviz 中观察到点云在持续地微小抖动。其本质是同一个 TF 变换link_0 → color_0下RGB 点云和深度点云各自使用了不同的变换矩阵两帧数据在空间中产生了微小的错位随帧率交替刷新就表现为抖动。解决思路在驱动源码中修正配准模式下的 TF 发布逻辑确保child_frame_id与变换矩阵一致或在 launch 文件中关闭驱动自带的 TF 发布改用static_transform_publisher手动发布正确的外参。补充系统监控脚本前段时间调试时又发生了一次非正常关机可以用AI写一个更详细且偏向硬件的监控脚本对工控机的电源轨、内核状态、串口、总线等进行持续采样并写入日志以便崩溃后回溯。伪代码示例═══════════════════════════════════════════════════════ 嵌入式 Linux 系统崩溃前状态监控 目标每秒采样一次崩溃后通过 CSV 回溯最后时刻 ═══════════════════════════════════════════════════════ // ───────────────────────────────────────── // 初始化 // ───────────────────────────────────────── FUNCTION 初始化(): 创建日志目录 /home/user/crash_logs 生成时间戳 TS 当前时间(YYYYMMDD_HHMMSS) 创建 CSV 文件写入表头: [时间, 12V输入, 5V_SYS, 5V_Host, 5V_OTG, USB_Hub, 3.3V, CPU小核电压, 逻辑域电压, DDR电压, DDR2电压, GPU电压, SoC温度, 大核温度, GPU温度, 小核频率, 大核0频率, 大核1频率, 内核错误计数] // ───────────────────────────────────────── // 后台任务持续保存内核日志尾部 // ───────────────────────────────────────── FUNCTION 后台保存dmesg(): LOOP 每 2 秒: 将 dmesg 最后 20 行 → 写入 dmesg_tail.log // 目的崩溃后能看到内核最后在做什么 // ───────────────────────────────────────── // 主循环每秒采样一次 // ───────────────────────────────────────── FUNCTION 主循环(): 计数器 0 LOOP 每 1 秒: 计数器 1 当前时间 NOW(HH:MM:SS) // ── 第一组电源轨电压μV── V_12V ← 读取 /sys/class/regulator/regulator.1/microvolts V_5VSYS ← 读取 /sys/class/regulator/regulator.2/microvolts V_5VHOST ← 读取 /sys/class/regulator/regulator.6/microvolts V_5VOTG ← 读取 /sys/class/regulator/regulator.7/microvolts V_USBHUB ← 读取 /sys/class/regulator/regulator.8/microvolts V_3V3 ← 读取 /sys/class/regulator/regulator.3/microvolts // ── 第二组SoC 核心电压μV── V_CPULIT ← 读取 /sys/class/regulator/regulator.18/microvolts V_LOG ← 读取 /sys/class/regulator/regulator.19/microvolts V_DDR ← 读取 /sys/class/regulator/regulator.21/microvolts V_DDR2 ← 读取 /sys/class/regulator/regulator.22/microvolts V_GPU ← 读取 /sys/class/regulator/regulator.17/microvolts // ── 第三组温度m°C── T_SOC ← 读取 /sys/class/thermal/thermal_zone0/temp T_BIG ← 读取 /sys/class/thermal/thermal_zone1/temp T_GPU ← 读取 /sys/class/thermal/thermal_zone2/temp // ── 第四组CPU 频率KHz── F_LIT ← 读取 /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq F_BIG0 ← 读取 /sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq F_BIG1 ← 读取 /sys/devices/system/cpu/cpu6/cpufreq/scaling_cur_freq // ── 第五组内核错误计数 ── DERR ← dmesg 中匹配 error|fail|panic|oops|disconnect|timeout 的行数 // ── 写入 CSV ── 追加一行到 CSV: [当前时间, V_12V, V_5VSYS, V_5VHOST, V_5VOTG, V_USBHUB, V_3V3, V_CPULIT, V_LOG, V_DDR, V_DDR2, V_GPU, T_SOC, T_BIG, T_GPU, F_LIT, F_BIG0, F_BIG1, DERR] // ── 定期刷盘防掉电丢数据── IF 计数器 % 15 0: sync() 等待 1 秒 // ───────────────────────────────────────── // 启动 // ───────────────────────────────────────── 初始化() 启动后台线程 → 后台保存dmesg() 主循环()后续 TODO增加串口/dev/ttyS*、/dev/ttyUSB*在线状态检测增加 I²C / SPI 总线通信心跳检测增加 USB 设备枚举状态监控lsusb定期快照用systemd服务托管开机自启 崩溃自动重启注意不同的系统监控会产生大量日志数据在使用AI写的脚本的时候要特别注意。