Bird
Raised Fist0
ROSframework~20 mins

Occupancy grid map concept in ROS - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Occupancy Grid Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
What does an occupancy grid map represent in ROS?
In ROS, an occupancy grid map is used to represent the environment for robot navigation. What does each cell in this grid typically indicate?
AThe robot's battery level when it passed over the cell
BThe exact distance to the nearest obstacle from the cell center
CThe temperature of the environment at that cell
DThe probability that the cell is occupied by an obstacle
Attempts:
2 left
💡 Hint
Think about how a robot knows where obstacles are in its surroundings.
❓ component_behavior
intermediate
2:00remaining
How does the ROS OccupancyGrid message represent unknown areas?
The OccupancyGrid message uses integer values for each cell. What value does it use to represent unknown or unexplored areas?
A100
B0
C-1
D255
Attempts:
2 left
💡 Hint
Known free space is 0, occupied is 100, what about unknown?
❓ state_output
advanced
2:00remaining
What is the output of this ROS occupancy grid update code snippet?
Given the following snippet that updates a cell in an OccupancyGrid data array, what will be the value of data[10] after execution? ```python map_data = [-1]*20 index = 10 map_data[index] = 0 ```
ROS
map_data = [-1]*20
index = 10
map_data[index] = 0
A10
B0
C-1
D100
Attempts:
2 left
💡 Hint
Look at which index is updated and what value it is set to.
📝 Syntax
advanced
2:00remaining
Identify the syntax error in this ROS occupancy grid initialization code
Which option contains a syntax error when initializing an OccupancyGrid message in Python ROS?
ROS
from nav_msgs.msg import OccupancyGrid
map_msg = OccupancyGrid()
map_msg.data = [0]*100
map_msg.info.width = 10
map_msg.info.height = 10
Amap_msg.info = MapMetaData(width=10, height=10)
Bmap_msg.info.width = 10
Cmap_msg.info.height = 10
Dmap_msg.data = [0]*100
Attempts:
2 left
💡 Hint
Check if MapMetaData is imported or used correctly.
🔧 Debug
expert
3:00remaining
Why does this ROS node fail to update the occupancy grid map correctly?
Consider this ROS Python node snippet: ```python import rospy from nav_msgs.msg import OccupancyGrid def callback(data): data.data[0] = 100 pub.publish(data) rospy.init_node('map_updater') pub = rospy.Publisher('map', OccupancyGrid, queue_size=10) sub = rospy.Subscriber('map', OccupancyGrid, callback) rospy.spin() ``` Why does the occupancy grid map not update as expected?
AModifying the incoming message data directly is unsafe and may cause unexpected behavior
BThe publisher is not initialized before the subscriber
CThe callback function does not return the modified data
DThe queue_size is too small to handle messages
Attempts:
2 left
💡 Hint
Think about message immutability and ROS best practices.

Practice

(1/5)
1.

What does an occupancy grid map represent in ROS?

easy
A. A grid showing which areas are free, occupied, or unknown
B. A list of robot commands to move in space
C. A 3D model of the robot's shape
D. A sensor data stream from the robot's camera

Solution

  1. Step 1: Understand the purpose of occupancy grid maps

    Occupancy grid maps divide space into small cells to mark if they are free, occupied, or unknown.
  2. Step 2: Match the description to the options

    A grid showing which areas are free, occupied, or unknown correctly describes this as a grid showing cell states. Other options describe unrelated concepts.
  3. Final Answer:

    A grid showing which areas are free, occupied, or unknown -> Option A
  4. Quick Check:

    Occupancy grid = space divided into free/occupied/unknown cells [OK]
Hint: Occupancy grid = map of free or blocked spaces [OK]
Common Mistakes:
  • Confusing occupancy grid with robot commands
  • Thinking it is a 3D robot model
  • Mixing it up with raw sensor data
2.

Which data type correctly represents the occupancy grid map data in ROS?

nav_msgs::OccupancyGrid map;
// What type is map.data?
easy
A. bool[][]
B. std::string
C. std::vector<int8_t>
D. float[]

Solution

  1. Step 1: Recall the ROS message type for occupancy grid data

    The map.data field is a list of signed 8-bit integers representing cell states.
  2. Step 2: Match the data type to the options

    std::vector<int8_t> matches the expected type. Other options do not fit the ROS message definition.
  3. Final Answer:

    std::vector<int8_t> -> Option C
  4. Quick Check:

    map.data type = std::vector<int8_t> [OK]
Hint: Occupancy data uses vector of int8_t in ROS [OK]
Common Mistakes:
  • Assuming map.data is a string or float array
  • Thinking it is a 2D bool array
  • Confusing with sensor_msgs data types
3.

Given this snippet in ROS Python:

grid = [0, 100, -1, 0]
free_cells = sum(1 for cell in grid if cell == 0)
occupied_cells = sum(1 for cell in grid if cell == 100)
unknown_cells = sum(1 for cell in grid if cell == -1)
print(f"Free: {free_cells}, Occupied: {occupied_cells}, Unknown: {unknown_cells}")

What will be printed?

medium
A. Free: 1, Occupied: 1, Unknown: 2
B. Free: 1, Occupied: 2, Unknown: 1
C. Free: 2, Occupied: 0, Unknown: 2
D. Free: 2, Occupied: 1, Unknown: 1

Solution

  1. Step 1: Count free cells (value 0) in the list

    grid has two zeros at positions 0 and 3, so free_cells = 2.
  2. Step 2: Count occupied cells (value 100) and unknown cells (value -1)

    One 100 at position 1 (occupied_cells = 1), one -1 at position 2 (unknown_cells = 1).
  3. Final Answer:

    Free: 2, Occupied: 1, Unknown: 1 -> Option D
  4. Quick Check:

    Count values 0, 100, -1 correctly [OK]
Hint: Count each cell value carefully to avoid off-by-one errors [OK]
Common Mistakes:
  • Miscounting zeros or other values
  • Confusing unknown (-1) with free (0)
  • Mixing occupied (100) with unknown (-1)
4.

Identify the error in this ROS Python code snippet that tries to update an occupancy grid cell:

map_data = [0, 0, 0, 0]
index = 2
map_data[index] = 100
print(map_data)

Why might this code fail in a real ROS occupancy grid update?

medium
A. map_data should be updated via the OccupancyGrid message, not a plain list
B. map_data is a tuple and cannot be changed
C. Index 2 is out of range for map_data
D. 100 is not a valid occupancy value

Solution

  1. Step 1: Check data type and mutability

    map_data is a list here, so assignment works in Python, no error from mutability.
  2. Step 2: Understand ROS occupancy grid update rules

    In ROS, occupancy grid data must be updated through the OccupancyGrid message interface, not by directly modifying a local list copy.
  3. Final Answer:

    map_data should be updated via the OccupancyGrid message, not a plain list -> Option A
  4. Quick Check:

    Update occupancy grid via ROS message, not local list [OK]
Hint: Update occupancy grid through ROS message, not local list [OK]
Common Mistakes:
  • Assuming direct list change updates ROS map
  • Thinking index 2 is invalid
  • Believing 100 is invalid occupancy value
5.

You want to create a 5x5 occupancy grid map in ROS where the center cell is occupied (value 100), edges are unknown (-1), and others are free (0). Which Python code correctly creates the data list for this map?

# Options:
# A
# data = [100 if i == 12 else -1 if i % 5 == 0 or i % 5 == 4 else 0 for i in range(25)]

# B
# data = [0]*25
# data[12] = 100
# for i in range(25):
#     if i % 5 == 0 or i % 5 == 4 or i < 5 or i > 19:
#         data[i] = -1

# C
# data = [-1]*25
# data[12] = 100
# for i in range(25):
#     if i % 5 != 0 and i % 5 != 4 and 5 <= i <= 19:
#         data[i] = 0

# D
# data = [0 if i != 7 else 100 for i in range(25)]
# for i in range(25):
#     if i % 5 == 0 or i % 5 == 4 or i < 5 or i > 19:
#         data[i] = -1
hard
A. Creates data with center 100, edges -1, others 0 in one list comprehension
B. Starts with all 0s, sets center 100, then sets edges to -1 in a loop
C. Starts with all -1s, sets center 100, then sets inner cells to 0 in a loop
D. Starts with zeros except center 100, then sets edges -1 in a loop

Solution

  1. Step 1: Understand the map layout requirements

    Center cell (index 12) = 100, edges = -1, others = 0 in a 5x5 grid (indexes 0-24).
  2. Step 2: Analyze each option's logic

    Starts with all 0s, sets center to 100, then sets edges to -1 in a loop, matching requirements exactly.
  3. Final Answer:

    Starts with all 0s, sets center 100, then sets edges to -1 in a loop -> Option B
  4. Quick Check:

    Initialize edges as -1, center 100, inner cells 0 [OK]
Hint: Initialize edges first, then set center and free cells [OK]
Common Mistakes:
  • Confusing edge indexes with inner cells
  • Overwriting center cell after setting edges
  • Using incorrect conditions for edges
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