08. ROS service, ROS action fogalma, felhasználása
Elmélet
Warning
ZH2 május 26. 10:45 F.05 terem
ROS Service
- Request/reply communication
- Use a client-server model
- Similar to Remote Procedure Calls (RPC)
- Blocking behavior by default (can be async)
ROS .srv files
int a
int b
---
int sum
#request constants
int8 FOO=1
int8 BAR=2
#request fields
int8 foobar
another_pkg/AnotherMessage msg
---
#response constants
uint32 SECRET=123456
#response fields
another_pkg/YetAnotherMessage val
CustomMessageDefinedInThisPackage value
uint32 an_integer
ROS Action

Image source: https://docs.ros.org/
- Ideal for communication with slower processes, e.g. environmental inetarcion
- Asynchronous communication (non-blocking)
- Actions consist of a goal, feedback, and a result
- Built on topics and services and function similarly to services
- Actions are preemptable, (can be canceled while executing)
- Provide steady feedback, unlike services which return a single response
- Actions use a client-server model, similar to the publisher-subscriber model
- An action client node sends a goal to an action server node that acknowledges the goal and returns a stream of feedback and a result.
ROS .action files
# Define the goal
uint32 dishwasher_id # Specify which dishwasher we want to use
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete
Building custom interfaces (.msg , .srv and .action files)
CMakeList.txtandpackage.xmlneed to be modified- For messages and services, see https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Custom-ROS2-Interfaces.html
- For actions, see https://docs.ros.org/en/foxy/Tutorials/Intermediate/Creating-an-Action.html
Gyakorlat
1: Actions with Turtlesim
-
Indítsunk el egy
turtlesim node-ot és egyturtle_teleop_key-t. Figyeljük megy aG|B|V|C|D|E|R|Tbillentyűk lenyomásának hatását.ros2 run turtlesim turtlesim_noderos2 run turtlesim turtle_teleop_key
-
Tanulmányozzuk a rendszer működését az alábbi parancsok segítségével:
ros2 node info /turtlesim ros2 node info /teleop_turtle ros2 action list -t ros2 action info /turtle1/rotate_absolute ros2 interface show turtlesim/action/RotateAbsolute
-
Küldjünk action goal-t a parancssorból:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
2: PSM grasp action
A következőkben ROS action server--client architektúrát fogunk implementálni.
A korábban implementált psm_grasp.py funkcionalitását fogjuk két külön node-ra
bontani az alább ábra szerint.
2.1: dVRK ROS2

-
Indítsuk el a PSM1 RViz szimulációját. A dVRK konzolon ne felejtsünk el HOME-olni.
# dVRK main console ros2 run dvrk_robot dvrk_console_json -j ~/ros2_ws/install/sawIntuitiveResearchKitAll/share/sawIntuitiveResearchKit/share/console/console-PSM1_KIN_SIMULATED.json# ROS 2 joint and robot state publishers ros2 launch dvrk_model dvrk_state_publisher.launch.py arm:=PSM1# RViz ros2 run rviz2 rviz2 -d ~/ros2_ws/install/dvrk_model/share/dvrk_model/rviz/PSM1.rvizURDF-fel kapcsolatos hibák esetén
locale # check for UTF-8 sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 locale # verify settings
-
Tanulmányozzuk a szimulátor működését ROS a tanult prancsok (
ros2 topic list,ros2 topic echoros2 run rqt_gui rqt_gui, stb.) használatával.
2.2: Grasp action létrehozása
-
Hozzunk létre új csomagot
ros2_course_msgsnévvel:cd ros2_ws/src ros2 pkg create --build-type ament_cmake ros2_course_msgs --dependencies action_msgs std_msgs geometry_msgs rosidl_default_generators
-
Hozzuk létre a
ros2_course_msgs/action/Grasp.actionfájlt az alábbi tartalommal:# Goal geometry_msgs/Point grasp_pos --- # Result bool success --- # Feedback string status
-
Adjuk hozzá a következőt a
CMakeLists.txt-hez azament_package()sor elé:rosidl_generate_interfaces(${PROJECT_NAME} "action/Grasp.action" DEPENDENCIES geometry_msgs )
-
Adjuk hozzá a dependency-ket a
package.xml-hez:<buildtool_depend>rosidl_default_generators</buildtool_depend> <member_of_group>rosidl_interface_packages</member_of_group>
-
Build-eljük a workspace-t:
cd ~/ros2_ws colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
-
Ellenőrizzük, hogy létrejött-e a
Graspaction:source ~/ros2_ws/install/setup.bash ros2 interface show ros2_course_msgs/action/Grasp
-
A
ros2_coursecsomagpackage.xml-jéhez adjuk hozzá a következő sort aros2_course_msgsdependency beállításához:<exec_depend>ros2_course_msgs</exec_depend>
2.2: Grasp server implementálása
-
Hozzunk létre új python forrásfájlt
grasp_server.pynévvel a~/ros2_ws/src/ros2_course/ros2_coursemappában. Adjuk meg az új entry point-ot asetup.py-ban a megszokott módon.
-
Implementáljuk az action server-t. Induljunk ki a példából: https://docs.ros.org/en/foxy/Tutorials/Intermediate/Writing-an-Action-Server-Client/Py.html. A node funkcionalitása átemelhető a
psm_grasp.py-ból. A node egyGraspaction-t vár, melynek hatására megragadja a goal-ban szerepló koordinátákon található tárgyat (a dummy markert).CLion interpreter
CLion-ban az interpreterhez adjuk hozzá a
/home/tamas/ros2_ws/install/ros2_course_msgs/lib/python3.8/site-packageselérési utat.
-
Futtassuk az action server-t és teszteljük a működését parancssorból:
ros2 run ros2_course grasp_serverros2 node info grasp_server ros2 action list -t ros2 action info /grasp ros2 interface show ros2_course_msgs/action/Grasp ros2 action send_goal --feedback /grasp ros2_course_msgs/action/Grasp "{grasp_pos: {x: 0.0, y: 0.0, z: -0.18}}"
2.3: Grasp client implementálása
-
Hozzunk létre új python forrásfájlt
grasp_client.pynévvel a~/ros2_ws/src/ros2_course/ros2_coursemappában. Adjuk meg az új entry point-ot asetup.py-ban a megszokott módon.
-
Implementáljuk az action client-et. Induljunk ki a példából: https://docs.ros.org/en/foxy/Tutorials/Intermediate/Writing-an-Action-Server-Client/Py.html. A node funkcionalitása átemelhető a
psm_grasp.py-ból. A node feliratkozik a/dummy_target_markertopic-ra, és egyGraspaction request-et küld az action server-nek (`grasp_server') a marker megragadására.
-
Futtassuk az action client-et (
grasp_client) és adummy_marker-t:ros2 run ros2_course dummy_markerros2 run ros2_course grasp_client
3. IsPrime service
- Implementáljunk ROS Service-t, amely egy kapott természetes számról megállapítja, prím-e. Használjuk az implementált service-t. Kiindulhatunk ebből a példából: https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Service-And-Client.html.