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

AnwendungAnmerkungen
SensorintegrationDaten von verschiedenen Sensoren in das einheitliche Koordinatensystem konvertieren
NavigationKartenkoordinatensystem in Roboterkoordinaten konvertieren.
RoboterarmBerechnet die Lage des Endeffektors über der Basis
VisualisierungRoboterzustand korrekt in RViz2 anzeigen

10.1.3 Bezeichnung der Koordinaten

NameZweck
MapGlobale/Welt-Koordinaten, fest und unverändert
odomDas Kilometer-Koordinatensystem zur Positionierung.
base_linkDie Roboter-Basis-Koordinaten.
base_footprintDie Projektion des Roboterchassis auf den Boden.
Camera_linkKamerakoordinatensystem
Laser_linkLaserradar-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

bash
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-tree

3.2. Starten

bash
# ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
ros2 run turtlesim turtle_teleop_key

3.3. TF-Baum anzeigen

bash
ros2 run rqt_tf_tree rqt_tf_tree

3.4. Koordinaten abfragen, um Informationen zu ändern

bash
ros2 run tf2_ros tf2_echo turtle2 turtle1

3.5. Visualisierung von Koordinaten

bash
rviz2

4. Statische Koordinatenkonvertierung

4.1. Verteilung von A nach B-Positionen

bash
ros2 run tf2_ros static_transform_publisher 0 0 3 0 0 3.14 A B

4.2. Abfangen/Zugriff auf TF-Beziehungen

bash
ros2 run tf2_ros tf2_echo A B

4.3, rivz-Visualisierung

bash
rviz2

5. Präsentation von Fällen

7. Neues Funktionspaket

bash
ros2 pkg create pkg_tf --build-type ament_python --dependencies rclpy --node-name turtle_tf_broadcaster
bash
import 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()
python
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

bash
import os
from glob import glob
bash
(os.path.join('share',package_name,'launch'),glob('launch/*')),

9. Funktionspaket kompilieren

bash
colcon build --packages-select pkg_tf

Betriebsabläufe

bash
# source install/setup.bash
ros2 launch pkg_tf turtle_following.launch.py
bash
ros2 run turtlesim turtle_teleop_key

Benutzerdefinierte 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

bash
string  name
int32  age
float64  height
bash
# CMakeLists.txt
rosidl_generate_interfaces(${PROJECT_NAME}
  "action/Progress.action"
  "msg/Person.msg"
)
bash
# 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>
bash
cd ~/workspace
colcon build --packages-select pkg_interfaces
bash
ros2 interface show pkg_interfaces/msg/Person

11.4 Benutzerdefinierte Schnittstelle für Service-Kommunikation erstellen

bash
int32 num1
int32 num2
---
int32 sum
bash
rosidl_generate_interfaces(${PROJECT_NAME}
  "action/Progress.action"
  "msg/Person.msg"
  "srv/Add.srv"
)
bash
<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>
bash
cd ~/workspace
colcon build --packages-select pkg_interfaces
source install/setup.bash
bash
ros2 interface show pkg_interfaces/srv/Add

11.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

bash
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
bash
ros2 param list
bash
ros2 param describe turtlesim background_b
ros2 param get turtlesim background_b
ros2 param set turtlesim background_b 10
bash
ros2 param dump turtlesim >> turtlesim.yaml
ros2 param load turtlesim turtlesim.yaml

12.3 Parameter-Fälle

12.3.1 Neues Funktionspaket

bash
ros2 pkg create pkg_param --build-type ament_python --dependencies rclpy --node-name param_demo

12.3.2 Code-Realisierung

bash
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

bash
colcon build --packages-select pkg_param

12.3.4 Betriebsabläufe

bash
# source install/setup.bash
ros2 run pkg_param param_demo
bash
ros2 param set param_declare robot_name robot

12.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

bash
sudo apt install ros-humble-desktop

13.1.2 Rolle der Meta-Funktionspakete

ZweckAnmerkungen
OrganisationenVerwandte Funktionspakete gruppieren
Vereinfachte InstallationInstallation mehrerer Pakete gleichzeitig
Abhängigkeit vom ManagementEinheitliches Abhängigkeitsmanagement
DokumentationKlare Projektstruktur
VersionskontrolleHarmonisierte Veröffentlichung und Verwaltung von Versionen

13.2 Implementierungsfälle

bash
ros2 pkg create pkg_metapackage
bash
<?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>
bash
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()
bash
colcon build --packages-select pkg_metapackage

13.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

EigenschaftenAnmerkungen
UnzentralisiertNicht erforderlich, ROS Master.
Auto-ErkennungKnoten findet automatisch andere Knoten im Netzwerk
PlattformübergreifendKommunikation zwischen verschiedenen Betriebssystemen
Zuverlässige ÜbertragungUnterstü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

bash
ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener

14.3.2 Verteilte Netzwerksubgruppen

bash
$ export ROS_DOMAIN_ID=<your_domain_id>

14.3.3 Fall 1

bash
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py talker
bash
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py listener

Fall 2

bash
ros2 run turtlesim turtlesim_node
bash
ros2 run turtlesim turtle_teleop_key

14.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

FunktionenAnmerkungen
ErkennungsmechanismenDDS-Teilnehmer im Netzwerk automatisch finden
Veröffentlichung/AbonnementDatenübertragungsmodus gelöst
QoS-RichtlinieVerfügbare Servicequalität
TypsystemStark typisierte Datendefinition
Null KopienEffiziente 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

bash
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 66" --qos-reliability best_effort
bash
ros2 topic echo /chatter --qos-reliability reliable