Check if a goal has been preempted
checks whether the goal currently being executed by the action server,
status = isPreemptRequested(
server, has been preempted and returns the
status accordingly. The action client connected to
server initiates the goal preemption either by cancelling the current
goal or sending a new goal to execute.
Create a ROS Action Server and Execute a Goal
This example shows how to create a ROS action server, connect an action client to it, receive goal, and execute it.
Connect to a ROS network.
Launching ROS Core... Done in 0.35226 seconds. Initializing ROS master on http://172.29.209.26:52934. Initializing global node /matlab_global_node_89531 with NodeURI http://dcc245873glnxa64:35157/ and MasterURI http://localhost:52934.
Set up an action server for calculating Fibonacci sequence. Use structures for the ROS message data format. Use
fibbonacciExecution function as the callback.
cb = @fibonacciExecution; server = rosactionserver("/fibonacci","actionlib_tutorials/Fibonacci",ExecuteGoalFcn=cb,DataFormat="struct")
server = SimpleActionServer with properties: ActionName: '/fibonacci' ActionType: 'actionlib_tutorials/Fibonacci' ExecuteGoalFcn: @fibonacciExecution DataFormat: 'struct'
Create action client and send a goal to the server to calculate the Fibonacci sequence up to 10 terms past the first two terms,
1. Display the result sequence.
client = rosactionclient("/fibonacci","actionlib_tutorials/Fibonacci",DataFormat="struct"); goal = rosmessage(client); goal.Order = int32(10); result = sendGoalAndWait(client,goal); result.Sequence
ans = 12x1 int32 column vector 0 1 1 2 3 5 8 13 21 34 ⋮
Shut down ROS network.
Shutting down global node /matlab_global_node_89531 with NodeURI http://dcc245873glnxa64:35157/ and MasterURI http://localhost:52934. Shutting down ROS master on http://172.29.209.26:52934.
The callback function
fibbonacciExecution is executed every time the server receives a goal execution request from the client. This function checks if the goal has been preempted, executes the goal and sends feedback to the client during goal execution.
function [result,success] = fibonacciExecution(src,goal,defaultFeedback,defaultResult) % Initialize variables success = true; result = defaultResult; feedback = defaultFeedback; feedback.Sequence = int32([0 1]); for k = 1:goal.Order % Check that the client has not canceled or sent a new goal if isPreemptRequested(src) success = false; break end % Send feedback to the client periodically feedback.Sequence(end+1) = feedback.Sequence(end-1) + feedback.Sequence(end); sendFeedback(src,feedback) % Pause to allow time to complete other callbacks (like client feedback) pause(0.2) end if success result.Sequence = feedback.Sequence; end end
server — ROS action server
SimpleActionServer object handle
ROS action server, specified as a
status — Status of goal preemption
Status of goal preemption, retuned as a
logical scalar. If the
goal has been preempted, the function returns the status as
Introduced in R2022a