You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bash脚本启动ROS节点并录制非空Rosbag?

解决Rosbag录制为空的问题

核心问题

你的脚本里roslaunch是阻塞式执行的,它会一直占用当前终端进程,后面的rosbag record根本没机会运行;另外就算改成后台启动,直接录制也可能因为话题未就绪导致无内容。

修正后的脚本

#!/bin/bash

# 后台启动ROS节点,避免阻塞后续命令
roslaunch test test.launch &
LAUNCH_PID=$!

# 等待话题发布:循环检查目标话题是否存在,直到出现再继续
# 这里可以替换成你需要监听的具体话题,比如"/test_topic",用rostopic list判断
until rostopic list | grep -q "/test_topic"; do
    echo "等待话题就绪..."
    sleep 1
done

# 启动rosbag录制,同样后台运行,方便后续定时停止
rosbag record -a &
BAG_PID=$!

# 设置录制时长,比如录制30秒后停止
RECORD_DURATION=30
echo "开始录制,将在${RECORD_DURATION}秒后停止..."
sleep ${RECORD_DURATION}

# 停止录制和节点
kill $BAG_PID
kill $LAUNCH_PID
echo "录制完成,已停止节点和rosbag"

关键说明

  • 后台启动节点:用&把roslaunch放到后台执行,这样后续命令能正常运行,同时记录进程IDLAUNCH_PID方便后续关闭。
  • 精准等待话题:用until循环结合rostopic list和grep检查目标话题是否存在,比固定sleep更可靠,避免等待时间不够或过长。
  • 后台录制+定时停止:把rosbag record也放后台,用sleep控制录制时长,最后通过进程ID杀掉相关进程,保证资源正常释放。

可选优化

  • 如果不确定具体话题,也可以用rostopic info检查是否有消息发布,确保话题真正在发数据:
    until rostopic info /test_topic | grep -q "Published by"; do
        sleep 1
    done
    
  • 可以添加错误处理,比如如果roslaunch启动失败,直接退出脚本:
    if ! roslaunch test test.launch &; then
        echo "节点启动失败,退出脚本"
        exit 1
    fi
    

内容的提问来源于stack exchange,提问作者GutzeK456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:30:59