傻瓜式 shell脚本 ros下播放bag包

目的:Bash脚本是为了在Linux环境下方便地选择和播放ROS bag文件而设计的。

主要功能包括:

全局变量定义:

脚本开始时定义了一个全局变量PID,用来跟踪当前正在运行的rosbag play命令的进程ID(PID)。这使得脚本能够在需要时正确地发送信号来停止rosbag play。

信号处理:

通过trap命令,脚本设置了一个信号处理函数interrupted,这个函数会在用户按下Ctrl+C(发送SIGINT信号)时被调用。此函数检查PID变量,如果它不为0(意味着有一个rosbag play进程正在运行),则向该进程发送SIGINT信号来优雅地中止它,并等待该进程结束。

选择和播放bag文件:

choose_bag_file函数列出当前目录下的所有.bag文件,并让用户通过输入序号来选择一个文件进行播放。用户也可以输入’q’来退出脚本。当用户选择了一个有效的文件后,脚本会用后台模式启动rosbag play来播放选定的文件,并将其PID赋值给全局变量PID。
用户交互:脚本在一个无限循环中运行,允许用户连续选择和播放多个bag文件。在一个bag文件开始播放后,脚本会等待该rosbag play进程结束(用户可以通过Ctrl+C提前终止播放),然后再次显示bag文件列表供用户选择。

退出机制:

用户可以在选择文件时输入’q’来退出脚本。如果在退出时有rosbag play进程正在运行,脚本会先发送SIGINT信号来优雅地终止这个进程,然后退出。

总结

简而言之,这个脚本提供了一个用户友好的方式来浏览、选择和播放当前目录下的ROS bag文件,同时允许通过Ctrl+C随时中断正在播放的bag文件。
在这里插入图片描述

#!/bin/bash

# 定义一个全局变量来跟踪rosbag进程的PID
PID=0

# 信号处理函数,用于当接收到Ctrl+C时中断rosbag
interrupted() {
  if [ $PID -ne 0 ]; then
    echo "捕捉到SIGINT信号,停止'rosbag play'..."
    kill -SIGINT $PID
    wait $PID  # 等待rosbag进程结束
    PID=0
  fi
}

# 初始化trap来捕捉Ctrl+C信号 (SIGINT)
trap interrupted SIGINT

# 函数用于展示bag文件并供用户选择
choose_bag_file() {
  echo "可用的bag文件列表如下:"
  files=(*.bag)
  local i=0
  for file in "${files[@]}"; do
    echo "$((i+1))) $file"
    ((i++))
  done

  echo "请输入文件序号来播放,或输入'q'退出:"
  read -r selection

  if [[ $selection =~ ^[0-9]+$ ]]; then
    if (( selection > 0 && selection <= ${#files[@]} )); then
      local file="${files[$((selection-1))]}"
      echo "正在播放:$file"
      rosbag play -l "$file" 2>/dev/null &
      PID=$!
    else
      echo "无效的输入,请输入列表中的序号。"
    fi
  elif [[ "$selection" == 'q' ]]; then
    if [ $PID -ne 0 ]; then
      kill $PID
      wait $PID
    fi
    exit 0
  else
    echo "无效的输入,请输入数字序号或'q'退出。"
  fi
}

# 主循环
while true; do
  choose_bag_file
  # 如果一个rosbag正在播放, 等待它完成
  if [ $PID -ne 0 ]; then
    wait $PID
    PID=0
  fi
done
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值