ROS2 Services

Image

In deze workshop leer je de basis van ROS2 services. De theorie hiervan wordt gedoceerd, maar kun je ook vinden op deze website van ROS

In deze workshop ga je de gemeten hoogte van de doos uit de topics workshop omrekenen van meters naar inches. We gebruiken hiervoor het ROS services mechanisme. Deze service is al voorbereid. je kunt de service starten met het volgende commando:

ros2 run range_sensor metres_to_inches_server

Om een lijst te verkrijgen van services die actief zijn gebruik je het commando

ros2 service list

Je krijgt nu een list met alle services die actief zijn. Voor deze opdrachten is allen de service /metres_to_inches van belang. Er zijn nog een aan services aanwezig die beginnen met /metres_to_inches en gevolgd door worden door service/…., deze zijn voor ROS2 intern gebruik.

Elke service wordt gedefineerd door een type, Dit type kun je als volgt opvragen:

ros2 service type /metres_to_inches

Ook van de service kun je het protoptype opvragen:

ros2 interface proto <service_type>

Dit prototype is gedefineerd in een servicebeschrijving welke je kunt vinden in het volgende bestand: ~/ros2_industrial_ws/src/ROS2_industrial/1_basics/range_sensors_interfaces/srv/ConvertMetresToInches.srv

gedit ~/ros2_industrial_ws/src/ROS2_industrial/1_basics/range_sensors_interfaces/srv/ConvertMetresToInches.srv 

In deze service beschrijving vind je een opdeling in twee delen gescheiden door “—”_:

  • 1e deel: Alle parameters waarmee je de service kunt aanvragen,request genoemd:

    • float64 distance_metres

  • 2e deel: Parameters die de service na behandeling terug geeft, response genoemd:

    • float64 distance_inches

    • bool success (deze wordt gebruikt om aan te geven dat er tijdens de service-afhandeling geen fouten zijn opgetreden; deze is optioneel)

Je kunt de service met een shell-commando testen, zie voorbeeld hieronder

ros2 service call /metres_to_inches range_sensors_interfaces/srv/ConvertMetresToInches "{distance_metres : 1.0}"

Opdracht

In deze opdracht ga je een service-aanvraag naar de ConvertMetresToInches-service programmeren.

Je gaat daartoe het Python programma assignment2.py bewerken op bepaalde aangeven plaatsen.

In dit programma gebeurt er het volgende:

  • Er wordt een subscriber aangemaakt op het topic /box_height_info

  • Als er een bericht op het topic wordt ontvangen dan wordt de self.box_height_callback geactiveerd

  • In de callback wordt een service-aanvraag gemaakt naar de ConvertMetresToInches-service door de send_request(self, metres) member-fuctie aan te roepen

  • In de response van de service-aanvraag is de hoogte in inches verwerkt. Deze wordt vervolgens afgedrukt in een terminal

Opdracht(Entry point toevoegen)

Om een python programma met het ros2 run commando te starten dient het python programma in ros2 geregistreerd te worden. Deze registratie wordt opgenomen in de setup.py van een ros package.

Open daartoe het setup.py bestand in de package vn de range_sensor

gedit ~/ros2_industrial_ws/src/ROS2_industrial/1_basics/range_sensor/setup.py 

Voeg het entry point van assignment2.py toe aan de entry_points–>console_scripts sectie. Tip: Gebruik als voorbeeld assignment1

Referentie:Python Packages

Nadat setup.py gewijzigd is moet je de package opnieuw bouwen met colcon build:

cd ~/ros2_industrial_ws/
colcon build --symlink-install
source install/setup.bash

*Let op: De laatste regel dien je daarna in ieder openstaand terminal uit te voeren.

Opdracht(programmeren)

In het bestand assignment2.py vind je op een aantal plaatsen een Todo x. Vul onder deze regels de code in die in de Todo beschreven is.

Opdracht(testen)

Om het programma te testen dien je achtereenvolgens de volgende node’s te starten

  • Uit opdracht over topics

    • Sensor info publisher

    • Box hoogte berekeningen (assignment1.py)

  • Deze opdracht (assignment2.py)