An action server in ROS handles long-running tasks by receiving goals, processing them, and sending feedback and results back to the client.
Click to reveal answer
beginner
Which ROS package provides the tools to create an action server?
The actionlib package provides the tools and libraries to create and manage action servers and clients in ROS.
Click to reveal answer
intermediate
What are the three main callbacks you implement in a ROS action server?
You implement: 1. Goal callback - to accept or reject goals. 2. Preempt callback - to handle goal cancellation. 3. Execution callback - to perform the task and send feedback.
Click to reveal answer
beginner
How does the action server communicate progress to the client?
The action server sends feedback messages periodically to the client to report progress while the goal is being processed.
Click to reveal answer
beginner
What happens when an action server sets a goal as succeeded?
When the action server sets a goal as succeeded, it sends the final result to the client and marks the goal as completed successfully.
Click to reveal answer
Which ROS component handles long tasks and communicates with clients using goals and feedback?
AService server
BAction server
CPublisher
DSubscriber
✗ Incorrect
Action servers are designed for long-running tasks and communicate with clients using goals, feedback, and results.
Which package do you use to create an action server in ROS?
Aactionlib
Broscpp
Crosbag
Dtf
✗ Incorrect
The actionlib package provides the tools to create action servers and clients.
What callback is used to handle a client canceling a goal in an action server?
AGoal callback
BFeedback callback
CPreempt callback
DResult callback
✗ Incorrect
The preempt callback handles goal cancellation requests from clients.
How does an action server notify the client about task progress?
ABy sending feedback messages
BBy publishing on a topic
CBy calling a service
DBy logging info
✗ Incorrect
Action servers send feedback messages to clients to report progress.
What does the action server do when a goal is completed successfully?
ASends a failure message
BIgnores the goal
CCancels the goal
DSends the result and marks goal succeeded
✗ Incorrect
The server sends the final result and marks the goal as succeeded.
Explain the main steps to implement a ROS action server.
Think about how the server accepts goals, processes them, and communicates back.
You got /5 concepts.
Describe how feedback and results flow between an action server and its client.
Focus on the communication steps during task execution.
You got /4 concepts.
Practice
(1/5)
1. What is the main role of an action server in ROS?
easy
A. To handle long-running tasks and provide feedback during execution
B. To send simple messages without feedback
C. To only receive goals without processing them
D. To replace the ROS parameter server
Solution
Step 1: Understand the purpose of an action server
An action server is designed to manage tasks that take time and can provide updates while working.
Step 2: Compare options with the role
Only To handle long-running tasks and provide feedback during execution correctly describes handling long tasks and sending feedback, unlike others which describe unrelated roles.
Final Answer:
To handle long-running tasks and provide feedback during execution -> Option A
Quick Check:
Action server = long tasks + feedback [OK]
Hint: Remember: action servers manage long tasks with feedback [OK]
Common Mistakes:
Confusing action server with simple message publishers
Thinking action server only receives goals without processing
Mixing action server with parameter server functionality
2. Which of the following is the correct way to define the execute callback function in a ROS action server using Python?
easy
A. def execute(goal, self):
B. def executeCallback(goal):
C. def callback_execute(goal, self):
D. def execute_callback(self, goal):
Solution
Step 1: Recall the standard signature for execute callback
In ROS Python action servers, the execute callback is a method with 'self' and 'goal' parameters.
Step 2: Match options to this signature
Only def execute_callback(self, goal): correctly uses 'def execute_callback(self, goal):' matching the expected pattern.
Final Answer:
def execute_callback(self, goal): -> Option D
Quick Check:
Method signature = self first, then goal [OK]
Hint: Method callbacks in classes always have self first [OK]
Common Mistakes:
Omitting 'self' parameter in method definition
Swapping parameter order incorrectly
Using camelCase instead of snake_case for method name
3. Given this snippet inside an action server's execute callback:
for i in range(3):
feedback.percent_complete = (i + 1) * 33
self._action_server.publish_feedback(feedback)
rospy.sleep(1)
result.success = True
self._action_server.set_succeeded(result)
What will the client receive?
medium
A. No feedback updates, only success result
B. Three feedback updates at 33%, 66%, and 99%, then success result
C. Only one feedback update at 99%, then success result
D. Feedback updates but the result will be failure
Solution
Step 1: Analyze the loop sending feedback
The loop runs 3 times, each time publishing feedback with percent_complete increasing by 33.
Step 2: Check the result setting after loop
After feedback, the result.success is set to True and the goal is marked succeeded.
Final Answer:
Three feedback updates at 33%, 66%, and 99%, then success result -> Option B
Quick Check:
Loop feedback + success result = Three feedback updates at 33%, 66%, and 99%, then success result [OK]
Hint: Loop sends multiple feedbacks before final success [OK]
Common Mistakes:
Assuming feedback is sent only once after loop
Confusing success with failure result
Ignoring the sleep delay between feedbacks
4. Identify the error in this action server execute callback snippet:
def execute_callback(self, goal):
if goal.order < 0:
self._action_server.set_aborted()
result = Result()
result.output = goal.order * 2
self._action_server.set_succeeded(result)
medium
A. set_aborted() is called without a result argument
B. Result() is not imported or defined
C. The goal attribute 'order' does not exist
D. set_succeeded() should be called before set_aborted()
Solution
Step 1: Check set_aborted() usage
set_aborted() requires a result argument to inform the client about failure details.
Step 2: Verify other parts
Result() usage is typical; goal.order is assumed valid; set_succeeded() after set_aborted() is not called sequentially here.
Final Answer:
set_aborted() is called without a result argument -> Option A
Quick Check:
set_aborted needs result argument [OK]
Hint: Always pass a result when aborting goals [OK]
Common Mistakes:
Calling set_aborted() without result causes runtime error
Assuming set_aborted() can be called without parameters
Ignoring the need to inform client on abort
5. You want to implement an action server that cancels the goal if a certain condition is met during execution. Which approach correctly handles goal cancellation in the execute callback?
hard
A. Call set_aborted() immediately when the goal is received without checking cancellation
B. Ignore cancellation requests and always call set_succeeded() at the end
C. Check self._action_server.is_preempt_requested() inside the loop, then call self._action_server.set_preempted() and return
D. Use rospy.sleep() to delay cancellation handling until after completion
Solution
Step 1: Understand cancellation handling in action servers
Cancellation requests are detected by checking is_preempt_requested() during execution.
Step 2: Proper response to cancellation
When cancellation is requested, call set_preempted() to notify client and stop processing.
Final Answer:
Check self._action_server.is_preempt_requested() inside the loop, then call self._action_server.set_preempted() and return -> Option C
Quick Check:
Cancellation check + set_preempted = Check self._action_server.is_preempt_requested() inside the loop, then call self._action_server.set_preempted() and return [OK]
Hint: Use is_preempt_requested() to detect and handle cancellations [OK]
Common Mistakes:
Ignoring cancellation requests during execution
Calling set_aborted() instead of set_preempted() on cancel
Delaying cancellation handling until after task finishes
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.