Bird
Raised Fist0
ROSframework~3 mins

Why Preempting actions in ROS? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if your robot could instantly change plans without getting stuck or confused?

The Scenario

Imagine you have a robot performing a task, like moving to a location, but suddenly you need it to stop and do something else immediately.

Manually trying to interrupt or change the robot's current action can be confusing and risky.

The Problem

Manually stopping or changing robot actions can cause delays, unexpected behavior, or even crashes.

Without a clear way to preempt actions, the robot might finish old tasks before starting new ones, wasting time and resources.

The Solution

Preempting actions in ROS lets you cleanly interrupt ongoing tasks and start new ones right away.

This makes robot behavior more responsive and safer, handling changes smoothly.

Before vs After
✗ Before
send_goal(); // no way to stop or change easily
// robot keeps doing old task
✓ After
send_goal();
cancel_goal(); // cleanly stops current task
send_new_goal();
What It Enables

It enables robots to react quickly to new commands by safely stopping current actions and switching tasks instantly.

Real Life Example

A delivery robot is moving to drop a package but suddenly detects an obstacle; preempting lets it stop and reroute immediately without waiting.

Key Takeaways

Manual interruption of robot tasks is slow and unsafe.

Preempting actions allows clean, immediate task changes.

This improves robot responsiveness and safety.

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