自动驾驶算法开发中,Urbannav数据集因其丰富的传感器数据和精确的真值标注成为研究热点。但许多开发者在首次使用该数据集时,会遇到一个令人头疼的问题——关键的/novatel_data/inspvax真值话题无法通过rostopic echo命令订阅。这不仅影响算法评估,更可能让整个研究进度陷入停滞。本文将系统性地剖析问题根源,提供从依赖安装到最终验证的完整解决方案。
当你在终端输入rostopic echo /novatel_data/inspvax却只得到"Topic not found"的错误提示时,问题通常出在消息类型的缺失。Urbannav数据集使用Novatel设备采集的INS数据,其消息格式定义在novatel_msgs包中,而非ROS标准消息集。
通过rostopic info /novatel_data/inspvax命令可以确认话题使用的消息类型。如果返回结果中包含novatel_msgs/INSPVAX,而你的系统尚未安装相关驱动包,就会出现订阅失败的情况。这种现象的根本原因在于:
novatel_msgs命名空间下的自定义消息解决这个问题的核心是完整安装Novatel设备的ROS驱动套件。我们将采用从源码编译的方式,确保所有依赖项正确配置。
首先创建一个独立的工作空间以避免与系统已有包冲突:
bash复制mkdir -p ~/novatel_ws/src
cd ~/novatel_ws/src
catkin_init_workspace
这个驱动包包含关键的novatel_msgs定义:
bash复制cd ~/novatel_ws/src
git clone https://github.com/novatel/novatel_span_driver.git
cd novatel_span_driver
git checkout <适合你ROS版本的分支>
注意:确保分支选择与你的ROS发行版匹配(如melodic、noetic等)
虽然Urbannav数据集不使用OEM7设备,但这个驱动包含必要的依赖:
bash复制cd ~/novatel_ws/src
git clone https://github.com/novatel/novatel_oem7_driver.git
完成依赖下载后,进入编译阶段:
bash复制cd ~/novatel_ws
catkin_make
这个过程中可能会遇到几个典型问题:
如果出现fatal error: novatel_msgs/INSPVAX.h: No such file or directory,说明:
novatel_span_driver未正确克隆或放置位置错误解决方案:
bash复制# 确认目录结构
ls ~/novatel_ws/src/novatel_span_driver/novatel_msgs/msg/INSPVAX.msg
# 重新初始化工作空间
cd ~/novatel_ws
catkin_init_workspace
catkin_make
某些Ubuntu系统可能缺少基础依赖:
bash复制# 安装通用依赖
sudo apt-get install ros-${ROS_DISTRO}-serial ros-${ROS_DISTRO}-tf2-geometry-msgs
# 安装特定依赖
sudo apt-get install libpugixml-dev
成功编译后,按照以下步骤验证:
bash复制# 在新终端中source工作空间
source ~/novatel_ws/devel/setup.bash
# 播放数据集
rosbag play your_urbannav.bag
# 在另一个终端查看话题
rostopic echo /novatel_data/inspvax
如果一切正常,你现在应该能看到实时的INS数据流。典型输出包含以下关键字段:
| 字段名 | 数据类型 | 描述 |
|---|---|---|
| header | std_msgs/Header | 时间戳和坐标系信息 |
| latitude | double | 纬度(度) |
| longitude | double | 经度(度) |
| altitude | double | 海拔高度(m) |
| roll | double | 横滚角(度) |
| pitch | double | 俯仰角(度) |
| azimuth | double | 方位角(度) |
获得原始数据后,你可能需要将其转换为更通用的格式。以下是转换为sensor_msgs/NavSatFix的Python脚本示例:
python复制#!/usr/bin/env python
import rospy
from novatel_msgs.msg import INSPVAX
from sensor_msgs.msg import NavSatFix
def inspvax_callback(msg):
navsat = NavSatFix()
navsat.header = msg.header
navsat.latitude = msg.latitude
navsat.longitude = msg.longitude
navsat.altitude = msg.altitude
pub.publish(navsat)
rospy.init_node('inspvax_to_navsat')
pub = rospy.Publisher('/converted/fix', NavSatFix, queue_size=10)
sub = rospy.Subscriber('/novatel_data/inspvax', INSPVAX, inspvax_callback)
rospy.spin()
将此脚本保存为convert.py并赋予可执行权限后,即可实现实时格式转换。