ROS2-fundamenten en setup

Hoofdstuk IX ROS2-Humble

NaamEigenaarGewijzigdAangemaakt
01 ROS2-introductieYujiang2026-01-09 14:032026-01-09 14:03
02 Humble installerenYujiang2026-01-26 12:122026-01-09 14:03
03 Geïntegreerde ontwikkelomgevingYujiang2026-01-26 14:552026-01-09 14:24
04 WerkruimteYujiang2026-01-12 12:222026-01-09 14:25
05 PakketYujiang2026-01-12 12:222026-01-09 14:26
06 KnooppuntYujiang2026-02-13 13:282026-01-09 14:26
07 TopiccommunicatieYujiang2026-02-13 13:292026-01-09 14:27
08 ServicecommunicatieYujiang2026-02-06 13:572026-01-09 14:27
09 Action-communicatieYujiang2026-01-27 14:482026-01-09 14:27
10 TF2-coördinatentransformatieYujiang2026-01-27 14:552026-01-09 14:28

Inhoudsonderhoud...

01 ROS2-introductie

1.1 Wat is ROS 2

ROS 2 (Robot Operation System 2) is een open-source intermediair framework voor de ontwikkeling van robotsoftware. Hoewel de naam „besturingssystemen" bevat, is ROS 2 eigenlijk geen traditioneel besturingssysteem, maar een softwarerepository en gereedschappen die ontwikkelaars helpen om robottoepassingen te maken.

1.1.1 Definitie van ROS 2

ROS 2 biedt de service van het besturingssysteem, dat normaal gesproken berichten tussen processen verzendt en pakketbeheer uitvoert. Het is een gedistribueerd framework dat applicaties in staat stelt robothardware te besturen, sensorgegevens te verwerken, algoritmen uit te voeren en met andere applicaties of systemen te communiceren.

1.1.2 Ontwerpdoelen voor ROS 2

DoelWaarom het belangrijk is
Real-time vriendelijkheidBetere ondersteuning voor robotica-werklasten met lage latentie
Gedistribueerde implementatieMeerdere knooppunten kunnen over veel processen of machines worden uitgevoerd
Betrouwbaarheid en onderhoudbaarheidBeter geschikt voor productierobotica dan ROS 1-tijdperk-aannames
BeveiligingOndersteunt veilige communicatie en toegangscontrole
Multiplatform-ondersteuningWerkt op Linux, ingebouwde doelen en andere moderne omgevingen

1.1.3 ROS 2-kernwaarden

  1. Modulair ontwerp: code georganiseerd in afzonderlijke pakketten die gemakkelijk te onderhouden, hergebruiken en verspreiden zijn

  2. Gedistribueerde communicatie: multiprocessor-, multi-machine gedistribueerde computerarchitectuur

  3. Rijke ecosystemen: bevatten een groot aantal open-source functionele pakketten en ontwikkeltools

  4. Actieve gemeenschappen: een aanhoudende bijdrage van wereldwijde ontwikkelaars en actieve ondersteuning van zakelijke bedrijven

1.2 ROS 2-kernconcept

1.2.1 Knooppunten (Nodes)

Knooppunt is de meest basale rekeneenheid in ROS 2. Een knooppunt is een proces dat de ROS 2 API gebruikt om met andere knooppunten te communiceren.

1.2.2 Topics

Het topic is het mechanisme voor eilandachtige communicatie tussen knooppunten, waarbij gebruik wordt gemaakt van de publicatie/abonnement (Pub/Sub).

KenmerkBeschrijving
AsynchroonUitgevers en abonnees blokkeren elkaar niet
Een-op-veelMeerdere abonnees kunnen hetzelfde topic consumeren
Losjes gekoppeldKnooppunten zijn alleen overeengekomen over de topicnaam en het berichttype
StreamingvriendelijkGoed geschikt voor sensorgegevens, telemetrie en continue besturing

Voorbeeld van een typisch topic:

OnderwerpnaamBerichttypeDoel
/cmd_velgeometry_msgs/msg/TwistSnelheidsbesturingscommando
/odomnav_msgs/msg/Odometrykilometergegevens
/scansensor_msgs/msg/LaserScanLaserradargegevens
/camera/image_rawsensor_msgs/msg/ImageOriginele beeldgegevens

1.2.3 Services

Services zijn het mechanisme voor gesynchroniseerde communicatie tussen knooppunten, met behulp van het client/server-model.

1.2.4 Actions

Actions zijn communicatiemechanismen die worden gebruikt om langetermijnopdrachten af te handelen om feedback en annulering van opdrachten te ondersteunen.

StreamDoel
GoalBeschrijft de uit te voeren taak
FeedbackRapporteert voortgang terwijl de taak wordt uitgevoerd
ResultRetourneert het uiteindelijke resultaat wanneer de taak eindigt

1.2.5 Parameters

Parameters zijn configuratiewaarden voor knooppunten, die kunnen worden ingesteld bij het opstarten van knooppunten of dynamisch tijdens het uitvoeren worden gewijzigd.

Code
Plain Text
Node: camera_node
├── Parameter: frame_id = "camera_link"
├── Parameter: width = 640
├── Parameter: height = 480
├── Parameter: fps = 30
└── Parameter: exposure_mode = "auto"

Dynamic update example:
$ ros2 param set camera_node exposure_mode "manual"

1.3 ROS 2-structuur

1.3.2 Clientbibliotheek (Client Libraries)

BibliotheekTaalTypisch gebruik
rclcppC++Hoogwaardige productieknooppunten
rclpyPythonSnelle prototyping en scripting
rclcCMicro-ROS en systemen met beperkte middelen
rcljavaJavaJVM-gebaseerde ROS 2-integraties
rclnodejsJavaScript / Node.jsWeb- en tooling-integraties
cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class Publisher : public rclcpp::Node {
public:
  Publisher() : Node("publisher") {
  publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
  timer_ = this->create_wall_timer(
  std::chrono::milliseconds(500),
  [this]() { this->timer_callback(); });
  }
private:
  void timer_callback() {
  auto msg = std_msgs::msg::String();
  msg.data = "Hello ROS 2";
  publisher_->publish(msg);
  }
  rclcpp::TimerBase::SharedPtr timer_;
  rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
};
python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Publisher(Node):
  def __init__(self):
  super().__init__('publisher')
  self.publisher_ = self.create_publisher(String, 'topic', 10)
  self.timer = self.create_timer(0.5, self.timer_callback)

  def timer_callback(self):
  msg = String()
  msg.data = 'Hello ROS 2'
  self.publisher_.publish(msg)

1.3.3 RMW en DDS

RMW-implementatieDDS-backendOpen source/commercieelKenmerken
rmw_cyclonedds_cppCycloneDDSOpen SourceStandaardselectie, lichte efficiëntie
rmw_fastrtps_cppFastDDSOpen SourceHet is zeer functioneel en presteert goed.
rmw_connext_cppRTI ConnextCommercieelIndustriële ondersteuning, het meest uitgebreid

1.4 Belangrijke verschillen tussen ROS 1 en ROS 2

1.4.2 Gedetailleerde vergelijkingstabellen

Relatieve dimensiesROS 1ROS 2
CommunicatiemiddenstukTCP/UDP aangepast protocolDDS-standaardprotocol
DetectiemechanismenROS Master (gecentraliseerd)Detectie van DDS (decentralisatie)
Build-systeemCatkinColcon / Ament
Python-versiePython 2/3Alleen Python 3
Ondersteunde besturingssystemenHoofdzakelijk LinuxLinux / Windows / macOS / RTOS
Realtime ondersteuningGeen realtime garantieOndersteunt hardwarematige realtime
Multi-robotcommunicatieAanvullende configuratie vereistNative ondersteuning (ROS_DOMAIN_ID)
BeveiligingGeen versleuteling of authenticatieOndersteunt versleuteling, authenticatie, toegangscontrole
ReleaseNoetic (laatste versie)Humble, Iron, Jazzy...

1.5 ROS 2 release

1.5.1 Versiegeschiedenis

Versie-aanduidingReleasetijdOndersteund systeemOndersteuningsstatusDeadline
Ardent2017.12Ubuntu 16.04Beëindigd2019.04
Bouncy2018.06Ubuntu 16.04/18.04Beëindigd2019.09
Crystal2018.12Ubuntu 16.04/18.04Beëindigd2020.12
Dashing2019.05Ubuntu 16.04/18.04Beëindigd2021.05
Eloquent2019.11Ubuntu 18.04Beëindigd2021.11
Foxy2020.06Ubuntu 18.04/20.04Beëindigd2023.05
Galactic2021.05Ubuntu 20.04Beëindigd2022.11
Humble2022.05Ubuntu 22.04LTS2027.05
Iron2023.05Ubuntu 22.04Beëindigd2024.11
Jazzy2024.05Ubuntu 24.04LTS2029.05

1.5.3 Voorstel voor de selectie van een versie

GebruiksscèneAanbevolen versieReden
ProductieomgevingHumbleStabiel, langetermijnondersteuning
Nieuwe projectontwikkelingJazzyNieuwste LTS, langetermijnondersteuning
Studie/experimentRecent ScrollNieuwste functies
Onderhoud van oude systemenHumbleDe compatibiliteit is goed.

03 Geïntegreerde ontwikkelomgeving

03 Geïntegreerde ontwikkelomgeving (IDE Setup)

3.1 Algemeen

Een goede configuratie van de ontwikkelomgeving kan de efficiëntie van ROS 2-ontwikkeling aanzienlijk verbeteren. Dit hoofdstuk biedt gedetailleerde informatie over hoe Visual Studio Code (VS Code) te configureren als de belangrijkste ontwikkelomgeving voor ROS 2, inclusief plugin-installatie, slimme codecompletering, debugconfiguratie, enz.

3.2 Installatie van Visa Studio Code

bash
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install -y code
bash
sudo snap install --classic code
bash
code --version

3.3 Vereiste plugins

Plugin-naamUitgeverDoel
ROSMicrosoftROS-ondersteuning
C/C++MicrosoftOndersteuning voor C++-taal
PythonMicrosoftOndersteuning voor Python-taal
CMake ToolsMicrosoftCMake-ondersteuning
bash
code --install-extension ms-iot.vscode-ros
code --install-extension ms-vscode.cpptools
code --install-extension ms-python.python
code --install-extension ms-vscode.cmake-tools

3.4 ROS 2-werkruimteconfiguratie

bash
code ~/ros2_ws
json
{
  "configurations": [
  {
  "name": "Linux",
  "includePath": [
  "${workspaceFolder}/**",
  "/opt/ros/humble/include/**",
  "/usr/include/**"
  ],
  "defines": [],
  "compilerPath": "/usr/bin/gcc",
  "cStandard": "c17",
  "cppStandard": "c++17",
  "intelliSenseMode": "linux-gcc-x64",
  "compileCommands": "${workspaceFolder}/build/compile_commands.json"
  }
  ],
  "version": 4
}
bash
cd ~/ros2_ws
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
ln -s build/compile_commands.json
json
{
  "python.autoComplete.extraPaths": [
  "${workspaceFolder}/install/*/lib/python3.10/site-packages",
  "/opt/ros/humble/lib/python3.10/site-packages"
  ],
  "python.analysis.extraPaths": [
  "${workspaceFolder}/install/*/lib/python3.10/site-packages",
  "/opt/ros/humble/lib/python3.10/site-packages"
  ],
  "python.formatting.provider": "black",
  "python.linting.enabled": true,
  "python.linting.pylintEnabled": true
}

3.5 VS Code-taakconfiguratie

json
{
  "version": "2.0.0",
  "tasks": [
  {
  "label": "colcon build",
  "type": "shell",
  "command": "colcon build --symlink-install",
  "group": {
  "kind": "build",
  "isDefault": true
  },
  "problemMatcher": []
  }
  ]
}

3.6 Debugconfiguratie

json
{
  "version": "0.2.0",
  "configurations": [
  {
  "name": "ROS2: C++ Node",
  "type": "cppdbg",
  "request": "launch",
  "program": "${workspaceFolder}/install/${input:packageName}/lib/${input:packageName}/${input:executableName}",
  "args": [],
  "cwd": "${workspaceFolder}",
  "MIMode": "gdb"
  }
  ]
}
SneltoetsenFuncties
F5Debugging starten
Ctrl+Shift+F5Debugging opnieuw starten
Shift+F5Debugging stoppen
F9Onderbrekingspunt instellen/sluiten
F10Step Over
F11Step Into
Shift+F11Step Out

3.11 Installatie van Terminator

bash
sudo apt install terminator

3.11.1 Begin

Sneltoets Ctrl+Alt+T

3.12 Gebruik van Git

bash
sudo apt install git
bash
git init
git add .
git commit
CommandoDoel
git initMaak een nieuwe lokale repository
git statusControleer de huidige repository-status
git add <file>Stage een bestand voor de volgende commit
git commit -m "message"Maak een nieuwe snapshot met een bericht
git diffToon niet-gestagde wijzigingen
git logToon commit-geschiedenis
git remote -vToon geconfigureerde remotes
git push -u origin mainPush en stel upstream branch in
git pullHaal en voeg externe updates samen

3.13 Volgende stappen

04 Werkruimte - Werkruimtebeheer leren

05 Functioneel pakket - Functioneel pakket maken

06 Knooppunt - Knooppuntcode schrijven

04 Werkruimte

04 Werkruimte (Workspace)

4.1 Overzicht van de werkruimte

4.1.1 Wat is een werkruimte?

Werkruimte is de directorystructuur voor het organiseren en beheren van functionele pakketten in ROS 2. Het is een hoofddirectory met broncode, compilatieproducten en installatiedocumenten en is de basisomgeving voor de ROS 2-ontwikkeling.

4.1.2 Werkruimte-cataloguestructuur

InhoudDoelOf versiebeheer
Src/Functioneel pakket-bron opslaanJa
build/Tussenproducten compilerenNee
Install/Definitief installatiebestandNee
log/Compileren en testen van logsNee

4.1.3 Werkgebiedstype

TypeVoorbeeldpadDoel
Systeemwerkruimte/opt/ros/humble/Geïnstalleerde ROS 2-software
Gebruikerswerkruimte~/ros2_ws/Persoonlijke ontwikkeling van werkruimte
Coverwerkruimte~/overlay_ws/Bestaande pakketten uitbreiden of overschrijven

4.2 Aanmaken van werkruimtes

bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
tree -L 2

4.3 Colcon Compileersysteem

bash
sudo apt install -y python3-colcon-common-extensions
colcon --help
bash
cd ~/ros2_ws
colcon build
colcon build --packages-select <package_name>
colcon build --packages-skip <package_name>
bash
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Debug
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

4.4 Werkruimtedekking (Overlaying)

bash
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
source ~/overlay_ws/install/setup.bash

4.5 Gedetailleerde omgevingsinstellingen

bash
source install/setup.bash
echo $ROS_DOMAIN_ID
echo $AMENT_PREFIX_PATH
echo $LD_LIBRARY_PATH
bash
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

4.6 Pakketbeheer

bash
ros2 pkg list
ros2 pkg prefix <package_name>
find src -maxdepth 2 -name package.xml -exec dirname {} \;
bash
ros2 pkg xml <package_name>
ros2 pkg dependencies <package_name>
ros2 pkg list > packages_list.txt

4.7 Incrementele vertaling

bash
colcon build
colcon build --packages-select <modified_package>
bash
colcon build --packages-select <package_name> --cmake-force-configure
rm -rf build install log
colcon build

4.8 Test en certificering

bash
colcon test
colcon test --packages-select <package_name>
colcon test-result --all
colcon test-result --verbose

4.12 Volgende stappen

1.05 Pakket - Leren om functionele pakketten te maken en te beheren

2.06 Knooppunt - Voorbereiding van het eerste knooppunt

05 Pakket

05 Functionele pakketten (Packages)

5.1 Samenvatting van functionele pakketten

5.1.1 Wat is een functioneel pakket?

Het pakket is de basiseenheid van de organisatiecode in ROS 2. Het bevat broncodes, configuratiebestanden, gegevensbestanden, bouwscripts en documenten voor specifieke functies.

5.1.3 Type van functioneel pakket

TypeBuild-systeemHoofdtalenDoel
ament_cmakeCMakeC++C++-knooppunten, gemengde items
ament_pythonSetuptoolsPythonPure Python-project
ament_cmake_pythonCMake + PythonGemengdC++- en Python-gemengde items

5.2 Functionele pakketten maken

bash
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake my_cpp_pkg
ros2 pkg create --build-type ament_cmake \
  --dependencies rclcpp std_msgs \
  my_robot_controller
ros2 pkg create --build-type ament_cmake \
  --dependencies rclcpp std_msgs geometry_msgs \
  --node-name my_node \
  --library-name my_library \
  my_cpp_pkg
bash
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_py_pkg
ros2 pkg create --build-type ament_python \
  --dependencies rclpy std_msgs \
  my_python_package
ros2 pkg create --build-type ament_python \
  --dependencies rclpy \
  --node-name my_node \
  my_py_pkg

5.3 package.xml-configuratie

xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>my_package</name>
  <version>1.0.0</version>
  <description>My ROS 2 package description</description>
  <maintainer email="user@example.com">Your Name</maintainer>
  <license>Apache-2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
  <build_type>ament_cmake</build_type>
  </export>
</package>
xml
<depend>rclcpp</depend>
<depend>rclpy</depend>
<depend>std_msgs</depend>
<depend>geometry_msgs</depend>
<depend>sensor_msgs</depend>
<depend>nav_msgs</depend>
<depend>tf2</depend>
<depend>tf2_ros</depend>
<depend>tf2_geometry_msgs</depend>

5.5 setup.py-configuratie (Python)

python
from setuptools import setup

package_name = 'my_py_pkg'

setup(
  name=package_name,
  version='1.0.0',
  packages=[package_name],
  data_files=[
  ('share/ament_index/resource_index/packages',
  ['resource/' + package_name]),
  ('share/' + package_name, ['package.xml']),
  ],
  install_requires=['setuptools'],
  zip_safe=True,
  maintainer='Your Name',
  maintainer_email='user@example.com',
  description='My ROS 2 Python package',
  license='Apache-2.0',
  tests_require=['pytest'],
  entry_points={
  'console_scripts': [
  'my_node = my_py_pkg.my_node:main',
  ],
  },
)
python
entry_points={
  'console_scripts': [
  'talker = my_py_pkg.talker:main',
  'listener = my_py_pkg.listener:main',
  'camera_node = my_py_pkg.camera:main',
  ],
}

5.6 Compilatie en installatie van pakketten

bash
cd ~/ros2_ws
colcon build --packages-select my_cpp_pkg
colcon build --packages-select my_cpp_pkg --event-handlers console_direct+
bash
colcon build --packages-select pkg1 pkg2 pkg3
colcon build --packages-skip pkg_to_skip
bash
colcon build --symlink-install
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

5.7 Vertrouwen op management

bash
ros2 pkg dependencies my_package
ros2 pkg dependencies my_package --all
ros2 pkg dependents my_package
ros2 pkg xml my_package