#!/bin/bash # ROS Podman容器启动脚本 # 作者自动生成 # 功能:启动ROS容器,挂载当前目录,设置环境变量,安装pip3,错误不退出 set +e # 遇到错误时不退出 # 颜色定义(用于美化输出) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 配置参数 CONTAINER_IMAGE="69a38b2c0905" # ROS Noetic Desktop Full镜像ID WORKSPACE_DIR="$(pwd)" # 当前工作目录 MOUNT_POINT="/mnt" # 容器内挂载点 # ROS环境变量设置 ROS_ENV_VARS=( "ROS_DISTRO=noetic" "ROS_PYTHON_VERSION=3" "ROS_VERSION=1" "ROS_ETC_DIR=/opt/ros/noetic/etc/ros" "ROS_ROOT=/opt/ros/noetic/share/ros" "ROS_PACKAGE_PATH=/opt/ros/noetic/share" "PYTHONIOENCODING=utf-8" "TZ=Asia/Shanghai" ) echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}ROS Podman容器启动脚本${NC}" echo -e "${GREEN}========================================${NC}" # 检查Podman是否安装 if ! command -v podman &> /dev/null; then echo -e "${RED}错误: Podman未安装,请先安装Podman${NC}" echo -e "${YELLOW}Ubuntu/Debian: sudo apt-get install podman${NC}" echo -e "${YELLOW}CentOS/RHEL: sudo yum install podman${NC}" exit 1 fi # 检查镜像是否存在 echo -e "${YELLOW}检查容器镜像...${NC}" if ! podman image exists $CONTAINER_IMAGE; then echo -e "${RED}警告: 镜像 $CONTAINER_IMAGE 不存在${NC}" echo -e "${YELLOW}可用的ROS镜像:${NC}" podman image list | grep ros echo -e "${YELLOW}继续使用指定镜像,如果启动失败请更换镜像ID${NC}" fi # 构建环境变量参数 ENV_ARGS="" for env_var in "${ROS_ENV_VARS[@]}"; do ENV_ARGS="$ENV_ARGS -e $env_var" done # 添加额外的环境变量(如果用户需要) ENV_ARGS="$ENV_ARGS -e DISPLAY=$DISPLAY" # 支持GUI应用 ENV_ARGS="$ENV_ARGS -e QT_X11_NO_MITSHM=1" # X11支持(用于GUI应用) if [ -n "$DISPLAY" ]; then echo -e "${YELLOW}启用X11支持,用于GUI应用...${NC}" xhost +local:root 2>/dev/null ENV_ARGS="$ENV_ARGS --volume /tmp/.X11-unix:/tmp/.X11-unix:rw" fi echo -e "${GREEN}配置信息:${NC}" echo -e " 工作目录: $WORKSPACE_DIR" echo -e " 挂载点: $MOUNT_POINT" echo -e " 镜像ID: $CONTAINER_IMAGE" echo -e " ROS发行版: noetic" echo -e "${YELLOW}正在启动容器...${NC}" # 启动容器的命令 # 使用bash -c来执行多个命令,确保pip3安装即使失败也不会退出容器 PODMAN_CMD="podman run -it \ --rm \ --name ros_noetic_container_$(date +%s) \ -v $WORKSPACE_DIR:$MOUNT_POINT:rw \ $ENV_ARGS \ $CONTAINER_IMAGE \ /bin/bash -c \"\ echo '========================================' && \ echo 'ROS容器已启动' && \ echo '========================================' && \ echo '工作目录已挂载到: $MOUNT_POINT' && \ echo '当前ROS版本: ' && \ echo \\\$ROS_DISTRO && \ echo '' && \ echo '正在检查并安装pip3...' && \ if command -v pip3 &> /dev/null; then \ echo 'pip3已安装,版本: ' && \ pip3 --version; \ else \ echo 'pip3未安装,正在安装...' && \ apt-get update 2>/dev/null && \ apt-get install -y python3-pip 2>/dev/null; \ if [ \\\$? -eq 0 ]; then \ echo 'pip3安装成功!'; \ pip3 --version; \ else \ echo '警告: pip3安装失败,请手动安装'; \ fi; \ fi && \ echo '' && \ echo '========================================' && \ echo '环境变量已设置:' && \ env | grep ROS_ && \ echo '========================================' && \ echo '容器已准备就绪,进入交互式shell...' && \ echo '提示: 输入exit退出容器' && \ echo '========================================' && \ pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/simple && \ source /ros_entrypoint.sh && \ cd $MOUNT_POINT && \ exec /bin/bash -l\"" # 执行命令 echo -e "${GREEN}执行启动命令...${NC}" # echo -e "${YELLOW}命令详情:${NC}" # echo "$PODMAN_CMD" echo -e "${YELLOW}========================================${NC}" # 运行容器 eval $PODMAN_CMD # 检查退出状态 if [ $? -ne 0 ]; then echo -e "${RED}容器已退出(退出码非0)${NC}" else echo -e "${GREEN}容器正常退出${NC}" fi # 清理X11权限 if [ -n "$DISPLAY" ]; then xhost -local:root 2>/dev/null fi echo -e "${GREEN}脚本执行完成${NC}"