目的: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