ROS2与Foxglove数据可视化联调:Ros2 Humble 安装 + 机器人假数据生成调试 + Foxglove 连接完整教程

本文基于 Ubuntu 22.04 系统,包含 ROS2 环境部署、模拟数据发布、可视化工具连接全流程,命令可直接复制执行。


一、环境准备:安装 ROS2 Humble

Humble 为 LTS 长期支持版,稳定性最优,逐行执行以下命令:

  1. 安装依赖与配置软件源
bash 复制代码
# 安装基础依赖
sudo apt update && sudo apt install curl gnupg lsb-release -y

# 添加 ROS2 官方密钥
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdist/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# 添加 ROS2 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
  1. 安装 ROS2 核心包
bash 复制代码
sudo apt update
sudo apt install ros-humble-desktop -y
sudo apt install ros-humble-rosbag2 ros-humble-rviz2 -y
  1. 配置环境变量(永久生效)
bash 复制代码
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
  1. 验证安装成功
bash 复制代码
echo $ROS_DISTRO
✅ 输出 humble 代表安装成功

二、修复 ROS2 DDS 中间件报错

若执行 ros2 --version 出现以下报错:

bash 复制代码

执行以下命令一键修复:

bash 复制代码
# 安装默认 Cyclone DDS 中间件
sudo apt install ros-humble-rmw-cyclonedds-cpp -y

# 安装稳定备用 FastDDS 中间件
sudo apt install ros-humble-rmw-fastrtps-cpp -y

# 配置默认 DDS 并刷新环境
echo "export RMW_IMPLEMENTATION=rmw_fastrtps_cpp" >> ~/.bashrc
source ~/.bashrc

三、创建 ROS2 工作空间与假数据功能包

  1. 创建工作空间目录
bash 复制代码
# 创建工作空间 + 源码文件夹
mkdir -p ~/proj/lichtblick/ros2_ws/src

# 进入源码目录
cd ~/proj/lichtblick/ros2_ws/src
  1. 创建机器人假数据功能包
bash 复制代码
ros2 pkg create --dependencies rclpy std_msgs sensor_msgs geometry_msgs nav_msgs --node-name fake_data_publisher robot_fake_data
✅ 输出 creating package 'robot_fake_data' successfully 代表创建成功

四、编写假数据发布代码

  1. 打开代码文件
bash 复制代码
gedit ~/proj/lichtblick/ros2_ws/src/robot_fake_data/robot_fake_data/fake_data_publisher.py
  1. 替换为完整模拟数据代码
python 复制代码
import rclpy
from rclpy.node import Node
import math
import random
from std_msgs.msg import String
from sensor_msgs.msg import Imu, LaserScan
from geometry_msgs.msg import Twist
from nav_msgs.msg import Odometry

# 机器人模拟数据发布节点
class FakeRobotDataPublisher(Node):
    def __init__(self):
        super().__init__('fake_robot_data_node')
        # 10Hz 定时发布数据
        self.timer = self.create_timer(0.1, self.timer_callback)
        
        # 创建话题发布者
        self.status_pub = self.create_publisher(String, '/robot/status', 10)
        self.imu_pub = self.create_publisher(Imu, '/imu/data', 10)
        self.laser_pub = self.create_publisher(LaserScan, '/scan', 10)
        self.odom_pub = self.create_publisher(Odometry, '/odom', 10)
        self.cmd_vel_pub = self.create_publisher(Twist, '/cmd_vel', 10)

        self.get_logger().info('✅ 机器人假数据启动成功!正在发布数据...')

    # 获取时间戳
    def get_stamp(self):
        return self.get_clock().now().to_msg()

    # 定时发布所有数据
    def timer_callback(self):
        # 1. 机器人状态文本
        status = String()
        status.data = f"机器人正常运行 | 电量:{random.randint(85, 100)}%"
        self.status_pub.publish(status)

        # 2. IMU 惯性测量数据
        imu = Imu()
        imu.header.stamp = self.get_stamp()
        imu.header.frame_id = "imu_link"
        imu.angular_velocity.z = random.uniform(-0.3, 0.3)
        imu.linear_acceleration.z = 9.81
        self.imu_pub.publish(imu)

        # 3. 激光雷达数据
        scan = LaserScan()
        scan.header.stamp = self.get_stamp()
        scan.header.frame_id = "laser_link"
        scan.angle_min = -math.pi
        scan.angle_max = math.pi
        scan.angle_increment = math.pi / 360
        scan.range_min = 0.1
        scan.range_max = 10.0
        scan.ranges = [random.uniform(1.0, 5.0) for _ in range(360)]
        self.laser_pub.publish(scan)

        # 4. 机器人里程计(位置数据)
        odom = Odometry()
        odom.header.stamp = self.get_stamp()
        odom.header.frame_id = "odom"
        odom.pose.pose.position.x = random.uniform(0, 2)
        odom.pose.pose.position.y = random.uniform(0, 2)
        self.odom_pub.publish(odom)

        # 5. 运动控制指令
        vel = Twist()
        vel.linear.x = 0.2
        vel.angular.z = random.uniform(-0.1, 0.1)
        self.cmd_vel_pub.publish(vel)

def main(args=None):
    rclpy.init(args=args)
    node = FakeRobotDataPublisher()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

五、编译 ROS2 工作空间

bash 复制代码
# 进入工作空间根目录
cd ~/proj/lichtblick/ros2_ws

# 清理旧编译文件
rm -rf build install log

# 编译功能包
colcon build
✅ 输出 Finished <<< robot_fake_data 代表编译成功
# 加载编译环境
source install/setup.bash

六、启动机器人假数据节点

方式 1:ROS2 标准启动

bash 复制代码
ros2 run robot_fake_data fake_data_publisher

方式 2:Python 直接启动(解决闪退 / XML 配置问题)

bash 复制代码
python3 ~/proj/lichtblick/ros2_ws/src/robot_fake_data/robot_fake_data/fake_data_publisher.py

七、验证假数据发布(新开终端执行)

bash 复制代码
# 刷新环境
source ~/.bashrc

# 查看所有发布话题
ros2 topic list

# 查看运行节点
ros2 node list

查看tpoic数据

bash 复制代码
# 实时查看 IMU 数据
ros2 topic echo /imu/data

# 实时查看激光雷达数据
ros2 topic echo /scan

八、连接Foxglove 可视化

  1. 关闭所有 Foxglove进程
  2. 打开Foxglove选择连接方式:Connection
  3. 输入连接地址:
    ws://localhost:8765
  4. 进入Foxglove,新增plot panel,并设置Serises为随便一个传感器数据,就能在plot窗口中看到折现了

九、消除消息解析报错

若Logo出现消息解析报错,

bash 复制代码
[ERROR][6:04:41.090 PM CST][foxglove_bridge]: Failed to load schemaDefinition for topic "/zos/driving/hmi/adas_settings" (ros_msg/zos_driving/AdasSetting): Invalid package resource name: ros_msg/zos_driving/AdasSetting

安装依赖包即可修复:

bash 复制代码
sudo apt install ros-humble-foxglove-msgs -y
相关推荐
IntMainJhy1 小时前
【flutter for open harmony】第三方库 Flutter运动计时器的鸿蒙化适配与实战指南
flutter·华为·信息可视化·数据库开发·harmonyos
IntMainJhy1 小时前
【flutter for open harmony】 第三方库 Flutter饮食记录的鸿蒙化适配与实战指南
flutter·华为·信息可视化·数据库开发·harmonyos
Lanren的编程日记1 小时前
Flutter 鸿蒙应用数据统计分析功能实战:数据统计+数据可视化+报表生成,打造全链路数据分析能力
flutter·华为·信息可视化·harmonyos
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月29日
大数据·人工智能·python·信息可视化·自然语言处理
知识分享小能手1 小时前
R语言入门学习教程,从入门到精通,R语言数值关系数据可视化 - 完整知识点(5)
学习·信息可视化·r语言
鲁邦通物联网3 小时前
架构实战:分布式 机器人梯控 系统的边缘解耦与状态机设计
机器人·机器人梯控·agv梯控·非侵入式采集·机器人乘梯·机器人自主乘梯·agv机器人梯控
kobesdu10 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
workflower10 小时前
具身智能行业应用-生活服务业
大数据·人工智能·机器人·动态规划·生活
xwz小王子12 小时前
Science Robotics 让机器人学会“削果皮”:一种曲面物体操作任务转移的新方法
人工智能·机器人