ROS2 erweiterte Schnittstellen und Middleware
10 TF2-Koordinatentransformation
10 TF2-Koordinatentransformation (TF2 Transform)
10.1 TF2-Übersicht
10.1.1 Was ist TF2
TF2 (Transform 2) ist die in ROS 2 verwendete Bibliothek zur Verwaltung von Koordinatenänderungen. Sie verfolgt Beziehungen zwischen mehreren Koordinatensystemen und ermöglicht es Entwicklern, Daten (z. B. Punkt, Vektor, Lage) zwischen verschiedenen Koordinatensystemen zu konvertieren.
10.1.2 Verwendung von TF2
| Anwendung | Anmerkungen |
|---|---|
| Sensorintegration | Daten von verschiedenen Sensoren in das einheitliche Koordinatensystem konvertieren |
| Navigation | Kartenkoordinatensystem in Roboterkoordinaten konvertieren. |
| Roboterarm | Berechnet die Lage des Endeffektors über der Basis |
| Visualisierung | Roboterzustand korrekt in RViz2 anzeigen |
10.1.3 Bezeichnung der Koordinaten
| Name | Zweck |
|---|---|
| Map | Globale/Welt-Koordinaten, fest und unverändert |
| odom | Das Kilometer-Koordinatensystem zur Positionierung. |
| base_link | Die Roboter-Basis-Koordinaten. |
| base_footprint | Die Projektion des Roboterchassis auf den Boden. |
| Camera_link | Kamerakoordinatensystem |
| Laser_link | Laserradar-Koordinatensystem |
23, ROS2 TF2-Koordinaten konvertiert.
Einführung in TF2
Koordinierte Systeme sind ein sehr vertrautes Konzept und eine wichtige Grundlage in der Robotik, und es wird viele Koordinationssysteme in einem vollständigen Robotersystem geben, und wie sollte der Standort dieser Koordinaten verwaltet werden? ROS hat uns einen koordinierten Dekorator zur Verfügung gestellt: TF2
2. Koordinatensysteme in Robotern
Koordinaten sind in mobilen Robotersystemen gleichermaßen wichtig, wie z. B. der Mittelpunkt eines mobilen Roboters base_link ist, die Position des Radars wird Radar-Koordinaten-Inseln laser_link genannt, wo sich der Roboter bewegt, und der Kubikmeter akkumuliert, was odom genannt wird, was wiederum kumulativen Fehler und Drift hat, und der absolute Standort wird Kartenkoordinaten Map Map genannt.

Das untere Prinzip der TF-Funktion in ROS ist, dass diese mathematischen Variationen gekapselt sind, und detailliertes theoretisches Wissen ist Ihnen allen im Lehrplan der Robotik zugänglich, und wir erklären hauptsächlich, wie TF-Koordinatenmanagementsysteme verwendet werden.
3 TF-Befehlszeilenoperationen
3.1. Installation der Werkzeuge
sudo apt install ros-${ROS_DISTRO}-turtle-tf2-py ros-humble-tf2-tools
sudo pip3 install transforms3d
sudo apt install ros-${ROS_DISTRO}-rqt-tf-tree3.2. Starten
# ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
ros2 run turtlesim turtle_teleop_key3.3. TF-Baum anzeigen
ros2 run rqt_tf_tree rqt_tf_tree3.4. Koordinaten abfragen, um Informationen zu ändern
ros2 run tf2_ros tf2_echo turtle2 turtle13.5. Visualisierung von Koordinaten
rviz24. Statische Koordinatenkonvertierung
4.1. Verteilung von A nach B-Positionen
ros2 run tf2_ros static_transform_publisher 0 0 3 0 0 3.14 A B4.2. Abfangen/Zugriff auf TF-Beziehungen
ros2 run tf2_ros tf2_echo A B4.3, rivz-Visualisierung
rviz25. Präsentation von Fällen
7. Neues Funktionspaket
ros2 pkg create pkg_tf --build-type ament_python --dependencies rclpy --node-name turtle_tf_broadcasterimport math
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import TransformStamped
from tf2_ros import TransformBroadcaster
from turtlesim.msg import Pose
def quaternion_from_euler(roll, pitch, yaw):
cy = math.cos(yaw * 0.5)
sy = math.sin(yaw * 0.5)
cp = math.cos(pitch * 0.5)
sp = math.sin(pitch * 0.5)
cr = math.cos(roll * 0.5)
sr = math.sin(roll * 0.5)
w = cr * cp * cy + sr * sp * sy
x = sr * cp * cy - cr * sp * sy
y = cr * sp * cy + sr * cp * sy
z = cr * cp * sy - sr * sp * cy
return (x, y, z, w)
class TurtleTFBroadcaster(Node):
def __init__(self, name):
super().__init__(name)
self.turtlename = self.declare_parameter('turtlename', 'turtle').value
self.tf_broadcaster = TransformBroadcaster(self)
self.subscription = self.create_subscription(
Pose,
f'/{self.turtlename}/pose',
self.turtle_pose_callback, 1)
def turtle_pose_callback(self, msg):
transform = TransformStamped()
transform.header.stamp = self.get_clock().now().to_msg()
transform.header.frame_id = 'world'
transform.child_frame_id = self.turtlename
transform.transform.translation.x = msg.x
transform.transform.translation.y = msg.y
transform.transform.translation.z = 0.0
q = quaternion_from_euler(0, 0, msg.theta)
transform.transform.rotation.x = q[0]
transform.transform.rotation.y = q[1]
transform.transform.rotation.z = q[2]
transform.transform.rotation.w = q[3]
self.tf_broadcaster.sendTransform(transform)
def main(args=None):
rclpy.init(args=args)
node = TurtleTFBroadcaster("turtle_tf_broadcaster")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
DeclareLaunchArgument('source_frame', default_value='turtle1', description='Target frame name.'),
Node(package='turtlesim', executable='turtlesim_node'),
Node(package='pkg_tf', executable='turtle_tf_broadcaster',
name='broadcaster1', parameters=[{'turtlename': 'turtle1'}]),
Node(package='pkg_tf', executable='turtle_tf_broadcaster',
name='broadcaster2', parameters=[{'turtlename': 'turtle2'}]),
Node(package='pkg_tf', executable='turtle_following',
name='listener', parameters=[{'source_frame': LaunchConfiguration('source_frame')}]),
])8. Konfigurationsdateien bearbeiten
import os
from glob import glob(os.path.join('share',package_name,'launch'),glob('launch/*')),9. Funktionspaket kompilieren
colcon build --packages-select pkg_tfBetriebsabläufe
# source install/setup.bash
ros2 launch pkg_tf turtle_following.launch.pyros2 run turtlesim turtle_teleop_keyBenutzerdefinierte Schnittstellennachricht
11 Benutzerdefinierte Schnittstellennachrichten
Im ROS-System hängen die drei Arten von Kommunikationsmechanismen, Topic, Service und Action, alle von einem Kernkonzept ab: der Kommunikationsschnittstelle.
11.1 Erstellen eines benutzerdefinierten Schnittstellenprozesses
Die Hauptschritte sind wie folgt:
Schnittstellen-Funktionspaket erstellen
.msg-Dateien, .srv-Dateien, .action-Dateien erstellen und bearbeiten
Konfigurationsdatei bearbeiten
Kompilieren
Testen
11.2 Benutzerdefinierte Schnittstelle für Action-Kommunikation erstellen
11.3 Benutzerdefinierte Schnittstelle für Topic-Kommunikation erstellen
string name
int32 age
float64 height# CMakeLists.txt
rosidl_generate_interfaces(${PROJECT_NAME}
"action/Progress.action"
"msg/Person.msg"
)# package.xml
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>cd ~/workspace
colcon build --packages-select pkg_interfacesros2 interface show pkg_interfaces/msg/Person11.4 Benutzerdefinierte Schnittstelle für Service-Kommunikation erstellen
int32 num1
int32 num2
---
int32 sumrosidl_generate_interfaces(${PROJECT_NAME}
"action/Progress.action"
"msg/Person.msg"
"srv/Add.srv"
)<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>cd ~/workspace
colcon build --packages-select pkg_interfaces
source install/setup.bashros2 interface show pkg_interfaces/srv/Add11.5 Nächste Schritte
1.12 Parameter-Service-Fälle
2.13 Meta-Funktionspakete
12 Parameter-Service-Fälle
12 Parameter-Services (Parameters)
12.1 Übersicht über die Parameter
In ROS-Robotersystemen wirken Parameter als globale C++-Variablen und bieten einfache Datenfreigabemechanismen für mehrere Knoten.
12.2 Parameter in der kleinen Schildkröten-Routine
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_keyros2 param listros2 param describe turtlesim background_b
ros2 param get turtlesim background_b
ros2 param set turtlesim background_b 10ros2 param dump turtlesim >> turtlesim.yaml
ros2 param load turtlesim turtlesim.yaml12.3 Parameter-Fälle
12.3.1 Neues Funktionspaket
ros2 pkg create pkg_param --build-type ament_python --dependencies rclpy --node-name param_demo12.3.2 Code-Realisierung
import rclpy
from rclpy.node import Node
class ParameterNode(Node):
def __init__(self, name):
super().__init__(name)
self.timer = self.create_timer(2.0, self.timer_callback)
self.declare_parameter('robot_name', 'muto')
def timer_callback(self):
robot_name_param = self.get_parameter('robot_name').get_parameter_value().string_value
self.get_logger().info('Hello %s!' % robot_name_param)
def main(args=None):
rclpy.init(args=args)
node = ParameterNode("param_declare")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()12.3.3 Funktionspaket kompilieren
colcon build --packages-select pkg_param12.3.4 Betriebsabläufe
# source install/setup.bash
ros2 run pkg_param param_demoros2 param set param_declare robot_name robot12.4 Nächste Schritte
1.13 Meta-Funktionspakete
2.14 Verteilte Kommunikation
13 Meta-Paket
13 Metapakete
13.1 Zusammenfassung der Meta-Funktionspakete
13.1.1 Was ist ein metafunktionales Kit
sudo apt install ros-humble-desktop13.1.2 Rolle der Meta-Funktionspakete
| Zweck | Anmerkungen |
|---|---|
| Organisationen | Verwandte Funktionspakete gruppieren |
| Vereinfachte Installation | Installation mehrerer Pakete gleichzeitig |
| Abhängigkeit vom Management | Einheitliches Abhängigkeitsmanagement |
| Dokumentation | Klare Projektstruktur |
| Versionskontrolle | Harmonisierte Veröffentlichung und Verwaltung von Versionen |
13.2 Implementierungsfälle
ros2 pkg create pkg_metapackage<?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>pkg_metapackage</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="1461190907@qq.com">root</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<exec_depend>pkg_interfaces</exec_depend>
<exec_depend>pkg_helloworld_py</exec_depend>
<exec_depend>pkg_topic</exec_depend>
<exec_depend>pkg_service</exec_depend>
<exec_depend>pkg_action</exec_depend>
<exec_depend>pkg_param</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>cmake_minimum_required(VERSION 3.5)
project(pkg_metapackage)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
ament_package()colcon build --packages-select pkg_metapackage13.3 Nächste Schritte
1.14 Verteilte Kommunikation - Verteilte Kommunikation lernen
DDS - DDS-Mittelstufe lernen
14 Verteilte Kommunikation
14 Verteilte Kommunikation
14.1 Zusammenfassung der verteilten Kommunikation
ROS2 ist ein leistungsfähiges Framework für verteilte Kommunikation, das eine einfache Hostübergreifende Netzwerkdateninteraktion ermöglicht. Die Basis basiert auf der DDS (Data Distribution Service) Middleware, die die Kommunikation über die ROS_DOMAIN_ID verwaltet: Wenn die Knoten auf verschiedenen Geräten dieselbe Domain-ID setzen und sich im selben Netzwerk befinden, erkennen sie automatisch und kommunizieren frei; im Gegenteil, die IDs sind voneinander getrennt.
14.1.1 Was ist verteilte Kommunikation
ROS 2 verteilte Kommunikation ermöglicht es mehreren Computerknoten, ohne zentrale Server miteinander zu kommunizieren. Dies wird über DDS (Data Distribution Service) erreicht.
14.1.2 Eigenschaften der verteilten Kommunikation
| Eigenschaften | Anmerkungen |
|---|---|
| Unzentralisiert | Nicht erforderlich, ROS Master. |
| Auto-Erkennung | Knoten findet automatisch andere Knoten im Netzwerk |
| Plattformübergreifend | Kommunikation zwischen verschiedenen Betriebssystemen |
| Zuverlässige Übertragung | Unterstützt mehrere QoS-Richtlinien |
14.2 ROS_DOMAIN_ID
14.2.1 Domain-ID-Konzept
ROS_DOMAIN_ID wird verwendet, um verschiedene ROS2-Netzwerke zu isolieren.
14.3 Erreicht
14.3.1 Standard-Erreichung
ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener14.3.2 Verteilte Netzwerksubgruppen
$ export ROS_DOMAIN_ID=<your_domain_id>14.3.3 Fall 1
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py talkerecho "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py listenerFall 2
ros2 run turtlesim turtlesim_noderos2 run turtlesim turtle_teleop_key14.4 Aufmerksamkeit
14.5 Regeln zur Berechnung der DDS-Domain-ID-Werte (Niveauwissen)
14.6 Nächste Schritte
DDS - Tiefgehendes Lernen DDS-Mittelstufe
Zeitbezogene API - Time API lernen
https://fast-dds.docs.eprosima.com/en/latest/
15 DDS
15 DDS (Data Distribution Service)
15.1 Übersicht über DDS
15.1.1 Was ist DDS?
DDS (Data Distribution Service) ist ein datenzentrierter Publikations-Abonnement-Mittelstandard, und ROS 2 verwendet DDS, um Kommunikation auf niedrigerer Ebene zu erreichen.
15.1.2 DDS-Kernfunktionen
| Funktionen | Anmerkungen |
|---|---|
| Erkennungsmechanismen | DDS-Teilnehmer im Netzwerk automatisch finden |
| Veröffentlichung/Abonnement | Datenübertragungsmodus gelöst |
| QoS-Richtlinie | Verfügbare Servicequalität |
| Typsystem | Stark typisierte Datendefinition |
| Null Kopien | Effiziente Datenübertragung |
15.2 Kommunikationsmodelle
15.3 Anwendungen von DDS in ROS2
15.4 Qualitätsservicestrategie
QoS kann als webbasierte Übertragungsregel verstanden werden: Die Anwendung wird ihr gewünschtes Übertragungsqualitätsverhalten deklarieren, während der QoS-Mechanismus dafür verantwortlich ist, diese Anforderungen so weit wie möglich zu erfüllen.
Die Strategie ist wie folgt:
DEADLINE-Strategie: gibt an, dass jede Datenkommunikation mindestens einmal innerhalb der vorgeschriebenen Frist abgeschlossen sein muss;
HISTORY-Richtlinie: gibt Größenbeschränkungen für historische Datencaches an;
RELIABILITY-Richtlinie: stellt ein zuverlässiges Muster der Datenübertragung dar.
DURABILITY-Richtlinie: kann konfiguriert werden, um historische Daten für später eintreffende Knoten bereitzustellen, sodass neue Knoten schneller in das System eintreten können.
15.5. Testfälle
Fall 1 - DDS per Befehlszeile konfigurieren
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 66" --qos-reliability best_effortros2 topic echo /chatter --qos-reliability reliable