ROS toolbox stuck on service call

2 次查看(过去 30 天)
I'm trying to make a service call from MATLAB to a ros service. The node with the service works from other nodes and from the command line, but when I try to call it from MATLAB, I never get a response. The same happens to all services I have tried when calling them from MATLAB. I'm using ros2 with the following code:
classdef Test < handle
%TEST Summary of this class goes here
% Detailed explanation goes here
properties
node
client
end
methods
function obj = Test()
%TEST Construct an instance of this class
% Detailed explanation goes here
obj.node = ros2node("api2");
obj.client = ros2svcclient(obj.node, "/planner/clear_state", "mtms_interfaces/ClearState");
end
function out = call_service(obj)
msg = ros2message(obj.client);
disp(msg);
[response,status,statustext] = call(obj.client, msg);
disp(response);
disp(status);
disp(statustext);
out = res;
end
end
end
To call the service, I simply do
>> t = Test()
t =
Test with properties:
node: [1×1 ros2node]
client: [1×1 ros2svcclient]
>> t.call_service()
MessageType: 'mtms_interfaces/ClearStateRequest'
but as you can see, I get stuck on the service call. The service call never finishes. The ROS service receives the message and sends it back but MATLAB code's service call never finishes. The ClearState srv is simply as follows:
# ROS service for clearing state.
---
bool success
Is there something I'm doing wrong? I'm using Ubuntu 20.04.4.

采纳的回答

Josh Chen
Josh Chen 2022-8-10
Hi Kyösti,
The code looks correct for me except "res" should probably be "response". But I don't think that is the culprit.
I wonder if there is any network setup issue that's preventing this code from working properly. It is always recommanded to make sure the service server is visiableand available from client side before using the "call" method. Coud you run the following code on the same MATLAB session and see if the "connectionStatus" is true?
>> myNode = ros2node("api2");
>> myClient = ros2svcclient(myNode,'/test','test_msgs/BasicTypes');
>> [connectionStatus,connectionStatustext] = waitForServer(myClient)
As an alternative, you may also try:
>> isServerAvailable(myClient)
If everyting above is working fine, I am suspecting this is an issue caused by ROS version difference or DomainID difference. Which distribution of MATLAB and ROS are you using in your environment? This page listed out supported ROS distributions for different MATLAB releases.
Hope this helps,
Josh
  3 个评论
Josh Chen
Josh Chen 2022-8-10
编辑:Josh Chen 2022-8-10
Hi,
Thanks for providing this additional information.
As for now, ROS Toolbox does not support communication with ROS2 Galactic. Different DDS implementation (MATLAB R2022a uses fastrtps, while ROS Galactic uses cyclonedds) underneath cause this invisible issue.
As a workaround, please consider one of the following two solutions:
  1. Follow the steps listed here to use Foxy in MATLAB with Cyclone DDS, and keep using Cyclone DDS with Galactic
  2. Run the following command before launching the server to use fastrtps on ROS 2 Galactic to make it discoverable by MATLAB ROS Toolbox
$ export RMW_IMPLEMENTATION="rmw_fastrtps_cpp"
-Josh
Kyösti Alkio
Kyösti Alkio 2022-8-11
Thank you, this solved the problem! I used option 1:
setenv("RMW_IMPLEMENTATION","rmw_cyclonedds_cpp")

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Network Connection and Exploration 的更多信息

产品


版本

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by