ROS2 Services
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.
Laat je inspireren door Writing a simple service and client Python
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)