Getting Started
Introduction





Terminal Environment Setup

If you already added this statement to ~/.bashrc when installing ROS2 above, you don't need to follow this step.

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

ros2 run demo_nodes_cpp talker


Use Ctrl+C to cancel program execution.

ros2 run demo_nodes_py listener


ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

Command line operations

mkdir -p create a new folder
rm -R recursively deletes (removes a folder along with all folders and files it contains).
touch creates a new file
rm deletes files
cd .. goes back to the parent directory (cd dot dot).


It will pop up a prompt message telling us the parameters to follow.


The ros2 node list command will list the nodes currently running in ROS 2.


ros2 node info + /node_name can be used to view the details of the target node.

It will pop up a prompt message telling us the parameters to follow.



The status of the robot's movement can be displayed through topics.

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 + topic
Press Ctrl+C to stop, and the recorded data will be saved in the current terminal's directory.

How can I reproduce it?
ros2 bag play + folder name
ROS2 HelloWorld(C++)



- Create a function package


The instruction is to create a ROS2 package.
ros2 pkg create + package name + --build-type (build type) + ament_cmake / ament_python + --dependencies (dependencies) + rclcpp (ROS2 C++ client) + --node-name (node name) + node name
ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld


The source file was automatically generated, and the filename matches the node name we specified.

This is auto-generated content, but it has nothing to do with ROS2.



If there are more dependent libraries than just this one, press Enter again.
xxx
Add the next one.

10 lines is to find the package
Line 12 adds executable permissions.
The first parameter of add_executable is the name of the executable file (by default, it matches the node name and the source file name). The second parameter is the name of the source file.
Line 17 adds a dependency for our executable — it depends on the RCLCPP library.
Line 22 is to set up an installation directory for our executable program, created under the lib directory of the current package, which is workspace_name/install/package_name/lib.
After editing the configuration file, compile and use cd.. to return to the ws directory.


The icon is green, indicating no warnings or errors.
If it is yellow, there is a warning.
If it is red, there is a fatal error.

Path to the executable binary file

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

ros2 run pkg01_helloworld_cpp helloworld
ros2 run package_name executable_name (default matches the node name)

Edit the ROS2 C++ source file:

#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;
}




ROS2 HelloWorld(Python)

ros2 pkg create pkg02_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld
ros2 pkg create + package name + --build-type (build type) + ament_cmake / ament_python + --dependencies (dependencies) + rclpy (ROS2's Python client) + --node-name (node name) + node name



Same as the node name and the executable binary file.

By default, there is already code in here, but it has nothing to do with ROS2 — this is standard Python code.



The binary executable file maps to the main function in the source file.
How do I compile it?

First, go back to the parent directory to reach the ws directory.


There's a yellow warning, but it doesn't affect our usage.

source ./install/setup.bash
Refresh environment variables
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()



Runtime Optimization (Bash Terminal Environment)


To use an absolute path


Try to avoid doing this. ROS2 has a bug where function packages from different workspaces may get mixed up, so don't enable global runtime optimization for now.
VScode environment setup







Looking at C/C++, Python, CMake, XML, and YAML files, code syntax highlighting will be displayed.
When writing ROS2 message code, it can provide features like code completion.

Write the plugins needed for the robot model, and also enable code completion.

ROS2 frequently generates PDF files, and this plugin can be used to view them.


It is recommended to install ROS2 plugins only after they have matured.

You can try installing this official plugin.

AI code completion

MarkDown highlighting



Although an error is reported, the program can still run normally. (The main issue is that VSCode cannot find the header file.)





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

/** represents including all subsets under this folder.


Press Ctrl + ` (the key below ESC) to open the VS Code terminal.


The --node-name parameter is also optional. If not configured, there will be no source file and no mapping from the executable file to the source file.



No changes needed; it has already been generated by default.

Return to the WS directory to compile (but at this point, the compilation will build all the packages under the entire WS directory).

Refresh the environment variables and run.





How do I add multiple source files to a feature package?

Create a new file, for example hellovscode2.cpp.
However, at this point the file is isolated—it has no configuration, and accordingly, it will not be executed after compilation.
To compile and execute this file, we must configure the relevant configuration files.


You don't need the selected ones; you can delete them.




Build Optimization (colcon build)

I usually do a full build of the files in the WS directory.

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

Advanced VScode Environment Setup
clangd plugin code completion (optional, but recommended)
https://colcon.readthedocs.io/en/released/index.html
Since the C/C++ plugin performs terribly in large projects, we choose to use the clangd plugin from LLVM for code suggestions.
However, clangd relies on CMake to generate a compilation information file, so we need a few steps to generate that file.
Since ROS2 does not have a single standardized CMakeLists like ROS1, configuring it is not as convenient as ROS1.
- Configure colcon build parameters
- Method 1: (Not recommended) Use this command every time you compile:
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
Equivalent to writing it in the CMake file (generally not recommended to modify CMakeLists).
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
```
5. Method 2: Global Parameters (Recommended)
```bash
mkdir ~/.colcon
vim ~/.colcon/defaults.yaml
Press the insert(插入) button.

1.1 Microcontroller Environment Setup
1.1.1 Microcontroller Development Environment Setup
1.1.1.1 STM32 Development Environment Setup
1.1.1.1.1 Installing Keil MDK
Keil MDK is a microcontroller development tool launched by ARM, which is currently the most widely used development environment for STM32 microcontrollers. It integrates with the STM32CubeMX code generation tool to quickly build STM32 microcontroller projects.
build:
cmake-args:
- -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
Press ESC, then press :wq, and finally press Enter(回车) to save successfully.
Normally during compilation, using colcon build will automatically enable the CMAKE_EXPORT_COMPILE_COMMANDS=ON parameter.
- Then configure the clangd plugin.
- First, download the clangd plugin.

- Download the clangd file
- First, download the clangd plugin.
Hold down Ctrl+Shift+P to open the search box.
Enter clangd, find the "Download Language Server" option, and click to install clangd (please ensure a stable internet connection).

6. Next, configure clangd:
Disable C/C++ code suggestion features.

If the pop-up shown above does not appear, you can manually close it. Again, press Ctrl+Shift+P, type "settings", and then find the option shown in the image below.

Find the option shown in the image below and change it to disabled.
"C_Cpp.intelliSenseEngine": "disabled"

- Restart clangd
Then press Ctrl+Shift+P, search for "clangd", and find the option shown in the image below (before restarting the clangd language server, you need to run colcon build first).

The code hints are working normally now.

Install other tools
terminal
We choose to install Terminator (optional, depends on personal preference—there's an even better one called Warp, see below).
sudo apt install terminator

| Shortcut keys | Function | Memory techniques |
|---|---|---|
Ctrl + Shift + E | Vertical split screen, left and right split | E = East, open a window to the east, meaning left-right split. |
Ctrl + Shift + O | Horizontal split screen, top and bottom split | O = Over / Under, stacked vertically |
Ctrl + Shift + S | Hide/Show scrollbar | S = Scrollbar |
F11 | Full screen / Exit full screen | F = Fullscreen — F11 has always been the fullscreen key for many applications. |
Ctrl + Tab | Switch between different panes | Similar to switching tabs in a browser, it cycles through them. |
Ctrl + L | Clear screen | L in "clear L" can also be understood as "pull to a new page." |
Ctrl + Shift + W | Close the current pane. | W = Window, closes the current small window. |
Ctrl + Shift + Q | Exit the entire Terminator. | Q = Quit, exits the program. |
Because its font is very dark, you need to adjust the settings.
cp ~/.config/terminator/config ~/.config/terminator/config.bak
vim ~/.config/terminator/config
Press ggdG, note the case.
Then press the insert button.
Then set the file content to:
[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]
Finally, press ESC, type :wq to save and exit.
Then completely close Terminator, and reopen it. This configuration will do several things:
- Background: a deep gray close to Konsole Breeze, not pure black.
- Font color: nearly pure white, much brighter than before.
- Blue: Switch to a brighter KDE blue
- Green/yellow/cyan: also overall brightening.
- Top red title bar: change to gray, no longer so glaring.
Warp Terminal (recommended, looks better, also supports split screen)
Compared to Terminator, Warp Terminal's default appearance is more modern, the font is clearer, and the interface is brighter.
Most importantly, it also supports multi-pane split screens like Terminator, so it can serve as a modern replacement for Terminator.
However, note that Warp's keyboard shortcuts are not exactly the same as Terminator's.
- Install
- Ubuntu / Debian installation
wget -O warp-terminal.deb "https://app.warp.dev/download?package=deb" sudo apt install ./warp-terminal.deb
- Ubuntu / Debian installation
After installation is complete, you can open Warp from the application menu, or type in the terminal:
warp-terminal
```
2. Fedora / RHEL Installation
If you are using distributions like Fedora, RHEL, or CentOS, you can install the rpm package:
```bash
wget -O warp-terminal.rpm "https://app.warp.dev/download?package=rpm"
sudo dnf install ./warp-terminal.rpm
```
The startup method is the same:
```bash
warp-terminal
```
2. Warp Common Keyboard Shortcuts
|Shortcut keys|Function|Memory techniques|
|---|---|---|
|`Ctrl + Shift + D`|Split screen to the right|**D = Divide**, splits out a new pane, default opens to the right.|
|`Ctrl + Shift + E`|Split Downwards|**E = Extend Down**, extend a new pane downward|
|`Ctrl + Alt + 方向键`|Switch pane by direction|Press the direction key corresponding to where you want to go.|
|`Ctrl + Shift + [`|Switch to the previous pane|`[` can be understood as cutting forward.|
|`Ctrl + Shift + ]`|Switch to the next pane.|`]` can be understood as cutting backwards.|
|`Ctrl + Shift + Enter`|Maximize/restore current pane|Enter to enter the focus mode of the current pane|
|`Ctrl + Shift + W`|Close the current pane.|**W = Window**, close the current small window.|
|`Ctrl + Shift + T`|New tab|**T = Tab**, opens a new tab.|
|`Ctrl + PageUp`|Switch to the previous tab.|Similar to switching browser tabs|
|`Ctrl + PageDown`|Switch to the next tab.|Similar to switching browser tabs|
|`Ctrl + L`|Clear screen|**L in L = clear**, equivalent to navigating to a new page.|
|`Ctrl + =`|Increase font size|Next to the equals sign, there is usually also a plus sign, indicating enlargement.|
|`Ctrl + -`|Reduce font size|Minus sign, indicates zoom out.|
|`Ctrl + 0`|Restore default font size|Reset to default|
3. Features of Warp
- By default, it looks better than Terminator, so no need to bother with color schemes.
- Supports persistent split screen, suitable for large screen development.
- The font rendering is quite clear, and it looks brighter than Terminator.
- Supports command blocks, long command outputs appear clearer.
- Supports AI features, but can also be used as a normal terminal without AI.
When opening Warp for the first time, it may require an internet connection for initialization. After that, it can be used as a regular terminal even offline, though cloud-based features like AI and collaboration will not be available.
If you just want a traditional, stable, lightweight terminal, you can continue to use Terminator.
If you want a better-looking interface, a more modern interactive experience, and also need split-screen, then Warp is a great choice.
在 KDE Dolphin 中右键使用 Warp 打开当前目录
即使已经在 KDE 的“默认应用程序”中将终端设置为 Warp,Dolphin 的“在此处打开终端”仍然可能没有反应。这是 Dolphin/KIO 与 Warp Linux 版启动方式的兼容问题,可以通过添加一个 Dolphin 服务菜单解决。
- 创建 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
- 配置 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。
- 创建 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 替换为当前选中的文件夹路径。
- 设置权限、刷新 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,与这个右键菜单无关。
git

Our Git introductory tutorial: Vinci Robotics Team Git Introductory Tutorial
ROS2 Architecture Framework




Client Library refers to the ROS2 client libraries, such as rclcpp and rclpy.
The Abstract DDS Layer is a DDS abstraction layer that makes DDS pluggable, allowing the DDS module to be easily swapped out.
Intra-process APIs are in-process communication APIs, a type of API that can improve communication efficiency.

