welcom ! Handel home

2025年2月4日 星期二

ROS workspace / src package 介紹

ROS  workspace / src  package 介紹  


└── src

    ├── CMakeLists.txt -> /opt/ros/noetic/share/catkin/cmake/toplevel.cmake

    ├── myrobot_control

    │   ├── CMakeLists.txt

    │   ├── launch

    │   │   └── keyboard_teleop.launch

    │   ├── package.xml

    │   └── scripts

    │       └── myrobot_key

    ├── myrobot_description

    │   ├── CMakeLists.txt

    │   ├── launch

    │   │   └── myrobot_rviz.launch

    │   ├── package.xml

    │   ├── src

    │   └── urdf

    │       ├── macros.xacro

    │       ├── materials.xacro

    │       ├── myrobot.gazebo

    │       ├── myrobot.urdf

    │       └── myrobot.xacro

    └── myrobot_gazebo

        ├── CMakeLists.txt

        ├── launch

        │   ├── empty_world.launch

        │   ├── myrobot_gazebo_full.launch

        │   └── myrobot_world.launch

        ├── package.xml

        ├── scripts

        │   ├── circle_mode.py

        │   └── square_mode.py

        ├── src

        │   └── square_mode.cpp

        └── worlds

            └── myrobot.world


📂 專案目錄結構分析

1️⃣ myrobot_control(機器人控制)

  • 功能:提供鍵盤遙控機器人的功能。
  • 主要檔案:
    • keyboard_teleop.launch(啟動鍵盤控制)
    • myrobot_key(鍵盤控制腳本)

2️⃣ myrobot_description(機器人描述文件)

  • 功能:定義機器人的 URDF/Xacro 模型,並在 RViz 進行視覺化。
  • 主要檔案:
    • myrobot.urdf / myrobot.xacro(機器人模型)
    • myrobot_rviz.launch(RViz 啟動檔)
    • myrobot.gazebo(Gazebo 相關設定)

3️⃣ myrobot_gazebo(Gazebo 模擬)

  • 功能:在 Gazebo 模擬機器人運行環境。
  • 主要檔案:
    • myrobot.world(自訂的模擬環境)
    • myrobot_gazebo_full.launch(完整啟動 Gazebo)
    • circle_mode.py / square_mode.py(控制機器人運動的腳本)

🔧 建議與優化

✅ 1. 確保腳本可執行

你的 scripts/ 目錄下的腳本 (.py 和 myrobot_key) 可能需要更改權限,執行:

bash
chmod +x src/myrobot_control/scripts/myrobot_key chmod +x src/myrobot_gazebo/scripts/*.py

✅ 2. 安裝相依套件

在 ROS 中,確保所有相依套件已安裝:

bash
rosdep install --from-paths src --ignore-src -r -y

✅ 3. 測試啟動文件

測試你的 Gazebo 模擬 和 RViz 視覺化 是否正常運作:

bash
roslaunch myrobot_gazebo myrobot_world.launch roslaunch myrobot_description myrobot_rviz.launch

✅ 4. 組織啟動文件

目前 launch/ 內的 keyboard_teleop.launch 屬於 myrobot_control,建議放在 myrobot_control/launch/ 內。

✅ 5. 加入 README 文件

在 專案根目錄 建立 README.md,記錄:

  • 如何安裝
  • 如何啟動機器人
  • 鍵盤控制指令
  • Gazebo/RViz 測試方式

🚀 下一步

你是否需要:

  • 修改 URDF/Xacro(例如:增加感測器、調整關節)?
  • 調整機器人控制方式(例如:加入自動導航)?
  • 測試特定功能(Gazebo 內的運動腳本)?

建置新的 ROS 工作空間 (workspace)、package (包) 和 node (節點) 的操作範例

 建置新的 ROS 工作空間 (workspace)、package (包) 和 node (節點) 的操作範例,可以參考以下步驟:

1. 建置 ROS 工作空間 (workspace)

•創建工作空間資料夾: 首先,你需要創建一個資料夾作為你的 ROS 工作空間,並在其中創建一個 src 資料夾。

 

 例如,你可以使用以下指令:

•初始化工作空間: 接著,使用 catkin_init_workspace 指令來初始化工作空間。

這個指令會在 src 資料夾中創建一個 CMakeLists.txt 檔案。

•編譯工作空間: 回到工作空間的最上層目錄,使用 catkin_make 指令來編譯工作空間。

這會創建 build 和 devel 資料夾。

•設定環境變數: 每次開啟新的終端機時,需要設定 ROS 環境變數,讓系統知道你的工作空間位置。

你可以執行以下指令:

•或者,你可以將此指令加入 ~/.bashrc 檔案,使其在每次開啟終端機時自動執行。


2. 建立 ROS Package (包)

•創建 package: 進入 src 資料夾,使用 catkin_create_pkg 指令來創建一個新的 package。你需要指定 package 名稱以及相依套件。

例如,創建一個名為 my_tutorial 的 package,相依於 std_msgs, roscpp, 和 rospy:

•編譯 package: 回到工作空間的最上層目錄,使用 catkin_make 指令來編譯 package。

•你也可以使用 catkin_make --pkg <package_name> 來單獨編譯某個 package。

•Package 檔案: package 建立後,你會在 package 目錄下看到 CMakeLists.txt 和 package.xml 檔案,以及 src 資料夾。

package.xml 檔案描述了 package 的資訊,例如名稱、版本、作者、相依套件等。CMakeLists.txt 檔案定義了如何編譯 package 的 CMake 設定檔。


3. 建立 ROS Node (節點)

•建立節點檔案: 在 package 的 src 資料夾中,建立一個新的節點檔案。例如,你可以建立一個 C++ 檔案 hello_ros.cpp。

•撰寫節點程式碼: 在 hello_ros.cpp 檔案中,加入以下程式碼作為範例:

•設定 CMakeLists.txt: 打開 package 中的 CMakeLists.txt 檔案,加入以下程式碼來定義如何編譯節點:

•加入相依套件: 如果你的節點有使用到其他 ROS 套件,你需要在 package.xml 檔案中加入相依套件的宣告。例如,如果你的節點有使用到 roscpp,你需要加入:

•編譯節點: 回到工作空間的最上層目錄,使用 catkin_make 指令來編譯節點。

•執行節點: 使用 rosrun 指令來執行你的節點。

•注意: 在執行任何節點之前,你需要先啟動 roscore (ROS Master)。 

bash roscore 或者, 如果你使用 roslaunch 來啟動節點,roslaunch 會自動啟動 roscore,你就不必手動啟動它。


4. 其他重要概念

•節點 (Node): 節點是 ROS 中執行的基本單元,它們可以發布訊息到話題 (topic),也可以訂閱話題以接收訊息。

•話題 (Topic): 話題是訊息傳遞的管道,節點可以透過話題來互相溝通。

•roslaunch: roslaunch 可以用來批次啟動多個節點,它會讀取 launch 檔案 (通常是 XML 格式),並按照檔案中的設定來啟動節點。

•rosrun: rosrun 指令可以用來單獨執行一個節點。

•roscore: roscore 是 ROS 的基礎,它負責管理節點之間的通訊。


5. 額外說明

•多個回呼函式 (Callback function): 如果你想讓同一個訂閱的 Topic 給多個函式使用,你可以宣告多個 ros::Subscriber 物件,並為每個物件指定不同的回呼函式。

•參數化: 你可以使用 NodeHandle::param 來將程式中的變數參數化,這樣你就可以在終端機上或在 launch 檔案中直接指定參數值。

•使用 launch 檔案: 你可以使用 launch 檔案來啟動多個節點,並設定它們的參數和 remap 設定。

•Gazebo模擬: Gazebo 是一個 3D 物理模擬器,可以用於模擬機器人和環境。你可以使用 gazebo_ros 套件來將 ROS 和 Gazebo 整合。


以上範例提供了一個基礎的 ROS 工作空間、package 和 node 的建置流程。你可以根據你的需求來擴展和修改這些範例。

ROS 專案的目錄結構

 ROS (機器人作業系統) 的工作空間 (workspace) 是用來組織和建置 ROS 專案的目錄結構。一個典型 ROS 工作空間包含以下幾個關鍵的資料夾:

•src (source space): 這個資料夾是存放 ROS 原始碼的地方。每個 ROS 專案 (package) 都會放在 src 資料夾底下。

•build (build space): 這個資料夾是當你使用 catkin_make 或 colcon build 指令編譯 ROS 專案時,產生的中間檔案和編譯結果存放的地方.

•devel (development space): 這個資料夾用於存放編譯後的可執行檔和設定檔。

它也提供了一個方便的環境,讓你在開發過程中可以輕鬆執行和測試你的 ROS 程式碼.

•install (install space): 這個資料夾用於存放最終安裝的檔案,可以被其他 ROS 專案使用. 

在開發過程中,你通常會使用 devel 資料夾,而不是 install 資料夾.


一個 ROS 的工作空間的典型結構如下所示:

workspace_name/

├── src/

│   └── package1/

│   │   ├── CMakeLists.txt

│   │   ├── package.xml

│   │   └── ... (source code, configuration files, etc.)

│   └── package2/

│       ├── CMakeLists.txt

│       ├── package.xml

│       └── ...

├── build/

├── devel/

└── install/


以下是一些關於 ROS 工作空間和資料目錄結構的重點:

•Catkin: ROS 使用 Catkin 作為其主要的建置系統。 

Catkin 會尋找工作空間中的 CMakeLists.txt 和 package.xml 檔案來建立專案.

•Package (包):ROS 的程式碼是組織在叫做 "package" 的單元裡。

每個 package 應該包含一個 package.xml 檔案 (用於描述 package 的資訊) 

和一個 CMakeLists.txt 檔案 (用於描述如何編譯 package)。

•Node (節點):ROS 程式的基本單元是節點 (node)。

節點可以發佈訊息到話題 (topic),也可以訂閱話題以接收訊息。

一個節點通常對應到一個可執行檔.

•分散式架構:ROS 採用分散式架構,讓不同的節點可以獨立運作,並且透過訊息傳遞來彼此溝通.

•roscore : roscore 是 ROS 的基礎,它是一個節點的集合,讓 ROS 節點之間能夠互相            溝通,在啟動任何 ROS 節點之前,必須先啟動 roscore。

        當使用 roslaunch 批次啟動節點時,roslaunch 會自動啟動 master,

        所以便不必在啟動之前輸入 roscore。

•ROS環境設定: 需要設定環境變數,通常會使用 source devel/setup.bash (或者setup.zsh        等) 指令來設定環境變數,這樣才能正確找到 ROS 的相關執行檔和函式庫。

       在 src 資料夾中,每一個 package 都會包含 CMakeLists.txt 和 package.xml 檔案。

•package.xml: 描述 package 的資訊,例如名稱、版本、作者、相依套件等。

•CMakeLists.txt: 定義如何編譯 package 的 CMake 設定檔。


例如,一個機器人描述的 package 可能會包含以下檔案:

robot_description/

├── CMakeLists.txt

├── launch

│   ├── robot.launch

│   └── robot.rviz

├── meshes

│   └── robot.stl

├── package.xml

└── urdf

├── materials.xacro

├── robot.gazebo

└── robot.xacro


其中, robot.xacro 檔案會動態的產生 URDF 檔案,

而 robot.gazebo 則會定義 Gazebo 如何處理機器人的 links 和 joints。

總之, ROS 的工作空間提供了一個結構化的環境,

    讓開發者可以建立、編譯和執行 ROS 專案。 

了解其資料目錄結構對於開發 ROS 應用程式至關重要。

2025年2月3日 星期一

RViz 配合 ROS 的用途與功能介紹

 

RViz 配合 ROS 的用途與功能介紹

1. 什麼是 RViz?

RViz (ROS Visualization Tool) 是 ROS (Robot Operating System) 提供的一個 3D 視覺化工具,主要用於顯示機器人感測器數據、環境地圖、導航軌跡、機械手臂狀態等資訊。它可以幫助開發者即時監測機器人的運作狀態,並進行除錯與調試。


2. RViz 的用途

RViz 在 ROS 生態系統中主要負責 可視化,常見的用途包括:

✅ (1) 顯示機器人模型 (URDF / SDF)

  • 可以載入機器人的 URDF (Unified Robot Description Format) 或 SDF (Simulation Description Format) 模型,顯示機器人的形狀、關節狀態及運動方式。
  • 配合 robot_state_publisher 節點,能夠顯示機器人當前姿態。

📌 指令範例

bash
roslaunch my_robot_description display.launch

✅ (2) 視覺化感測器數據

可以顯示機器人的各種感測器數據,例如:

  • LIDAR / 雷射雷達 (sensor_msgs/LaserScan)
  • 深度相機 (RGB-D Camera) (sensor_msgs/PointCloud2)
  • IMU (慣性測量單元) (sensor_msgs/Imu)
  • GPS 定位資訊 (sensor_msgs/NavSatFix)

📌 常見雷射雷達可視化

bash
rosrun rviz rviz

在 RViz 內 新增 LaserScan 類型,訂閱雷射雷達的 Topic,例如 /scan。


✅ (3) 機器人導航 (SLAM & Path Planning)

  • SLAM (同時定位與建圖):可以顯示 map,以及即時建立環境地圖 (occupancy grid map)。
  • 路徑規劃與導航:
    • 可視化機器人的目標點 (Move Base Goal)
    • 顯示局部與全局路徑 (Local Path & Global Path)
    • 監控機器人避障狀態 (costmap)

📌 導航功能常見指令

bash
roslaunch turtlebot3_navigation turtlebot3_navigation.launch

在 RViz 內 新增 Map 類型,訂閱 /map 來顯示機器人的地圖。


✅ (4) 機械手臂運動規劃 (MoveIt!)

  • RViz 可以與 MoveIt! 搭配,顯示機械手臂的當前狀態、運動規劃軌跡 (Trajectory),並透過互動方式來控制手臂移動。
  • 可視化逆向運動學 (IK) 解算結果。

📌 MoveIt! 例子

bash
roslaunch panda_moveit_config demo.launch

在 RViz 內,開啟 MotionPlanning 外掛來控制手臂。


✅ (5) 機器人運動軌跡 (TF & Odometry)

  • TF (Transform Frames):顯示機器人的座標變換,例如從 機器人基座 (base_link) 到 相機 (camera_link) 的相對位置。
  • Odom (里程計 / Odometry):顯示機器人在世界座標中的位置 (/odom topic)。

📌 查看 TF 樹狀架構

bash
rosrun tf view_frames evince frames.pdf

📌 在 RViz 顯示 TF

  1. 新增 "TF" 顯示類型
  2. 訂閱 /tf 主題

✅ (6) 自訂 3D 標記 (Markers)

  • 視覺化自訂訊息,例如:
    • 繪製路徑 (Line Strip)
    • 顯示物件 (MeshResource)
    • 標示文字 (Text View-Facing)
    • 方向箭頭 (Arrow)

📌 自訂 RViz Markers

bash
rostopic pub /visualization_marker visualization_msgs/Marker '{...}'

在 RViz 內,新增 "Marker" 類型 訂閱 /visualization_marker。


3. RViz 的基本操作

(1) 啟動 RViz

bash
rosrun rviz rviz

或

bash
roslaunch rviz rviz.launch

(2) 重要的可視化元素

顯示類型說明需訂閱的 Topic
RobotModel顯示機器人模型/robot_description
TF顯示座標變換/tf
LaserScan顯示雷射雷達數據/scan
PointCloud2顯示點雲 (3D Lidar)/points
Odometry顯示機器人位置/odom
Path顯示導航路徑/move_base/NavfnROS/plan
Marker顯示 3D 標記/visualization_marker
Image顯示相機影像/camera/image_raw

4. RViz 進階應用

(1) 建立 RViz 配置檔 (.rviz)

可以儲存當前的 RViz 設定,以便下次開啟:

  1. 設定好視圖、座標、雷射雷達等顯示項目。
  2. 點選 File -> Save Config,存成 .rviz 檔案。
  3. 之後可以使用:
bash
rosrun rviz rviz -d my_config.rviz

(2) 自動啟動 RViz

可以建立一個 launch 檔案,讓 RViz 自動啟動:

xml
<launch> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_robot_package)/config/my_config.rviz"/> </launch>

執行:

bash
roslaunch my_robot_package my_rviz.launch

5. RViz vs Gazebo

功能RVizGazebo
主要用途可視化 ROS 資訊物理模擬
機器人模型只能顯示可模擬運動
感測器數據可視化雷射、相機等提供真實感測器模擬
導航 (SLAM)顯示地圖與路徑無法執行
與 MoveIt! 搭配是也可以

6. 結論

✅ RViz 是 ROS 的重要視覺化工具,能夠幫助開發者監控機器人狀態、感測數據、導航資訊,並進行調試。
✅ 主要應用包括 機器人模型顯示、LIDAR 感測、SLAM、導航、運動規劃、TF 變換等。
✅ 可透過 .rviz 檔案 儲存與載入配置,並且能夠與 MoveIt!、SLAM、導航系統整合。
✅ 不具備物理模擬能力,如需物理模擬請搭配 Gazebo。

💡 建議:使用 RViz 進行即時監控,Gazebo 進行模擬測試,兩者搭配能發揮最大效益!🚀

ROS 工作空間 (Workspace)、套件 (Package)、節點 (Node) 架構專案目錄介紹

 

ROS 工作空間 (Workspace)、套件 (Package)、節點 (Node) 架構與專案目錄介紹

在 ROS (Robot Operating System) 中,開發環境遵循一個標準的層級架構,主要由 Workspace(工作空間)、Package(套件)、Node(節點)等組成,並且依照特定的目錄結構來組織程式碼。


1. ROS 工作空間 (Workspace)

工作空間 是 ROS 專案的根目錄,包含所有 ROS 程式碼與設定檔。通常使用 Catkin (ROS1) 或 Colcon (ROS2) 來管理工作空間。

典型 ROS1 工作空間結構

bash
my_ros_workspace/ # 工作空間名稱 (可自訂) │── src/ # 原始碼目錄 (存放 ROS 套件) │ ├── package_1/ │ ├── package_2/ │ ├── CMakeLists.txt -> /opt/ros/noetic/share/catkin/cmake/toplevel.cmake │── build/ # 建置 (compile) 目錄 │── devel/ # 開發環境 (包含編譯後的執行檔與設定) │── install/ # 安裝目錄 (用於佈署套件)

📌 常見指令

  • catkin_make:編譯工作空間
  • source devel/setup.bash:設定環境變數

典型 ROS2 工作空間結構

bash
my_ros2_workspace/ │── src/ # 原始碼 (存放 ROS2 套件) │ ├── package_1/ │ ├── package_2/ │── build/ # 建置目錄 │── install/ # 安裝後的目錄 │── log/ # 記錄 Log 資訊

📌 常見指令

  • colcon build:編譯工作空間
  • source install/setup.bash:設定環境變數

2. ROS 套件 (Package)

套件 (Package) 是 ROS 中的基本單位,所有的程式碼、節點、訊息 (Message)、服務 (Service)、動作 (Action) 等都在套件內。

典型 ROS1 套件結構

bash
my_ros_package/ │── CMakeLists.txt # CMake 設定檔 │── package.xml # ROS 套件描述檔 (包含依賴資訊) │── src/ # 存放程式碼 (C++ / Python) │── scripts/ # Python 執行檔 │── include/ # C++ 標頭檔 │── launch/ # 啟動檔 (.launch, 用於啟動多個節點) │── msg/ # 訊息類型 (.msg) │── srv/ # 服務類型 (.srv) │── config/ # 設定檔 (YAML 或 JSON)

📌 建立 ROS1 套件

bash
cd ~/my_ros_workspace/src catkin_create_pkg my_ros_package std_msgs rospy roscpp

📌 編譯

bash
cd ~/my_ros_workspace catkin_make

典型 ROS2 套件結構

bash
my_ros2_package/ │── CMakeLists.txt # CMake 設定檔 │── package.xml # ROS2 套件描述檔 │── src/ # 程式碼 (C++ / Python) │── include/ # C++ 標頭檔 │── launch/ # 啟動檔 (.py 格式) │── msg/ # 訊息類型 │── srv/ # 服務類型 │── config/ # 設定檔 (YAML) │── tests/ # 測試程式

📌 建立 ROS2 套件

bash
cd ~/my_ros2_workspace/src ros2 pkg create --build-type ament_cmake my_ros2_package

📌 編譯

bash
cd ~/my_ros2_workspace colcon build

3. ROS 節點 (Node)

節點 (Node) 是 ROS 中的執行單位,每個節點負責處理不同的功能,如感測、控制、影像處理等。

ROS1 C++ 節點範例

檔案:

$cd ~/catkin_ws/src/my_ros_package/src

$nano my_node.cpp

cpp
#include "ros/ros.h" int main(int argc, char **argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; ROS_INFO("Hello from my_node!"); ros::spin(); return 0; }

📌 4️⃣ 修改 CMakeLists.txt

回到 my_ros_package 目錄:

bash
cd ~/catkin_ws/src/my_ros_package

打開 CMakeLists.txt:

bash
nano CMakeLists.txt

找到:

cmake
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)

然後在 最後面 加入:

cmake
add_executable(my_node src/my_node.cpp) target_link_libraries(my_node ${catkin_LIBRARIES})

這將: ✅ 編譯 my_node.cpp
✅ 建立可執行檔 my_node

儲存後關閉 (CTRL + X → Y → ENTER)。


📌 5️⃣ 編譯專案

回到 catkin_ws 目錄:

bash
cd ~/catkin_ws catkin_make

如果編譯成功,你應該會看到:

csharp
[100%] Built target my_node

📌 6️⃣ 執行 my_node

先加載環境變數:

bash
source devel/setup.bash

確保 ROS Master 已啟動:

bash
roscore

然後在 新終端 執行:

bash
rosrun my_ros_package my_node

你應該會看到:

csharp
[INFO] [1700000000.123456]: Hello from my_node!

🎉 成功執行 C++ ROS 節點!

ROS2 Python 節點範例

檔案:src/my_node.py

python
import rclpy from rclpy.node import Node class MyNode(Node): def __init__(self): super().__init__('my_node') self.get_logger().info('Hello from my_node!') def main(args=None): rclpy.init(args=args) node = MyNode() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

📌 執行

bash
ros2 run my_ros2_package my_node

4. 其他重要 ROS 元件

(1) 訊息 (Message)

ROS 透過 Message 在節點間通訊。使用 .msg 定義自訂訊息格式。

📌 建立訊息格式

bash
mkdir -p my_ros_package/msg echo "int32 num" > my_ros_package/msg/Num.msg

📌 修改 CMakeLists.txt

cmake
add_message_files( FILES Num.msg ) generate_messages()

(2) 服務 (Service)

Service 允許節點進行同步請求/回應。

📌 建立 .srv 檔

bash
mkdir -p my_ros_package/srv echo "int32 a\nint32 b\n---\nint32 sum" > my_ros_package/srv/AddTwoInts.srv

📌 修改 CMakeLists.txt

cmake
add_service_files( FILES AddTwoInts.srv ) generate_messages()

(3) 啟動檔 (Launch File)

啟動檔讓我們可以一次啟動多個節點。

📌 ROS1 .launch 範例

xml
<launch> <node pkg="my_ros_package" type="my_node" name="my_node" output="screen"/> </launch>

📌 執行

bash
roslaunch my_ros_package my_launch_file.launch

📌 ROS2 .py 啟動檔

python
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='my_ros2_package', executable='my_node', name='my_node', output='screen' ) ])

📌 執行

bash
ros2 launch my_ros2_package my_launch_file.py

結論

ROS 專案的開發架構主要由 工作空間 (Workspace)、套件 (Package)、節點 (Node) 所組成,並透過 Message、Service、Launch Files 來管理節點間的通訊與執行流程。掌握這些基本概念能夠更有效地開發與維護 ROS 專案 🚀