CAN、ROS数据录制与rqt图形化显示

以下是针对铲运机现场测试的数据录制操作备忘录,兼顾ROS解析数据和原始CAN数据,确保全面捕捉机器特性相关信息:

📋 测试前准备工作

  1. 设备检查

    • 确认Orin主机与铲运机CAN总线连接稳定(两个CAN口分别标记为can0can1,对应设备手册中的CAN通道定义)。
    • 启动Orin主机,检查ROS节点是否正常启动:rosnode list 应包含/can_sensor_publisher(发布/can_sensor话题的节点)。
    • 验证数据输出:rostopic echo /can_sensor 确认所有字段有正常数值(无持续NaN或异常跳变)。
  2. 工具准备

    • 确保安装can-utils(CAN工具):sudo apt install can-utils
    • 准备足够存储空间(建议≥100GB,按每小时10-20GB估算),挂载外部硬盘:sudo mount /dev/sdb1 /mnt/test_data(根据实际设备调整)。

📝 核心数据录制操作

1. 原始CAN数据录制(底层备份,关键步骤)
  • 打开新终端1 ,执行以下命令(同时录制两个CAN口,输出到硬盘):

    bash 复制代码
    # 录制can0到文件(包含时间戳、ID、数据)
    candump -tz can0 > /nvidia/home/catkin_ws/src/can_data_record/can0_$(date +%Y%m%d_%H%M%S).log &
    # 录制can1到文件
    candump -tz can1 >  /nvidia/home/catkin_ws/src/can_data_record/can1_$(date +%Y%m%d_%H%M%S).log &
    • 参数说明:-t 记录时间戳,-z 时间戳精确到微秒,-l 按帧格式输出(已经舍弃,因为会造成录制空文件的情况。),$(date...) 自动生成带时间的文件名(避免覆盖)。
    • 确认录制状态:ps -ef | grep candump 查看进程是否存在。
    • 在终端1执行 killall candump,确认进程终止,则录制结束。
2. ROS解析数据录制(核心分析数据)
  • 打开新终端2 ,录制/can_sensor话题(带时间戳,支持离线回放):

    bash 复制代码
    rosbag record -O /mnt/test_data/ros_can_sensor_$(date +%Y%m%d_%H%M%S) /can_sensor
    • 参数说明:-O 指定输出路径和前缀,文件名自动带时间戳;确保只录制/can_sensor(避免冗余数据占用空间)。
    • 录制过程中观察终端输出的"Bagging..."提示,确认数据帧率稳定(无"dropped messages")。
3. 人工操作日志记录(关键补充)
  • 准备纸质笔记本或手机备忘录,同步记录以下信息(与数据文件时间对应):
    • 时间点 :如10:30开始铲装作业,11:15进行空载行驶。
    • 操作场景
      • 铲装阶段(满载/半载/空载)、行驶阶段(低速/高速/爬坡/下坡)。
      • 特殊操作(如急停、转向、液压系统满载运行)。
    • 异常现象:如发动机异响、液压油温度骤升、ROS数据卡顿等(注明发生时间)。

⏹️ 测试结束操作

  1. 停止ROS数据录制 :在终端2按 Ctrl+C,等待终端显示"done"确认保存完成。
  2. 停止CAN数据录制 :在终端1执行 killall candump,确认进程终止(ps -ef | grep candump 无结果)。
  3. 数据校验
    • 检查硬盘文件:ls /mnt/test_data 确认生成can0_*.logcan1_*.logros_can_sensor_*.bag文件。
    • 简单验证:用head /mnt/test_data/can0_*.log查看CAN数据前几行,用rosbag info *.bag确认ROS数据时长和消息数。
  4. 数据备份 :将/mnt/test_data文件夹复制到备用存储(如移动硬盘),避免单设备故障丢失数据。

⚠️ 注意事项

  • 录制过程中保持Orin主机供电稳定(建议接铲运机蓄电池或UPS),避免突然断电导致文件损坏。
  • 若测试时长超过4小时,建议每4小时手动停止并重新启动录制(生成多个文件,方便后续分片分析)。
  • 人工日志务必精确到分钟,便于后续将"操作场景"与"数据曲线"对应(如定位"满载时发动机转速变化")。

按此流程操作,既能通过ROS数据快速分析机器特性,又能保留原始CAN数据作为备份,确保测试数据的完整性和可追溯性。

在Ubuntu上可以使用can-utils工具集中的candump命令来录制CAN数据。具体步骤如下:

安装can-utils工具集

如果系统尚未安装can-utils,可以使用以下命令进行安装:

bash 复制代码
sudo apt install can-utils

录制CAN数据

使用candump命令录制CAN数据,基本语法为:(注意:优先使用直接录制,重命名会出现录制空文件情况。)

bash 复制代码
candump -l <can_interface>

其中<can_interface>是要录制数据的CAN接口名称,如can0can1等。例如,要录制can0接口上的CAN数据,可执行以下命令:

bash 复制代码
candump -l can0

该命令会将通过can0接口的所有CAN数据记录到文件中,默认文件名格式为candump-日期.log

如果想指定录制文件的名称,可以使用重定向符号>,例如:

bash 复制代码
candump can0 > my_can_data.log

这样所有捕获到的CAN消息都会被保存到my_can_data.log文件中。

另外,candump还支持过滤特定ID的CAN帧进行录制,命令格式为:

bash 复制代码
candump -l <can_interface>,<id_range>

例如,只录制can0接口上ID为123的CAN帧,可以执行:

bash 复制代码
candump -l can0,123:7FF

ROS话题数据查看

.bag 文件是ROS系统的日志文件(ROS Bag),查看它可以使用ROS自带的rqt工具。以下是具体的操作步骤,从环境准备到数据查看、分析,按流程执行即可:

第一步:确认ROS环境(关键前提)

  1. 打开Ubuntu终端,先激活你的ROS环境(以ROS Noetic为例,其他版本命令类似):

    bash 复制代码
    source /opt/ros/noetic/setup.bash
  2. 若你的 .bag 文件是在工作空间(如 catkin_ws)中录制的,还需激活工作空间的环境:

    bash 复制代码
    source ~/catkin_ws/devel/setup.bash
    • 执行后无报错,说明ROS环境已就绪。

注:也可使用rqt实时查看话题中的数据,那么就不用繁琐的进行数据播包的过程了。

第二步:查看ROS Bag的基础信息(先了解文件内容)

在查看具体数据前,可先通过命令查看 .bag 文件的基本信息(如包含的话题、录制时长、消息数量),避免直接回放时信息混乱。

在终端中执行(将文件名替换为你的 .bag 文件,可直接拖入终端自动补全路径):

bash 复制代码
rosbag info ros_can_sensor_20251016_144631.bag
预期输出示例:
复制代码
path:        ros_can_sensor_20251016_144631.bag
version:     2.0
duration:    1min 20s
start:       Oct 16 2025 14:46:31.123 (1740000391.123)
end:         Oct 16 2025 14:47:51.456 (1740000471.456)
size:        1.2 MB
messages:    4800
compression: none [1/1 chunks]
types:       can_msgs/Frame [3066dcd76a6cfaefc71ec40a57800800b]
             sensor_msgs/Imu [6a62c6daae103f4ff57a132d6f95cec2f]
topics:      /can_sensor       2400 msgs    : can_msgs/Frame
             /imu              2400 msgs    : sensor_msgs/Imu
  • 重点关注 topics 字段:这是 .bag 文件中记录的ROS话题(比如你关心的 /can_sensor 话题),后续查看数据需基于这些话题。

第三步:查看ROS Bag中的具体数据(两种常用方式)

根据你的需求,可选择「实时回放查看」或「提取数据到文件查看」,前者适合快速验证,后者适合详细分析。

方式1:实时回放+终端打印数据(快速查看)

通过 rosbag play 回放 .bag 文件,同时用 rostopic echo 打印指定话题的数据(比如你关心的 /can_sensor 话题)。

  1. 打开第一个终端 ,执行回放命令(-l 表示循环回放,可去掉):

    bash 复制代码
    rosbag play -l ros_can_sensor_20251016_144631.bag
    • 终端会显示回放进度(如 [RUNNING] Bag Time: 1740000392.123)。
  2. 打开第二个终端 ,先激活ROS环境(同第一步),再执行打印命令:

    bash 复制代码
    rostopic echo /can_sensor
    • 此时终端会实时打印 /can_sensor 话题的每一条数据(如CAN ID、数据内容、时间戳等),按 Ctrl+C 可停止。
方式2:用可视化工具(rqt)查看(更直观,支持图形化)

注:也可使用rqt实时查看话题中的数据,那么就不用繁琐的进行数据播包的过程了。

ROS的 rqt 工具集提供了可视化界面,可更清晰地查看、筛选 .bag 数据,甚至绘制曲线(适合统计图形需求)。

  1. 打开 rqt 主界面:

    bash 复制代码
    rqt
  2. 加载ROS Bag文件:

    • rqt 顶部菜单栏,点击「Plugins」→「Logging」→「Bag Player」。
    • 在弹出的「Bag Player」面板中,点击「Open」,选择你的 .bag 文件(如 ros_can_sensor_20251016_144631.bag)。
    • 点击「Play」按钮开始回放(可调节回放速度)。
  3. 查看指定话题数据:

    • 继续在顶部菜单栏,点击「Plugins」→「Topics」→「Topic Monitor」。
    • 在「Topic Monitor」面板中,找到 /can_sensor 话题,勾选后即可看到该话题的实时数据(包含字段解释,比终端打印更清晰)。
  4. 用图形化展示数据(统计曲线):

    • 若想查看 /can_sensor 中某个字段(如燃油量、车速)的变化曲线,点击「Plugins」→「Visualization」→「Plot」。
    • 在「Plot」面板中,点击「Add」,输入 /can_sensor/xxxxxx 替换为具体字段名,如 /can_sensor/data[0] 代表CAN数据的第一个字节),点击「OK」。
    • 回放 .bag 文件时,面板会自动绘制该字段随时间变化的曲线(支持多字段对比),可缩放、保存图片。

第四步:(可选)提取数据到文本文件(便于后续分析)

若需要将 .bag 中的 /can_sensor 数据提取到文本文件(如 .txt),方便用Excel、Python进一步分析,可执行以下命令:

bash 复制代码
rostopic echo -b ros_can_sensor_20251016_144631.bag -p /can_sensor > can_sensor_data.txt
  • 解释:-b 指定 .bag 文件,-p 表示输出为CSV格式(用逗号分隔,可直接用Excel打开),> can_sensor_data.txt 表示将结果保存到文本文件。
  • 生成的 can_sensor_data.txt 会保存在当前目录,打开后可看到每一条数据的时间戳、字段值,便于统计分析。

关键补充说明

  1. 若回放时提示「话题不存在」:
    需重新确认 rosbag info 输出的话题名称是否正确(比如是否是 /can_sensor 而非 /can0),且ROS环境已正确激活。
  2. rqt 无法打开:
    可能是 rqt 未安装,执行 sudo apt install ros-noetic-rqt ros-noetic-rqt-common-plugins(Noetic版本)安装即可。

通过以上步骤,你可以完整查看 .bag 文件中的CAN数据,从终端打印到图形化分析都能覆盖,后续若需要进一步处理数据(如筛选异常帧、计算平均值),也可基于提取的文本文件操作。

问题与解决方案:

录制CAN文件为空的情况:

从文件列表来看,CAN日志文件中只有candump-xxx.log有数据,而手动指定的can0_xxx.logcan1_xxx.log为空,这是由candump命令的参数特性导致的,具体原因和解决方法如下:

核心原因:candump -l参数强制生成默认文件名

你在录制CAN数据时使用了-l参数(日志模式),该参数的特性是:

  • 忽略用户手动指定的输出文件名 ,强制生成格式为candump-YYYY-MM-DD_HH:MM:SS.log的默认日志文件。
  • 同时,由于你在命令中加了重定向符号> /mnt/test_data/can0_xxx.log,但-l参数已接管输出,导致手动指定的文件被创建但始终为空(没有数据写入)。

验证:candump-xxx.log确实对应CAN0和CAN1的数据

虽然文件名没有明确标记can0can1,但这两个文件分别对应你启动的两个candump进程:

  • 先启动的candump -tz -l can0 ...生成的candump-2025-10-16_144037.log → 包含can0的数据。
  • 后启动的candump -tz -l can1 ...生成的candump-2025-10-16_144043.log → 包含can1的数据。

可以通过查看文件内容确认:

bash 复制代码
# 在Linux中查看can0对应文件的前几行(含CAN帧信息)
head candump-2025-10-16_144037.log

# 查看can1对应文件的前几行
head candump-2025-10-16_144043.log

文件中会包含can0can1的标识(如can0 123 [8] 11 22 ...),证明数据正确对应。

后续解决:如何让CAN日志文件名明确区分can0和can1

如果希望文件名直接包含can0/can1以便区分,去掉-l参数 即可(-l是自动日志模式,会强制默认文件名),改用手动指定文件名的方式:

bash 复制代码
# 录制can0,文件名含can0标识(无-l参数)
candump -tz can0 > /mnt/test_data/can0_$(date +%Y%m%d_%H%M%S).log &

# 录制can1,文件名含can1标识(无-l参数)
candump -tz can1 > /mnt/test_data/can1_$(date +%Y%m%d_%H%M%S).log &
  • 这样生成的can0_xxx.logcan1_xxx.log会正常写入数据,且文件名清晰区分通道。
  • -tz参数保留(时间戳+微秒级精度),不影响数据完整性。

总结

目前已有数据的candump-xxx.log是有效的CAN0和CAN1原始数据,无需担心缺失。若后续测试需要更清晰的文件名,按上述方法去掉-l参数即可。这些数据可正常用于与ROS解析数据的交叉验证(通过时间戳对齐)。

如果需要解析这些candump日志文件(如提取CAN帧ID和数据),可以告诉我,我会提供对应的Python解析脚本。

相关推荐
ARM+FPGA+AI工业主板定制专家1 天前
基于Jetson+GMSL AI相机的工业高动态视觉感知方案
人工智能·机器学习·fpga开发·自动驾驶
BullSmall2 天前
汽车HIL测试:电子开发的关键验证环节
人工智能·机器学习·自动驾驶
地平线开发者2 天前
手撕大模型 | MQA 和 GQA 原理解析
自动驾驶
地平线开发者2 天前
征程 6 | BPU trace 简介与实操
算法·自动驾驶
Wnq100722 天前
如何在移动 的巡检机器人上,实现管道跑冒滴漏的视觉识别
数码相机·opencv·机器学习·计算机视觉·目标跟踪·自动驾驶
韩曙亮2 天前
【自动驾驶】自动驾驶概述 ⑨ ( 自动驾驶软件系统概述 | 预测系统 | 决策规划 | 控制系统 )
人工智能·机器学习·自动驾驶·激光雷达·决策规划·控制系统·预测系统
IT古董3 天前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(1)工业品缺陷风格基础知识:割任务定义、数据集介绍
计算机视觉·3d·自动驾驶
Mr.Winter`3 天前
深度强化学习 | 基于SAC算法的动态避障(ROS C++仿真)
人工智能·深度学习·神经网络·机器人·自动驾驶·ros·具身智能
酌量3 天前
路径平滑优化详解(二次规划): 数学建模与目标函数推导
经验分享·笔记·学习·机器人·自动驾驶