welcom ! Handel home

2025年3月4日 星期二

Docker 啟動 osrf/ros:indigo-desktop-full

如果要使用 Docker 啟動 osrf/ros:indigo-desktop-full

並讓 Gazebo 或其他 GUI 應用程式顯示在主機上,

你需要讓 Docker 容器能夠存取 X11 顯示伺服器。


步驟 1:確保 Docker 已安裝

若尚未安裝 Docker,可使用以下指令安裝:

bash
sudo apt update sudo apt install docker.io -y

確保 Docker 服務正在運行:

bash
sudo systemctl start docker sudo systemctl enable docker

步驟 2:允許 X11 顯示 GUI

讓主機允許 docker 容器使用 X11:

bash
xhost +local:docker

你可以驗證顯示變數:

bash
echo $DISPLAY

通常會顯示類似 :0:1,這是 X11 顯示伺服器的地址。


步驟 3:使用 Docker 啟動 ROS Indigo

執行以下指令,並確保:

  • -e DISPLAY=$DISPLAY 讓 Docker 使用 X11
  • -v /tmp/.X11-unix:/tmp/.X11-unix 掛載 X11 介面
  • --net=host 讓 ROS 使用相同的網路環境(可選)

啟動 ROS Indigo 容器

bash
docker run -it --rm \ --net=host \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ --privileged \ osrf/ros:indigo-desktop-full bash

這會進入容器的 bash 介面,你可以在這裡執行 ROS 指令。


步驟 4:測試 GUI(Rviz 或 Gazebo)

進入容器後,啟動 rvizGazebo 來測試顯示功能:

bash
rviz

或者:

bash
gazebo

如果 GUI 成功顯示在主機上,表示 X11 轉發成功。


步驟 5:啟動 ROS Master 並運行 Gazebo

在 Docker 容器內:

bash
roscore

另開一個新的終端機,再次進入 Docker 容器:

bash
docker exec -it <container_id> bash

然後啟動 Gazebo:

bash
roslaunch gazebo_ros empty_world.launch

這樣 Gazebo 會在主機上顯示。


其他技巧

1. 使用 --device 掛載 GPU(如果有 NVIDIA 顯卡)

如果你使用 NVIDIA 顯卡並希望 GPU 加速:

bash
docker run -it --rm \ --gpus all \ --net=host \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ --privileged \ osrf/ros:indigo-desktop-full bash

這樣可以讓 Gazebo 或 RViz 更流暢地運行。

2. 永久允許 X11

如果不想每次都執行 xhost +local:docker,可以在 ~/.bashrc~/.profile 中加入:

bash
xhost +local:docker

這樣每次開機時都會自動允許 X11 共享。


總結

  1. 確保 Docker 已安裝
  2. 允許 Docker 容器使用 X11 (xhost +local:docker)
  3. 使用 docker run 掛載 DISPLAY 和 X11
  4. 測試 GUI 應用程式(Gazebo, RViz)
  5. 啟動 ROS 並運行模擬環境

這樣你就可以在 Docker 容器內運行 ROS Indigo + Gazebo,並在主機顯示介面上查看結果! 🚀

#3===============================================

sudo docker run -it --rm \

    --net=host \

    -e DISPLAY=$DISPLAY \

    -v /tmp/.X11-unix:/tmp/.X11-unix \

    --privileged \

    --name ros_container \

    osrf/ros:indigo-desktop-full bash -c "

    useradd -m -s /bin/bash ubuntu && \

    echo 'ubuntu:ubuntu' | chpasswd && \

    su - ubuntu"

#4===============================================
sudo docker run -it --rm \
    --gpus all \
    --net=host \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    --privileged \
    osrf/ros:indigo-desktop-full bash -c "
    useradd -m -s /bin/bash ubuntu && \
    echo 'ubuntu:ubuntu' | chpasswd && \
    su - ubuntu"
#5===============================================
sudo docker run -it --rm \
    --net=host \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $(pwd)/data:/home/ubuntu/data \
    --privileged \
    --name ros_container \
    osrf/ros:indigo-desktop-full bash -c "
    useradd -m -s /bin/bash ubuntu && \
    echo 'ubuntu:ubuntu' | chpasswd && \
    chown -R ubuntu:ubuntu /home/ubuntu/data && \
    su - ubuntu"

#6======================================================
sudo docker run -it --rm \
    --net=host \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $(pwd)/data:/home/ubuntu/data \
    --privileged \
    --name ros_container \
    osrf/ros:indigo-desktop-full bash

#===========================
which roscore
source /opt/ros/indigo/setup.bash
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc

sudo apt-get update
sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential

ps aux | grep roscore

pkill -f roscore
roscore

echo $ROS_MASTER_URI

http://localhost:11311

#=======================================


 apt update && apt install -y \

  libgl1-mesa-glx \

  libgl1-mesa-dri \

  libqt5gui5 \

  mesa-utils \

  x11-apps


解決方案  前提條件  你需要確保宿主機上已經安裝了 X11 服務器(例如,Linux 上通常是 Xorg)。 

 

你需要從宿主機將顯示環境傳遞到容器中。 

 步驟 1:檢查宿主機的顯示環境 

在宿主機上運行: 

bash 

 echo $DISPLAY 

 

通常會輸出 :0 或類似的值。如果沒有輸出,說明宿主機的 X11 環境尚未正確設置,需先解決這部分。 

步驟 2:啟動 Docker 容器時傳遞顯示環境 

啟動容器時,需要將宿主機的 DISPLAY 環境變量和 X11 套接字(socket)共享給容器。假設你使用的是 ros:noetic 映像,命令如下: 

bash 

 docker run -it \

  --env "DISPLAY=$DISPLAY" \

  --volume "/tmp/.X11-unix:/tmp/.X11-unix" \

  --name ros_container \

  ros:noetic 

 

--env "DISPLAY=$DISPLAY":將宿主機的顯示環境傳遞到容器。 

 

--volume "/tmp/.X11-unix:/tmp/.X11-unix":共享 X11 套接字,讓容器可以與宿主機的 X 服務器通信。 

 步驟 3:安裝必要的圖形庫 

ros:noetic 映像可能缺少一些運行 RViz 和 Gazebo 所需的圖形庫。你需要在容器中安裝它們。進入容器後運行: 

bash 

 apt update && apt install -y \

  libgl1-mesa-glx \

  libgl1-mesa-dri \

  libqt5gui5 \

  mesa-utils \

  x11-apps 

 

libgl1-mesa-glx 和 libgl1-mesa-dri:提供 OpenGL 支持。 

 

libqt5gui5:提供 Qt 的 GUI 支持。 

 

mesa-utils 和 x11-apps:用於測試圖形環境。 

 步驟 4:測試圖形環境 

在容器中運行以下命令測試 X11 是否正常工作: 

bash 

 xclock 

 

如果一個時鐘窗口彈出,說明 X11 配置成功。如果失敗,會有進一步的錯誤訊息可以排查。 

步驟 5:啟動 RViz 或 Gazebo 

現在嘗試啟動 RViz 或 Gazebo: 

bash 

 rosrun rviz rviz 

 

或 

bash 

 rosrun gazebo_ros gazebo











沒有留言: