Bird
Raised Fist0
ROSframework~30 mins

Preempting actions in ROS - Mini Project: Build & Apply

Choose your learning style10 modes available
Preempting Actions in ROS
📖 Scenario: You are building a robot control system using ROS (Robot Operating System). Sometimes the robot needs to stop its current task and start a new one immediately. This is called preempting an action.We will create a simple ROS action client that sends a goal, then preempts it by sending a cancel request.
🎯 Goal: Build a ROS action client node that sends a goal to an action server, then preempts (cancels) the goal after a short delay.
📋 What You'll Learn
Create a ROS action client node in Python
Send a goal to the action server named /example_action
Preempt the goal by sending a cancel request
Use the SimpleActionClient from actionlib
Use the ExampleAction action definition
💡 Why This Matters
🌍 Real World
Robots often need to stop their current task immediately when new commands arrive. Preempting actions allows smooth task switching.
💼 Career
Understanding ROS action clients and preemption is essential for robotics software engineers working on autonomous systems.
Progress0 / 4 steps
1
Create the ROS action client node and import necessary modules
Write the first 5 lines of a Python ROS node script that imports rospy, actionlib, and the ExampleAction and ExampleGoal messages from the example_action_msgs.msg package. Also initialize the ROS node with the name example_action_client.
ROS
Hint

Use import statements for modules and rospy.init_node() to start the node.

2
Create the SimpleActionClient and wait for the server
Create a variable called client that is a SimpleActionClient for the /example_action server using ExampleAction. Then call client.wait_for_server() to wait until the server is ready.
ROS
Hint

Use actionlib.SimpleActionClient with the server name and action type, then call wait_for_server().

3
Send a goal to the action server
Create a variable called goal as an instance of ExampleGoal. Then send this goal to the server using client.send_goal(goal).
ROS
Hint

Create the goal object and use send_goal() to send it.

4
Preempt the goal by canceling it
After sending the goal, call client.cancel_goal() to preempt (cancel) the current goal.
ROS
Hint

Use cancel_goal() on the client to stop the current goal.

Practice

(1/5)
1.

What does cancel_goal() do in ROS action clients?

easy
A. It requests to stop the currently running action goal.
B. It starts a new action goal immediately.
C. It pauses the action without stopping it.
D. It resets the action server to its initial state.

Solution

  1. Step 1: Understand the purpose of cancel_goal()

    This function is used to request the cancellation of the current goal being processed by the action server.
  2. Step 2: Differentiate from other actions

    Starting a new goal or pausing are different operations; cancel_goal() specifically requests stopping the current goal.
  3. Final Answer:

    It requests to stop the currently running action goal. -> Option A
  4. Quick Check:

    cancel_goal() stops current goal [OK]
Hint: Remember: cancel_goal() means stop current action [OK]
Common Mistakes:
  • Confusing cancel_goal() with starting a new goal
  • Thinking cancel_goal() pauses instead of cancels
  • Assuming cancel_goal() resets the server
2.

Which of the following is the correct sequence to preempt an action in ROS?

1. cancel_goal()
2. send_goal(new_goal)
easy
A. Call cancel_goal() first, then send_goal(new_goal).
B. Call send_goal(new_goal) first, then cancel_goal().
C. Call cancel_goal() twice, then send_goal(new_goal).
D. Only call send_goal(new_goal) without canceling.

Solution

  1. Step 1: Understand preempting order

    You must first cancel the current goal to stop it before sending a new goal to replace it.
  2. Step 2: Confirm correct method calls

    Calling cancel_goal() first ensures the old task stops, then send_goal(new_goal) starts the new task.
  3. Final Answer:

    Call cancel_goal() first, then send_goal(new_goal). -> Option A
  4. Quick Check:

    Cancel before sending new goal [OK]
Hint: Cancel first, then send new goal to preempt [OK]
Common Mistakes:
  • Sending new goal before canceling old one
  • Calling cancel_goal() multiple times unnecessarily
  • Skipping cancel_goal() and sending new goal directly
3.

Given this ROS action client code snippet, what will be the output behavior?

client.send_goal(goal1)
client.cancel_goal()
client.send_goal(goal2)

What happens to goal1 and goal2?

medium
A. Neither goal runs because cancel_goal() stops all actions.
B. goal1 runs fully; goal2 is ignored.
C. Both goal1 and goal2 run simultaneously.
D. goal1 is canceled; goal2 starts running.

Solution

  1. Step 1: Analyze the cancel_goal() effect

    After sending goal1, cancel_goal() requests to stop it immediately.
  2. Step 2: Understand sending goal2

    Sending goal2 after canceling goal1 starts the new action goal.
  3. Final Answer:

    goal1 is canceled; goal2 starts running. -> Option D
  4. Quick Check:

    Cancel old goal, start new goal [OK]
Hint: Cancel stops old goal; new send_goal starts new task [OK]
Common Mistakes:
  • Assuming goal1 runs fully despite cancel
  • Thinking both goals run at once
  • Believing cancel_goal() stops all future goals
4.

Identify the error in this ROS action client code snippet:

client.send_goal(goal1)
client.send_goal(goal2)
client.cancel_goal()

What is wrong with this sequence?

medium
A. The code should call cancel_goal() twice to cancel both goals.
B. You cannot send two goals without canceling the first one first.
C. Calling cancel_goal() after sending two goals does not preempt correctly.
D. There is no error; this sequence is correct.

Solution

  1. Step 1: Understand goal handling

    Sending two goals in a row without canceling means the second goal overrides the first immediately.
  2. Step 2: Analyze cancel_goal() timing

    Calling cancel_goal() after both sends only cancels the currently active goal, not preempting properly between goals.
  3. Final Answer:

    Calling cancel_goal() after sending two goals does not preempt correctly. -> Option C
  4. Quick Check:

    Cancel before sending new goal to preempt [OK]
Hint: Cancel before sending next goal, not after [OK]
Common Mistakes:
  • Sending multiple goals without canceling first
  • Assuming cancel_goal() cancels all previous goals
  • Calling cancel_goal() too late to preempt
5.

You want to preempt a running action only if it has been active for more than 5 seconds. Which approach correctly implements this logic?

if client.get_state() == ACTIVE and client.get_time_active() > 5:
    client.cancel_goal()
    client.send_goal(new_goal)
hard
A. You must call cancel_goal() before checking the state.
B. This approach correctly preempts only after 5 seconds of activity.
C. You should send the new goal first, then cancel the old one.
D. ROS actions do not support checking active time for preemption.

Solution

  1. Step 1: Check action state and duration

    The code checks if the action is active and has been running longer than 5 seconds.
  2. Step 2: Cancel and send new goal conditionally

    Only if both conditions are true, it cancels the current goal and sends a new one, correctly preempting.
  3. Final Answer:

    This approach correctly preempts only after 5 seconds of activity. -> Option B
  4. Quick Check:

    Check state and time before canceling [OK]
Hint: Check active state and time before canceling [OK]
Common Mistakes:
  • Canceling without checking active time
  • Sending new goal before canceling old one
  • Assuming ROS lacks timing info for actions
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard