Files
FaRui_Campus_ADS/slave/calibrate_accel_brake_map.sh
T

276 lines
8.6 KiB
Bash
Executable File

#!/bin/bash
#===============================================================================
# 加减速映射表标定启动脚本
# 位置: /home/nvidia/FaRui/v3.1/calibrate_accel_brake_map.sh
#===============================================================================
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 默认参数
VEHICLE_MODEL="ecar_vehicle"
USE_SIM_TIME="false"
RVIZ="true"
RECORD_BAG="false"
UPDATE_METHOD="update_offset_four_cell_around"
# 帮助信息
show_help() {
echo "============================================================"
echo " 加减速映射表标定工具"
echo "============================================================"
echo ""
echo "用法: ./calibrate_accel_brake_map.sh [选项]"
echo ""
echo "选项:"
echo " -m, --model <车型> 车辆模型名称 (默认: ecar404)"
echo " -s, --sim-time 使用仿真时间 (rosbag回放时使用)"
echo " -n, --no-rviz 不启动RViz"
echo " -r, --record 录制数据到rosbag"
echo " -c, --cell 使用逐网格标定算法 (默认: 四邻域)"
echo " -h, --help 显示此帮助信息"
echo ""
echo "标定模式:"
echo " 1. 实车标定: ./calibrate_accel_brake_map.sh"
echo " 2. rosbag标定: ./calibrate_accel_brake_map.sh -s"
echo " 3. 高精度标定: ./calibrate_accel_brake_map.sh -c"
echo ""
echo "============================================================"
}
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
-m|--model)
VEHICLE_MODEL="$2"
shift 2
;;
-s|--sim-time)
USE_SIM_TIME="true"
shift
;;
-n|--no-rviz)
RVIZ="false"
shift
;;
-r|--record)
RECORD_BAG="true"
shift
;;
-c|--cell)
UPDATE_METHOD="update_offset_each_cell"
shift
;;
-h|--help)
show_help
exit 0
;;
*)
echo -e "${RED}错误: 未知参数 $1${NC}"
show_help
exit 1
;;
esac
done
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
echo "============================================================"
echo -e "${BLUE} 加减速映射表标定工具${NC}"
echo "============================================================"
echo ""
# 检查工作空间
if [ ! -f "install/setup.bash" ]; then
echo -e "${RED}错误: 未找到 install/setup.bash${NC}"
echo "请先编译工作空间: colcon build"
exit 1
fi
# Source 环境
echo -e "${BLUE}[1/6] 加载 ROS2 环境...${NC}"
source /opt/ros/humble/setup.bash
source install/setup.bash
# 检查 launch 文件是否存在
LAUNCH_FILE="src/Launcher/farui_launch/launch/calibration/accel_brake_map_calibration.launch.xml"
if [ ! -f "$LAUNCH_FILE" ]; then
echo -e "${RED}错误: 未找到标定 launch 文件${NC}"
echo "路径: $LAUNCH_FILE"
exit 1
fi
# 创建标定结果目录
CALIBRATION_DIR="$SCRIPT_DIR/src/Launcher/farui_launch/config/vehicle/calibrated_maps"
mkdir -p "$CALIBRATION_DIR"
echo -e "${GREEN}✓ 环境加载完成${NC}"
echo ""
# 显示配置信息
echo -e "${BLUE}[2/6] 标定配置信息:${NC}"
echo " 车辆模型: $VEHICLE_MODEL"
echo " 仿真时间: $USE_SIM_TIME"
echo " RViz可视化: $RVIZ"
echo " 录制数据: $RECORD_BAG"
echo " 标定算法: $UPDATE_METHOD"
echo " 结果保存路径: $CALIBRATION_DIR"
echo ""
# 检查车辆模型是否存在
VEHICLE_PKG="${VEHICLE_MODEL}_description"
if ! ros2 pkg list | grep "^$VEHICLE_PKG$" > /dev/null 2>&1; then
echo -e "${YELLOW}警告: 未找到车辆模型包 $VEHICLE_PKG${NC}"
echo "可用的车辆模型:"
ros2 pkg list | grep "_description$" | sed 's/_description$//' | head -10
echo ""
read -p "是否继续? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# 如果录制数据,创建bag目录
if [ "$RECORD_BAG" = "true" ]; then
BAG_DIR="$SCRIPT_DIR/calibration_bags"
mkdir -p "$BAG_DIR"
BAG_NAME="calibration_$(date +%Y%m%d_%H%M%S)"
fi
# 启动标定
echo -e "${BLUE}[3/6] 启动标定节点...${NC}"
echo ""
echo -e "${YELLOW}提示: 标定过程中请进行以下操作:${NC}"
echo " 1. 确保车辆在安全开阔场地"
echo " 2. 使用遥控器控制车辆"
echo " 3. 平稳加速、减速,覆盖各种速度"
echo " 4. 观察RViz中单元格变红表示数据充足"
echo " 5. 重点关注 0-6m/s 低速区间"
echo ""
read -p "按回车键开始标定,或按 Ctrl+C 取消..."
echo ""
# 构建 launch 参数
LAUNCH_ARGS="vehicle_model:=$VEHICLE_MODEL"
LAUNCH_ARGS="$LAUNCH_ARGS use_sim_time:=$USE_SIM_TIME"
LAUNCH_ARGS="$LAUNCH_ARGS rviz:=$RVIZ"
LAUNCH_ARGS="$LAUNCH_ARGS update_method:=$UPDATE_METHOD"
LAUNCH_ARGS="$LAUNCH_ARGS progress_file_output:=true"
LAUNCH_ARGS="$LAUNCH_ARGS pedal_accel_graph_output:=true"
# 启动 rosbag 录制(后台)
if [ "$RECORD_BAG" = "true" ]; then
echo -e "${BLUE}[4/6] 启动数据录制...${NC}"
ros2 bag record -o "$BAG_DIR/$BAG_NAME" \
/vehicle/status/velocity_status \
/vehicle/status/steering_status \
/vehicle/status/actuation_status \
/control/command/actuation_cmd \
/tf \
/tf_static \
&
BAG_PID=$!
echo -e "${GREEN}✓ 数据录制已启动,PID: $BAG_PID${NC}"
echo " 保存路径: $BAG_DIR/$BAG_NAME"
echo ""
fi
# 启动标定
echo -e "${BLUE}[5/6] 启动标定器...${NC}"
echo " 命令: ros2 launch farui_launch accel_brake_map_calibration.launch.xml $LAUNCH_ARGS"
echo ""
# 捕获 Ctrl+C 信号
cleanup() {
echo ""
echo -e "${YELLOW}接收到中断信号,正在清理...${NC}"
if [ "$RECORD_BAG" = "true" ] && [ -n "$BAG_PID" ]; then
echo "停止数据录制..."
kill $BAG_PID 2>/dev/null || true
wait $BAG_PID 2>/dev/null || true
fi
echo -e "${GREEN}✓ 已清理${NC}"
exit 0
}
trap cleanup SIGINT SIGTERM
# 启动标定节点
ros2 launch farui_launch accel_brake_map_calibration.launch.xml $LAUNCH_ARGS &
LAUNCH_PID=$!
# 等待标定节点启动
sleep 3
# 检查节点是否正常运行
if ! ps -p $LAUNCH_PID > /dev/null; then
echo -e "${RED}错误: 标定节点启动失败${NC}"
exit 1
fi
echo -e "${GREEN}✓ 标定节点已启动${NC}"
echo ""
# 显示操作提示
echo "============================================================"
echo -e "${BLUE} 标定操作指南${NC}"
echo "============================================================"
echo ""
echo "1. ${YELLOW}驾驶车辆${NC}: 使用遥控器控制车辆"
echo " - 平稳加速、减速"
echo " - 覆盖 0-最大车速 范围"
echo " - 覆盖 0-最大踏板开度 范围"
echo ""
echo "2. ${YELLOW}观察进度${NC}: 查看RViz可视化"
echo " - 灰色: 无数据"
echo " - 蓝色→红色: 数据逐渐充足"
echo " - 目标: 所有单元格变红"
echo ""
echo "3. ${YELLOW}保存结果${NC}: 新开终端执行"
echo " ros2 service call /accel_brake_map_calibrator/update_map_dir \\"
echo " tier4_vehicle_msgs/srv/UpdateAccelBrakeMap \\"
echo " \"path: '$CALIBRATION_DIR'\""
echo ""
echo "4. ${YELLOW}查看误差${NC}:"
echo " ros2 topic echo /accel_brake_map_calibrator/output/map_error_ratio"
echo " (比值 < 0.7 表示标定有效)"
echo ""
echo "5. ${YELLOW}结束标定${NC}: 在此窗口按 Ctrl+C"
echo ""
echo "============================================================"
echo ""
# 等待用户结束
wait $LAUNCH_PID
# 标定结束后的提示
echo ""
echo "============================================================"
echo -e "${BLUE} 标定已结束${NC}"
echo "============================================================"
echo ""
echo -e "${GREEN}标定结果保存在:${NC}"
echo " $CALIBRATION_DIR/"
echo ""
echo "生成的文件:"
ls -lh "$CALIBRATION_DIR/" 2>/dev/null || echo " (目录为空,请检查是否已调用保存服务)"
echo ""
echo "下一步:"
echo " 1. 检查 accel_map.csv 和 brake_map.csv 是否生成"
echo " 2. 修改 raw_vehicle_cmd_converter 配置使用新表"
echo " 3. 重启 Autoware 验证效果"
echo ""
echo "============================================================"
# ros2 service call /accel_brake_map_calibrator/input/update_map_dir tier4_vehicle_msgs/srv/UpdateAccelBrakeMap "path: '/home/nvidia/FaRui-test/v3.2/src/Launcher/farui_launch/config/vehicle/calibrated_maps'"