welcom ! Handel home

顯示具有 ROS 標籤的文章。 顯示所有文章
顯示具有 ROS 標籤的文章。 顯示所有文章

2025年11月13日 星期四

ROS1 catkin build 介紹



🛠️ catkin build 介紹

catkin build 是一個用於建構(build)ROS (Robot Operating System) 專案的指令。它是 catkin_make 的一個更現代、更強大的替代品,設計用於建構大型的 Catkin 工作空間(workspace)。

核心功能與優勢

  1. 平行建構 (Parallelism):

    • catkin build 最重要的優勢之一是它能自動利用您的電腦的多核處理器,同時建構多個套件 (packages)。這顯著加快了大型工作空間的建構時間。

  2. 單一套件建構 (Isolating Package Builds):

    • 如果某個套件建構失敗,catkin build 通常可以更清楚地指示是哪個套件出錯,而且只會嘗試重新建構失敗的套件及其相依項,而不是整個工作空間。

  3. 更清晰的輸出 (Better Output):

    • 它提供了一個更簡潔、更具組織性的終端機輸出,讓您可以一目了然地看到哪些套件正在建構、哪些已完成,以及建構所需的時間。

  4. 隔離的建構空間 (Isolated Build Space):

    • catkin build 會在工作空間(通常是 src 資料夾的父目錄)中建立一個獨立的 build 資料夾來存放所有中間建構檔案,而不是像 catkin_make 一樣將所有東西都放在一個 devel 資料夾中。

    • 它還提供一個隔離的安裝空間 (isolated install space),這對於建立發行版或測試單一套件的安裝效果很有幫助。

基本使用

1. 安裝 (如果尚未安裝)

catkin build 並不屬於 ROS 的核心安裝,但通常會隨 ROS 系統一起安裝。如果沒有,您可能需要安裝它:

Bash
sudo apt update
sudo apt install python3-catkin-tools

或對於舊版 ROS (如 Melodic/Kinetic):

Bash
sudo apt update
sudo apt install python-catkin-tools

2. 建立 Catkin 工作空間

您需要一個標準的 Catkin 工作空間結構。

Bash
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace # 建立一個空的 CATKIN_IGNORE 檔案
cd ..

3. 執行建構

在您的工作空間根目錄(例如 ~/catkin_ws)下執行:

Bash
catkin build
  • 建構特定的套件:

    Bash
    catkin build <package_name>
    
  • 清除並重新建構 (Clean and Build):

    Bash
    catkin clean # 清除建構檔案
    catkin build
    

4. 設定環境

建構完成後,您需要將新的執行檔路徑加入到您的終端機環境中,這樣您才能執行您建構的節點 (nodes):

Bash
source ~/catkin_ws/devel/setup.bash
# 如果您使用了 --install 選項,則改為
# source ~/catkin_ws/install/setup.bash

總結

特性catkin buildcatkin_make
平行建構預設啟用,效率更高需手動使用 -j 參數
工作空間結構有單獨的 build 資料夾,更乾淨建構結果都放在 devel
指令介面提供更多選項,更清晰的輸出較為基本
推薦用途推薦用於所有 Catkin 工作空間適用於簡單、單一套件的建構

您是否希望我進一步介紹 catkin build 的常用選項(例如:-j--install--cmake-args)或是說明 如何將現有的 catkin_make 工作空間轉換為使用 catkin build 呢?

2025年6月24日 星期二

ros_maze_house.stl 模型 load by ros2 gazebo x11

ros_maze_house.stl 模型

markdown
ros_maze_house/ └── meshes/ └── ros_maze_house.stl

接下來提供如何在 ROS 2 + Gazebo 11(Focal, Foxy 適用) 的 Docker 環境中,將該 STL 模型載入 Gazebo,並建立 ROS 套件的完整流程。


✅ 一、建立 ROS 2 套件 ros_maze_house_world

1. 建議結構

bash
ros2_ws/ └── src/ └── ros_maze_house_world/ ├── launch/ │ └── maze_world.launch.py ├── models/ │ └── maze_house/ │ ├── model.config │ ├── model.sdf │ └── meshes/ │ └── ros_maze_house.stl └── worlds/ └── maze_house.world

✅ 二、編寫模型 SDF 檔案 model.sdf

xml
<!-- models/maze_house/model.sdf --> <sdf version="1.6"> <model name="maze_house"> <static>true</static> <link name="maze_link"> <visual name="visual"> <geometry> <mesh> <uri>model://maze_house/meshes/ros_maze_house.stl</uri> <scale>1 1 1</scale> </mesh> </geometry> </visual> <collision name="collision"> <geometry> <mesh> <uri>model://maze_house/meshes/ros_maze_house.stl</uri> <scale>1 1 1</scale> </mesh> </geometry> </collision> </link> </model> </sdf>

✅ 三、建立 model.config

xml
<model> <name>maze_house</name> <version>1.0</version> <sdf version="1.6">model.sdf</sdf> <author> <name>ros-user</name> <email>ros@example.com</email> </author> <description>A STL-based maze model</description> </model>

✅ 四、建立 Gazebo 世界檔 maze_house.world

xml
<sdf version="1.6"> <world name="default"> <include> <uri>model://sun</uri> </include> <include> <uri>model://ground_plane</uri> </include> <include> <uri>model://maze_house</uri> </include> </world> </sdf>

✅ 五、建立 ROS 2 Launch 檔 maze_world.launch.py

python
from launch import LaunchDescription from launch.actions import ExecuteProcess from ament_index_python.packages import get_package_share_directory import os def generate_launch_description(): pkg_path = get_package_share_directory('ros_maze_house_world') world_path = os.path.join(pkg_path, 'worlds', 'maze_house.world') return LaunchDescription([ ExecuteProcess( cmd=[ 'gazebo', '--verbose', world_path, '-s', 'libgazebo_ros_factory.so' ], output='screen' ) ])

✅ 六、使用 Docker 建立 ROS 2 + Gazebo 環境

bash
docker run -it --rm \ --name ros2_gazebo_maze \ --env="DISPLAY" \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --volume="$HOME/.Xauthority:/root/.Xauthority:rw" \ --volume="$HOME/ros2_ws:/root/ros2_ws:rw" \ --net=host \ osrf/ros:foxy-desktop

⚠️ 若用 ROS 2 Humble 請使用 osrf/ros:humble-desktop,Gazebo 版本需切換為 Fortress。


✅ 七、Docker 容器中執行步驟

bash
cd /root/ros2_ws source /opt/ros/foxy/setup.bash colcon build --packages-select ros_maze_house_world source install/setup.bash ros2 launch ros_maze_house_world maze_world.launch.py

✅ 八、設定 GAZEBO_MODEL_PATH(避免模型找不到)

bash
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/root/ros2_ws/install/ros_maze_house_world/share/ros_maze_house_world/models


2025年4月17日 星期四

Ubuntu 上安裝 NVIDIA Container Toolkit 的完整流程

 在 Ubuntu 上安裝 NVIDIA Container Toolkit 的完整流程,讓 Docker 容器可以使用 GPU(如:NVIDIA Jetson、RTX 顯示卡、CUDA 開發等)。


✅ 指令逐步說明:


🔹 1. 加入 NVIDIA GPG 金鑰(供 apt 驗證)

bash
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \ | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

這會下載 GPG 金鑰並儲存為 .gpg 格式到 /usr/share/keyrings
→ 供接下來 apt repository 使用,避免「未簽署的來源」警告。


🔹 2. 加入 NVIDIA APT 套件來源清單(stable 版本)

bash
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \ | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \ | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

這段會:

  • 下載官方套件來源 list 檔

  • 插入 GPG key 使用的 signed-by 參數

  • 儲存成 /etc/apt/sources.list.d/nvidia-container-toolkit.list


🔹 3. 啟用 experimental 測試源(某些版本預設註解)

bash
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

這會移除 # 註解符號,啟用套件清單中名為 experimental 的項目(若有)


🔹 4. 更新 apt 套件清單

bash
sudo apt-get update

🔹 5. 安裝 NVIDIA Container Toolkit 主套件

bash
sudo apt-get install -y nvidia-container-toolkit

這會安裝:

  • /usr/bin/nvidia-container-runtime

  • GPU runtime hooks

  • Docker engine GPU 插件


🔹 6. 重新啟動 Docker 服務

bash
sudo systemctl restart docker

→ 確保 docker 套用新的 runtime 設定
→ 接下來 docker run --gpus all 就可以正常啟用 NVIDIA GPU


✅ 檢查是否安裝成功

bash
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

如果看到 nvidia-smi 顯示 GPU 列表,代表一切設定完成 ✅


📌 延伸建議:加入預設 docker 設定

確認 /etc/docker/daemon.json 包含:

json
{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia" }

如果你常跑 GPU 容器,這樣可自動使用 NVIDIA runtime。


#restart docker and test docker gpu

$sudo systemctl restart docker

$docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

$nvidia-smi
$docker info | grep -i nvidia




2025年4月15日 星期二

GPU + USB + micro-ROS 的 docker-compose.yml + Dockerfile 套件組

 以下是完整的 ROS 2 Humble 環境組合:

🎯 支援 NVIDIA GPU、USB 裝置(如 /dev/ttyACM0)、micro-ROS Agent、自訂 ubuntu 用戶,並透過 docker-compose 一鍵啟動


📁 目錄結構

ros2_microros_gpu_docker/ ├── docker-compose.yml ├── Dockerfile └── entrypoint.sh

📦 Dockerfile(支援 GPU + ROS2 + micro-ROS agent)

Dockerfile
FROM osrf/ros:humble-desktop-full # 建立使用者 RUN useradd -ms /bin/bash ubuntu && echo "ubuntu:ubuntu" | chpasswd && adduser ubuntu sudo # 安裝常用工具與 micro-ROS 相依套件 RUN apt update && apt install -y \ build-essential python3-pip \ python3-colcon-common-extensions \ git curl wget nano tmux net-tools iputils-ping \ libboost-system-dev libtinyxml2-dev libyaml-cpp-dev \ && rm -rf /var/lib/apt/lists/* # 建立 micro-ROS agent 工作空間 USER ubuntu WORKDIR /home/ubuntu/data/uros_ws RUN mkdir -p src && cd src && \ git clone -b humble https://github.com/micro-ROS/micro-ROS-Agent.git && \ git clone -b humble https://github.com/micro-ROS/micro_ros_msgs.git SHELL ["/bin/bash", "-c"] RUN source /opt/ros/humble/setup.bash && \ colcon build # 自動載入 ROS 與 micro-ROS 環境 RUN echo "source /opt/ros/humble/setup.bash" >> /home/ubuntu/.bashrc && \ echo "source /home/ubuntu/data/uros_ws/install/setup.bash" >> /home/ubuntu/.bashrc COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]

🛠 entrypoint.sh(進入後切換成 ubuntu 使用者)

bash
#!/bin/bash exec sudo -u ubuntu -H bash

🧩 docker-compose.yml(支援 GPU + USB + X11 + Volume)

yaml
version: '3.9' services: ros2dev: build: . container_name: ros2dev network_mode: host privileged: true environment: - DISPLAY=${DISPLAY} - QT_X11_NO_MITSHM=1 volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw - ./data:/home/ubuntu/data devices: - /dev/ttyACM0:/dev/ttyACM0 deploy: resources: reservations: devices: - capabilities: [gpu]

🚀 使用步驟

  1. 建立資料夾並放入三個檔案

bash
mkdir -p ros2_microros_gpu_docker/data cd ros2_microros_gpu_docker # 放入 Dockerfile、docker-compose.yml、entrypoint.sh
  1. 建立映像與啟動容器

#docker compose use docker-compose.yml 啟動
$xhost +local:ubuntu $docker compose up --build

#docker run 啟動
$docker run -itd \ --restart=always \ --name ros2dev \ --network host \ --privileged \ -e DISPLAY=$DISPLAY \ -e QT_X11_NO_MITSHM=1 \ -v /tmp/.X11-unix:/tmp/.X11-unix:rw \ -v $(pwd)/data:/home/ubuntu/data \ --device=/dev/ttyACM0:/dev/ttyACM0 \
--device=/dev/ttyUSB0:/dev/ttyUSB0 \ --gpus all \ ros2-humble-ubuntu:latest

  1. 容器啟動後執行:

#bash login ros2dev
$ docker exec -it ros2dev bash

#new firmware_ws prj run 建立 micro ros firmware by stm32 or esp32
#create stm32F407 freerots firmware code and build code
$ros2 run micro_ros_setup create_firmware_ws.sh freertos olimex-stm32-e407
$ros2 run micro_ros_setup build_firmware.sh

#to uros_ws prj run
$cd uros_ws
$echo "source /opt/ros/humble/setup.bash" >> /home/ubuntu/.bashrc
$source /opt/ros/humble/setup.bash
$source install/local_setup.bash


$ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyACM0

✅ 功能總結

功能支援
micro-ROS Agent✅ 編譯內建
USB UART (/dev/ttyACM0)✅ 掛載
NVIDIA GPU✅ docker compose 支援
GUI 工具(Gazebo / RViz)✅ 透過 X11
Ubuntu 使用者✅ 預設 ubuntu/ubuntu


ros2 容器內預設ubuntu user

#add user ubuntu to images 

 # Dockerfile: ROS 2 Humble + MoveIt2 + Gazebo + micro-ROS Agent (source build)

FROM osrf/ros:humble-desktop-full


ENV DEBIAN_FRONTEND=noninteractive


# === 新增 ubuntu 使用者 ===

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

    echo "ubuntu:ubuntu" | chpasswd && \

    usermod -aG sudo ubuntu


# === 安裝基礎工具與依賴 ===

RUN apt update && apt install -y \

    build-essential \

    cmake \

    git \

    curl \

    wget \

    lsb-release \

    gnupg2 \

    python3-pip \

    python3-colcon-common-extensions \

    libboost-system-dev \

    libtinyxml2-dev \

    libyaml-cpp-dev \

    nano tmux net-tools iputils-ping \

    sudo \

    ros-humble-rmw-fastrtps-cpp \

    ros-humble-moveit \

    ros-humble-moveit-setup-assistant \

    ros-humble-gazebo-ros-pkgs \

    ros-humble-ros2-control \

    ros-humble-ros2-controllers && \

    rm -rf /var/lib/apt/lists/*


# === 使用 ubuntu 用戶 ===

USER ubuntu

WORKDIR /home/ubuntu

ENV HOME=/home/ubuntu


# === 建立 micro-ROS Agent workspace ===

RUN mkdir -p /home/ubuntu/data/uros_ws/src

WORKDIR /home/ubuntu/data/uros_ws


# === Clone micro-ROS Agent + msgs ===

RUN git clone -b humble https://github.com/micro-ROS/micro-ROS-Agent.git src/micro_ros_agent && \

    git clone -b humble https://github.com/micro-ROS/micro_ros_msgs.git src/micro_ros_msgs


# === Build Agent ===

RUN /bin/bash -c "source /opt/ros/humble/setup.bash && colcon build"


# === Source setup 環境 ===

RUN echo 'source /opt/ros/humble/setup.bash' >> /home/ubuntu/.bashrc && \

#    echo 'source /home/ubuntu/data/uros_ws/install/setup.bash' >> /home/ubuntu/.bashrc


# === 建立 ROS2 工作目錄 ===

WORKDIR /home/ubuntu/ros2_ws

RUN mkdir -p /home/ubuntu/ros2_ws/src


CMD ["bash"]


=================================================

✅ 已根據你的需求更新 Dockerfile,具備以下特性:

  • 🔐 新增用戶 ubuntu 並設定密碼為 ubuntu

  • 📂 將 micro-ROS workspace 建置於 /home/ubuntu/data/uros_ws

  • 🔁 自動載入 ROS 2 與 micro-ROS Agent 環境變數於 .bashrc

  • 🔧 預設使用 ubuntu 使用者執行容器


🚀 建立與啟動容器

bash
$docker build -t ros2-humble-ubuntu .
bash
$xhost +local:ubuntu $docker run -it --restart=always \ --name ros2dev \ --env="DISPLAY" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --privileged \ ros2-humble-ubuntu

#docker start for gpu , /dev/ttyACM0 ,/dev/ttyUSB0
xhost +local:root # 開放 X11 存取(若尚未執行) docker run -it --rm \ --name ros2dev \ --gpus all \ --net=host \ --privileged \ --env DISPLAY=$DISPLAY \ --env QT_X11_NO_MITSHM=1 \ --volume /tmp/.X11-unix:/tmp/.X11-unix:rw \ --volume $(pwd)/data:/home/ubuntu/data \ --device /dev/ttyACM0:/dev/ttyACM0 \
--device /dev/ttyUSB0:/dev/ttyUSB0 \ ros2-humble-ubuntu

登入後執行:

bash
$source /home/ubuntu/data/uros_ws/install/setup.bash $ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyACM0



以下是你需求的 完整 Docker run 指令,包含以下功能 ✅:

✅ 功能清單

  • GUI 顯示支援(X11)

  • 掛載 USB 裝置 /dev/ttyACM0

  • 將本機當前目錄下的 ./data/ 資料夾,掛載至 container 的 /home/ubuntu/data/

  • 使用 --privileged 確保有完整裝置操作權限


🐳 最終指令如下:

bash
xhost +local:ubuntu docker run -it --alway \ --name ros2dev \ --env="DISPLAY" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --device=/dev/ttyACM0 \ --volume="$(pwd)/data:/home/ubuntu/data" \ --privileged \ ros2-humble-ubuntu

📌 補充說明:

參數功能說明
xhost +local:ubuntu允許 container(以 ubuntu user 執行)使用 X11
--device=/dev/ttyACM0掛載 USB Serial 裝置到 container 中
--volume="$(pwd)/data:/home/ubuntu/data"將本機目錄下的 ./data 映射到 container 內部
--privileged授權 container 操作 /dev 類裝置等

✅ 啟動後,你可以:

bash
cd /home/ubuntu/data/uros_ws source install/setup.bash ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyACM0


=====================================================================

Docker 是支援 GPU 的,只要滿足以下條件,就可以在容器中使用 NVIDIA GPU 來加速 AI 推論、Gazebo 模擬、RViz 渲染等功能。


✅ 使用 GPU 的條件總覽

項目說明
GPU 驅動程式 (Driver)主機需先安裝 NVIDIA 官方驅動,非 nouveau
NVIDIA Container Toolkit安裝 nvidia-docker2nvidia-container-toolkit
Docker 版本建議 Docker CE 19.03 以上
NVIDIA GPU建議 CUDA Compute >= 5.0,例如 GTX 10xx / RTX / Jetson

🧰 安裝流程:Docker 支援 GPU 的步驟

1️⃣ 安裝 NVIDIA Driver(在主機上)

請使用官方指令,或:

bash
ubuntu-drivers devices sudo ubuntu-drivers autoinstall

然後重開機:

bash
reboot

2️⃣ 安裝 NVIDIA Container Toolkit

bash
# 下載 GPG key curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - # 加入套件庫 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \ sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 安裝 toolkit sudo apt update sudo apt install -y nvidia-container-toolkit # 重啟 Docker sudo systemctl restart docker

3️⃣ 測試 GPU 可用性

bash
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

若成功,會看到熟悉的 nvidia-smi 顯示 GPU 資訊畫面 ✅


🚀 在 ROS2 Docker 中使用 GPU

✅ 範例 run 指令(支援 GPU + GUI + USB)

bash
docker run -it --rm \ --gpus all \ --device=/dev/ttyACM0 \ --volume="$(pwd)/data:/home/ubuntu/data" \ --env="DISPLAY" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --privileged \ ros2-humble-ubuntu

🎯 額外支援

應用Docker GPU 支援說明
OpenCV + CUDA在容器中加裝 opencv-contrib-python 或自行 build with CUDA
PyTorch / TensorRT使用 NVIDIA 官方容器即可支援 GPU 推論
GazeboRViz / Gazebo 使用 GPU 可提昇顯示效能
micro-ROS一般不使用 GPU,但可與視覺/SLAM 搭配

✅ 檢查容器內是否偵測到 GPU

bash
nvidia-smi

或使用 ROS 範例查看 GPU 加速:

bash
glxinfo | grep "OpenGL renderer"