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.txt
andpackage.xml
need 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|T
billentyűk lenyomásának hatását.ros2 run turtlesim turtlesim_node
ros2 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.rviz
URDF-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 echo
ros2 run rqt_gui rqt_gui
, stb.) használatával.
2.2: Grasp action létrehozása
-
Hozzunk létre új csomagot
ros2_course_msgs
né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.action
fá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
Grasp
action:source ~/ros2_ws/install/setup.bash ros2 interface show ros2_course_msgs/action/Grasp
-
A
ros2_course
csomagpackage.xml
-jéhez adjuk hozzá a következő sort aros2_course_msgs
dependency 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.py
névvel a~/ros2_ws/src/ros2_course/ros2_course
mappá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 egyGrasp
action-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-packages
elérési utat.
-
Futtassuk az action server-t és teszteljük a működését parancssorból:
ros2 run ros2_course grasp_server
ros2 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.py
névvel a~/ros2_ws/src/ros2_course/ros2_course
mappá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_marker
topic-ra, és egyGrasp
action 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_marker
ros2 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.