跳到正文

Wiki

入門操作

約 33 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.簡介

2.終端環境搭建

如果在上方安裝ROS2的時候,已經將該語句新增到~/.bashrc了,則不必再跟著這步操作了。

source /opt/ros/humble/setup.bash  #将ROS2环境变量配置到当前位置
echo " source /opt/ros/humble/setup.bash" >> ~/.bashrc    #每次启动终端都会运行该句

ros2 run demo_nodes_cpp talker

用ctrl+c來進行取消程式執行

ros2 run demo_nodes_py listener

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

3.命令列操作

mkdir -p 新建資料夾

rm -R 遞迴刪除(刪掉資料夾及裡面包含的資料夾及檔案)

touch 新建檔案

rm 刪除檔案

cd ..退回上級目錄(cd 點點)


會彈提示資訊,告訴我們後面要跟的引數

ros2 node list會把當前ROS2正在執行的節點列出來

ros2 node info + /節點名 可以檢視目標節點的詳細情況

會彈提示資訊,告訴我們後面要跟的引數

可以通過話題來顯示機器人運動的狀態

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

ros2 bag record /turtle1/cmd_vel
ros2 bag play rosbag2_2022_04_11-17_35_40/rosbag2_2022_04_11-17_35_40_0.db3

ros2 bag record + 話題

按Ctrl+C結束,然後錄製的資料在當前終端的目錄下

如何去復現呢?

ros2 bag play + 資料夾名稱

4.ROS2 HelloWorld(C++)

1.建立功能包

指令就是建立ros2的功能包

ros2 pkg create + 功能包名 + --build-type(構建型別) + ament_cmake / ament_python + --dependencies(依賴) + rclcpp(ROS2的CPP客戶端) + --node-name(節點名) + 節點名

ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld

原始檔自動生成了,檔名和我們指定的node name是一致的。

這是自動生成的內容,但是和ROS2沒有任何關係。

如果依賴的庫不止這一個,則再回車,

xxx

再新增下一個

10行是查詢包

12行是新增可執行的

add_executable 的第一個引數是 執行檔的名字(預設和節點名一致,預設和原始檔名一致) 第二個引數是原始檔的名字

17行是為我們的可執行程式新增依賴 我們的可執行程式依賴於RCLCPP這個庫

22行是要為我們的可執行程式設立一個安裝目錄,建立在了當前功能包下的lib目錄,也就是 工作空間名/install/功能包名/lib

編輯配置檔案之後編譯,用cd..返回ws目錄

圖示為綠色,是沒有警告也沒有錯誤

是黃色的則有警告

是紅色的則有致命錯誤

可執行二進位制檔案的路徑

source install/setup.bash #刷新环境变量

ros2 run pkg01_helloworld_cpp helloworld

ros2 run 功能包名稱 執行檔名(預設和節點名一致)

編輯ROS2 C++原始檔:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char ** argv)
{
  rclcpp::init(argc,argv);

  auto node = rclcpp::Node::make_shared("helloworld_node");

  RCLCPP_INFO(node->get_logger(),"hello world!");

  rclcpp::shutdown();

  return 0;
}

5.ROS2 HelloWorld(Python)

ros2 pkg create pkg02_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld

ros2 pkg create + 功能包名 + --build-type(構建型別) + ament_cmake / ament_python + --dependencies(依賴) + rclpy(ROS2的Python客戶端) + --node-name(節點名) + 節點名

與node name和可執行二進位制檔案同名

預設這裡面已經有程式碼,但是和ROS2無關,這是標準的python程式碼

二進位制執行檔 對映到 原始檔的main函式

如何編譯呢?

先返回上一級,來到ws目錄

有個黃色警告,但是不影響我們使用。

source ./install/setup.bash

重新整理環境變數

ros2 run pkg02_helloworld_py helloworld


import rclpy

def main():
    rclpy.init()
    node = rclpy.create_node("helloworld_py_node")
    node.get_logger().info("hello world by python!")
    rclpy.shutdown()

if name == '__main__':
    main()

6.執行最佳化(bash終端環境)

要使用絕對路徑

儘量不要這麼幹,ROS2有一個bug,就是不同工作空間的功能包可能會呼叫混亂,所以先不要搞全域性的執行最佳化。

7.VScode環境搭建

看C/C++,Python,CMake,XML,YAML檔案就可以程式碼高亮顯示

在寫一些ROS2訊息的程式碼可以提供程式碼補齊等操作

編寫機器人模型所要用的外掛,也可以進行程式碼補齊

ROS2經常生成PDF檔案,可以通過這個外掛來檢視

ROS2外掛建議等成熟之後再進行安裝

這個官方外掛可以嘗試安裝

人工智慧程式碼補全

MarkDown高亮


雖然報錯,但是程式是可以正常執行的。(主要是vscode找不到標頭檔案)

            "includePath": [
                "${default}",
                "${workspaceFolder}/**",
                "/opt/ros/humble/include/**"
            ],

/**代表要包含該資料夾下的所有的子集


按Ctrl + `(ESC底下的按鍵)把VSCODE終端開啟

--node-name也是可選引數,如果不配置,則不會有原始檔,也不會有執行檔到原始檔的對映

不需要修改,已經預設生成好了

再返回WS目錄進行編譯(但是此時編譯是編譯整個WS目錄下的所有功能包)

重新整理環境變數並執行



如何在一個功能包裡新增多個原始檔呢?

新建一個新檔案,比如hellovscode2.cpp

但是此時該檔案是一個孤零零的檔案,他沒有做任何的配置,對應的,編譯完之後也不會被執行。

我們想編譯執行該檔案,必須配置相關的配置檔案。

選中的這些用不著,可以刪掉

8.執行最佳化(colcon build)

平常會全編譯WS目錄下的檔案

colcon build --packages-select xxx xxx xxx #可以指向多个包

9.VScode環境進階

9.1.clangd外掛程式碼提示(可選,但是建議)

https://colcon.readthedocs.io/en/released/index.html

由於C/C++外掛在大專案裡的表現簡直拉胯的一批,所以我們選擇使用llvm裡的clangd外掛來進行程式碼提示。

但clangd依賴於cmake生成一個編譯資訊檔案,我們需要一些步驟來生成該檔案。

由於ROS2沒有像ROS1那樣的一個總的規範的CMakeLists,所以配置起來沒有ROS1那麼方便。

  1. 配置colcon build引數

    1. 方法一:(不建議) 每次 編譯要用該命令:
    colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

      等同於在cmake檔案裡寫上(一般不建議改cmakelists)

    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
    1. 方法二:全域性引數(更加推薦)
mkdir ~/.colcon

vim ~/.colcon/defaults.yaml

按下insert(插入)按鍵

輸入下方內容

build:
  cmake-args:
    - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

按下ESC,並按下:wq,然後按下Enter(回车)即可成功儲存。

在編譯的時候正常用colcon build就可以自動啟用CMAKE_EXPORT_COMPILE_COMMANDS=ON引數了。

  1. 然後再來配置clangd外掛

    1. 先下載clangd外掛

    2. 下載clangd檔案

      按住Ctrl shift P開啟搜尋框

      輸入clangd 找到下載語言伺服器這一專案,點選安裝clangd(請保持良好的網路狀況)

    1. 接著配置clangd:

停用C/C++的程式碼提示功能

如果沒有上圖的彈窗,可以進行手動關閉,依然是ctrl shift P,輸入settings然後找到如下圖的選項

找到下圖這個選項,改成disabled即可。

"C_Cpp.intelliSenseEngine": "disabled"

  1. 重啟clangd

然後ctrl shift P搜尋clangd找到如下圖的選項(重啟clangd語言伺服器前,要先colcon build)

程式碼提示就正常啦

10.安裝其他工具

10.1.terminal

10.1.1.安裝terminator(選裝,因人而異,有更好用的Warp,請往下看)
sudo apt install terminator

快捷鍵 功能 記憶方法
Ctrl + Shift + E 垂直分屏,左右分 E = East,往東邊開一個視窗,也就是左右分
Ctrl + Shift + O 水平分屏,上下分 O = Over / Under,上下疊放
Ctrl + Shift + S 隱藏/顯示捲軸 S = Scrollbar,捲軸
F11 全屏/退出全屏 F = Fullscreen,F11 本來就是很多軟體的全屏鍵
Ctrl + Tab 在不同 pane 之間切換 跟瀏覽器切 Tab 類似,迴圈切換
Ctrl + L 清屏 L = clear 裡的 L,也可以理解成“拉到新頁面”
Ctrl + Shift + W 關閉當前 pane W = Window,關當前小視窗
Ctrl + Shift + Q 退出整個 Terminator Q = Quit,退出程式

因為他本身的字型非常暗,所以要設定一下.

cp ~/.config/terminator/config ~/.config/terminator/config.bak
vim ~/.config/terminator/config

按一下ggdG,注意大小寫. 然後按下insert按鍵, 然後讓檔案內容為:

[global_config]
  title_transmit_bg_color = "#31363b"
  title_transmit_fg_color = "#fcfcfc"
  title_receive_bg_color = "#232629"
  title_receive_fg_color = "#fcfcfc"
  title_inactive_bg_color = "#232629"
  title_inactive_fg_color = "#bdc3c7"

[keybindings]

[profiles]
  [[default]]
    use_theme_colors = False
    use_system_font = False
    font = Noto Sans Mono 11

    background_type = solid
    background_color = "#232629"
    foreground_color = "#fcfcfc"
    cursor_color = "#fcfcfc"

    palette = "#232629:#ed1515:#11d116:#f67400:#1d99f3:#9b59b6:#1abc9c:#fcfcfc:#7f8c8d:#ff5555:#50fa7b:#fdbc4b:#3daee9:#ff79c6:#8be9fd:#ffffff"

    scrollback_infinite = True

[layouts]
  [[default]]
    [[[window0]]]
      type = Window
      parent = ""
      size = 920, 660
    [[[child1]]]
      type = Terminal
      parent = window0

[plugins]

最後,按下ESC,輸入:wq儲存並退出.

然後完全關閉 Terminator,再重新開啟。 這個配置會做幾件事:

  1. 背景:接近 Konsole Breeze 的深灰,不是死黑
  2. 字型:接近純白,比以前亮很多
  3. 藍色:換成更亮的 KDE 藍
  4. 綠色/黃色/青色:也整體提亮
  5. 頂部紅色標題條:改成灰色,不再那麼刺眼
10.1.2.Warp Terminal(推薦,更好看,也支援分屏)

相比 Terminator,Warp Terminal 的預設外觀更現代,字型更清楚,介面也更亮堂。

最重要的是,它也支援類似 Terminator 的多 pane 分屏,所以可以作為 Terminator 的現代平替。

不過需要注意,Warp 的快捷鍵和 Terminator 不完全一樣。

  1. 安裝

    1. Ubuntu / Debian 安裝

      wget -O warp-terminal.deb "https://app.warp.dev/download?package=deb"
      sudo apt install ./warp-terminal.deb

      安裝完成後,可以在應用選單裡開啟 Warp,也可以在終端裡輸入:

      warp-terminal
    2. Fedora / RHEL 安裝

      如果你用的是 Fedora、RHEL、CentOS 這類發行版,可以安裝 rpm 包:

      wget -O warp-terminal.rpm "https://app.warp.dev/download?package=rpm"
      sudo dnf install ./warp-terminal.rpm

      啟動方式同樣是:

      warp-terminal
  2. Warp 常用快捷鍵

快捷鍵 功能 記憶方法
Ctrl + Shift + D 向右分屏 D = Divide,分割出一個新的 pane,預設往右邊開
Ctrl + Shift + E 向下分屏 E = Extend Down,向下面擴充套件一個新的 pane
Ctrl + Alt + 方向键 按方向切換 pane 想去哪邊就按哪個方向鍵
Ctrl + Shift + [ 切換到上一個 pane [ 可以理解成往前切
Ctrl + Shift + ] 切換到下一個 pane ] 可以理解成往後切
Ctrl + Shift + Enter 最大化/還原當前 pane Enter 進入當前 pane 的專注模式
Ctrl + Shift + W 關閉當前 pane W = Window,關閉當前小視窗
Ctrl + Shift + T 新建標籤頁 T = Tab,新開一個標籤頁
Ctrl + PageUp 切換到上一個標籤頁 類似瀏覽器切換標籤
Ctrl + PageDown 切換到下一個標籤頁 類似瀏覽器切換標籤
Ctrl + L 清屏 L = clear 裡的 L,相當於翻到一個新頁面
Ctrl + = 放大字型 等號旁邊通常也是加號,表示放大
Ctrl + - 縮小字型 減號,表示縮小
Ctrl + 0 恢復預設字型大小 歸零,恢復預設
  1. Warp 的特點

    1. 預設顏值比 Terminator 高,不需要額外折騰配色
    2. 支援一直分屏,適合大螢幕開發
    3. 字型渲染比較清楚,觀感比 Terminator 亮堂
    4. 支援命令塊,長命令輸出看起來更清晰
    5. 支援 AI 功能,但不使用 AI 也可以當普通終端使用

首次開啟 Warp 時可能需要聯網初始化。之後即使離線也可以作為普通終端使用,只是 AI、協作等雲端功能不能用。

如果只是想要一個傳統、穩定、輕量的終端,可以繼續用 Terminator。

如果想要更好看的介面、更現代的互動體驗,並且也需要分屏,那麼 Warp 是一個很不錯的選擇。

10.1.3.在 KDE Dolphin 中右鍵使用 Warp 開啟當前目錄

即使已經在 KDE 的“預設應用程式”中將終端設定為 Warp,Dolphin 的“在此處開啟終端”仍然可能沒有反應。這是 Dolphin/KIO 與 Warp Linux 版啟動方式的相容問題,可以通過新增一個 Dolphin 服務選單解決。

  1. 建立 Warp 啟動指令碼:

    mkdir -p ~/.local/bin
    nano ~/.local/bin/warp-here

    寫入以下內容:

    #!/bin/bash
    
    target_dir="${1:-$HOME}"
    
    # Warp 已经运行时,使用 URI 新建指定目录的窗口
    if pgrep -x warp-terminal >/dev/null; then
        encoded_path=$(
            python3 -c \
            'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe="/"))' \
            "$target_dir"
        )
        exec xdg-open "warp://action/new_window?path=$encoded_path"
    fi
    
    # Warp 冷启动时,将目标目录传给新启动的 Shell
    export WARP_DOLPHIN_DIR="$target_dir"
    exec /usr/bin/warp-terminal

    儲存後新增執行許可權:

    chmod +x ~/.local/bin/warp-here
  2. 配置 Shell 處理 Warp 冷啟動時傳入的目錄。如果使用 Bash,開啟 ~/.bashrc

    nano ~/.bashrc

    在檔案末尾新增:

    # 从 Dolphin 冷启动 Warp 时进入指定目录
    if [[ -n "${WARP_DOLPHIN_DIR:-}" && -d "$WARP_DOLPHIN_DIR" ]]; then
        cd -- "$WARP_DOLPHIN_DIR"
        unset WARP_DOLPHIN_DIR
    fi

    如果 Warp 使用的是 Zsh,則將上述內容新增到 ~/.zshrc

  3. 建立 Dolphin 服務選單:

    mkdir -p ~/.local/share/kio/servicemenus
    nano ~/.local/share/kio/servicemenus/warp-here.desktop

    寫入以下內容:

    [Desktop Entry]
    Type=Service
    MimeType=inode/directory;
    Actions=openWarpHere;
    X-KDE-Priority=TopLevel
    
    [Desktop Action openWarpHere]
    Name=Open Warp Here
    Icon=dev.warp.Warp
    Exec=/home/tungchiahui/.local/bin/warp-here %f

    %f 會由 Dolphin 替換為當前選中的資料夾路徑。

  4. 設定許可權、重新整理 KDE 快取並重啟 Dolphin:

    chmod +x ~/.local/share/kio/servicemenus/warp-here.desktop
    kbuildsycoca6
    dolphin --quit
    dolphin &

重新開啟 Dolphin 後,右鍵資料夾即可看到“在此處開啟 Warp”。Warp 尚未執行時,指令碼會通過環境變數讓第一個視窗進入目標目錄;Warp 已經執行時,則通過官方 URI Scheme 新建指定目錄的視窗。這樣可以避免冷啟動時同時出現一個預設目錄視窗和一個目標目錄視窗。

Dolphin 的 F4 內嵌終端依賴 KonsolePart,仍然只能使用 Konsole,與這個右鍵選單無關。

10.2.git

咱們的Git入門教程:Vinci機器人隊Git入門教程

11.ROS2體系框架

Client Library就是ROS2的客戶端,比如rclcpp,rclpy。

Abstract DDS Layer是DDS抽象層,這樣DDS可以實現可插拔,可以隨便替換DDS模組。

Intra-process API是程序內通訊API,可以提高通訊效率的一類API。