Bird
Raised Fist0
ROSframework~30 mins

Robot frame conventions (base_link, odom, map) in ROS - Mini Project: Build & Apply

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Robot Frame Conventions: base_link, odom, map
📖 Scenario: You are working on a robot navigation system. The robot uses three main coordinate frames: base_link (the robot's body), odom (the robot's local odometry), and map (the global map frame). Understanding how these frames relate helps the robot know where it is and where to go.
🎯 Goal: Build a simple ROS node that sets up the transforms between base_link, odom, and map frames using tf2_ros. You will create the data structure for transforms, configure a fixed offset, publish the transforms, and complete the node so the robot can understand its position in all frames.
📋 What You'll Learn
Create a dictionary with transform data for base_link relative to odom
Add a configuration variable for the fixed offset between map and odom
Use a ROS timer callback to publish the transforms regularly
Complete the ROS node with proper initialization and spinning
💡 Why This Matters
🌍 Real World
Robots use coordinate frames to understand their position and orientation in the world. This project helps set up the basic frame relationships needed for navigation and mapping.
💼 Career
Understanding and publishing transforms between frames is essential for robotics engineers working on localization, mapping, and navigation systems.
Progress0 / 4 steps
1
Create the transform data dictionary for base_link relative to odom
Create a dictionary called base_link_to_odom with keys 'translation' and 'rotation'. Set 'translation' to {'x': 0.0, 'y': 0.0, 'z': 0.0} and 'rotation' to {'x': 0.0, 'y': 0.0, 'z': 0.0, 'w': 1.0}.
ROS
Hint

Think of base_link_to_odom as a dictionary holding position and orientation of the robot relative to odometry frame.

2
Add a fixed offset configuration between map and odom frames
Create a dictionary called map_to_odom_offset with keys 'translation' and 'rotation'. Set 'translation' to {'x': 1.0, 'y': 2.0, 'z': 0.0} and 'rotation' to {'x': 0.0, 'y': 0.0, 'z': 0.707, 'w': 0.707}.
ROS
Hint

This offset represents the fixed difference between the map frame and odometry frame.

3
Publish transforms regularly using a ROS timer callback
Write a function called publish_transforms that takes event as a parameter. Inside, use tf_broadcaster.sendTransform twice: first to send base_link_to_odom transform from odom to base_link, then to send map_to_odom_offset transform from map to odom. Use rospy.Time.now() for the timestamp.
ROS
Hint

Use TransformStamped messages and fill in translation and rotation from your dictionaries. Use rospy.Time.now() for timestamps.

4
Complete the ROS node with timer and spin
Add a ROS timer that calls publish_transforms every 0.1 seconds. Then call rospy.spin() to keep the node running.
ROS
Hint

Use rospy.Timer to call your function every 0.1 seconds and rospy.spin() to keep the node alive.

Practice

(1/5)
1. Which ROS frame represents the robot's own center point and moves with it?
easy
A. map
B. base_link
C. odom
D. world

Solution

  1. Step 1: Understand the role of base_link

    base_link is the frame fixed to the robot itself, representing its center.
  2. Step 2: Compare with other frames

    odom tracks movement but can drift, map is a fixed global frame, and world is not a standard ROS frame here.
  3. Final Answer:

    base_link -> Option B
  4. Quick Check:

    Robot center frame = base_link [OK]
Hint: Remember: base_link moves with the robot itself [OK]
Common Mistakes:
  • Confusing odom as robot center
  • Thinking map moves with robot
  • Assuming world is standard ROS frame
2. Which of the following is the correct way to refer to the odometry frame in ROS?
easy
A. odom
B. odom_frame
C. map
D. base_link

Solution

  1. Step 1: Identify the standard odometry frame name

    The standard ROS frame for odometry is odom.
  2. Step 2: Check other options

    base_link is robot center, map is global frame, and odom_frame is not a standard name.
  3. Final Answer:

    odom -> Option A
  4. Quick Check:

    Odometry frame = odom [OK]
Hint: Odom frame is just 'odom', no extra suffix [OK]
Common Mistakes:
  • Adding '_frame' suffix incorrectly
  • Mixing base_link with odom
  • Using map instead of odom
3. Given a robot moving in a room, which frame will show drift over time due to sensor noise?
medium
A. world
B. map
C. base_link
D. odom

Solution

  1. Step 1: Understand frame drift

    The odom frame tracks movement from start but can accumulate errors causing drift.
  2. Step 2: Compare with other frames

    map is fixed and does not drift, base_link moves with robot, world is not standard here.
  3. Final Answer:

    odom -> Option D
  4. Quick Check:

    Drifting frame = odom [OK]
Hint: Odom drifts; map stays fixed [OK]
Common Mistakes:
  • Thinking map drifts
  • Confusing base_link with odom
  • Assuming world is used here
4. You notice your robot's position drifts over time when using the odom frame. What is the best way to fix this issue?
medium
A. Use the map frame for global localization
B. Switch to using the base_link frame for navigation
C. Reset the odom frame periodically
D. Ignore the drift as it is normal

Solution

  1. Step 1: Understand the cause of drift

    The odom frame drifts due to sensor noise and integration errors over time.
  2. Step 2: Choose a frame that corrects drift

    The map frame is fixed globally and used for localization to correct odom drift.
  3. Final Answer:

    Use the map frame for global localization -> Option A
  4. Quick Check:

    Fix drift with map frame [OK]
Hint: Use map frame to correct odom drift [OK]
Common Mistakes:
  • Using base_link which moves with robot
  • Resetting odom often is impractical
  • Ignoring drift causes navigation errors
5. You want to build a navigation system that uses sensor data to update the robot's position on a fixed map. Which sequence of frames should you use to correctly represent the robot's position relative to the world?
hard
A. odom -> base_link -> map
B. base_link -> odom -> map
C. map -> odom -> base_link
D. base_link -> map -> odom

Solution

  1. Step 1: Understand frame hierarchy

    The robot's position is relative to base_link, which is relative to odom, and odom is relative to map.
  2. Step 2: Determine correct parent-child order

    The correct chain is map (global fixed frame) -> odom (local odometry) -> base_link (robot center).
  3. Final Answer:

    map -> odom -> base_link -> Option C
  4. Quick Check:

    Global to robot: map -> odom -> base_link [OK]
Hint: Frame chain goes from map down to base_link [OK]
Common Mistakes:
  • Reversing frame order
  • Putting base_link as parent of odom
  • Ignoring map as global frame