Files
uzh-fpv-sv-test/start_ros_container.sh
2026-05-29 18:49:01 +08:00

143 lines
4.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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}"