Bird
Raised Fist0
ROSframework~10 mins

Request-response communication model in ROS - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a ROS service client.

ROS
client = rospy.ServiceProxy('[1]', AddTwoInts)
Drag options to blanks, or click blank then click option'
A/add_two_ints
B/talker
C/move_base
D/listener
Attempts:
3 left
💡 Hint
Common Mistakes
Using a topic name instead of a service name.
Missing the leading slash in the service name.
2fill in blank
medium

Complete the code to call the service with two integers.

ROS
response = client([1], 5)
Drag options to blanks, or click blank then click option'
A3
B'3'
Cx
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Passing string instead of integer.
Using undefined variables.
3fill in blank
hard

Fix the error in the service server callback definition.

ROS
def handle_add_two_ints(req):
    return AddTwoIntsResponse(req.a [1] req.b)
Drag options to blanks, or click blank then click option'
A-
B*
C+
D/
Attempts:
3 left
💡 Hint
Common Mistakes
Using subtraction or multiplication instead of addition.
Using division which causes float result.
4fill in blank
hard

Fill both blanks to complete the service server setup.

ROS
service = rospy.Service('[1]', AddTwoInts, [2])
Drag options to blanks, or click blank then click option'
A/add_two_ints
Bhandle_add_two_ints
Cadd_two_ints
Dcallback
Attempts:
3 left
💡 Hint
Common Mistakes
Using wrong service name.
Using incorrect callback function name.
5fill in blank
hard

Fill all three blanks to complete the service server main loop.

ROS
rospy.init_node('[1]')
service = rospy.Service('[2]', AddTwoInts, handle_add_two_ints)
rospy.[3]()
Drag options to blanks, or click blank then click option'
Aadd_two_ints_server
B/add_two_ints
Cspin
Dsleep
Attempts:
3 left
💡 Hint
Common Mistakes
Using wrong node or service names.
Using rospy.sleep() instead of rospy.spin().

Practice

(1/5)
1. In ROS, what does the request-response communication model primarily allow?
easy
A. One node sends a request and waits for a reply from another node
B. Nodes continuously publish data without expecting a reply
C. Nodes broadcast messages to all other nodes simultaneously
D. Nodes store data locally without communication

Solution

  1. Step 1: Understand the request-response model in ROS

    This model involves one node sending a request message and waiting for a response from another node.
  2. Step 2: Compare options with this model

    Only One node sends a request and waits for a reply from another node describes this direct ask-and-reply behavior, while others describe different communication types.
  3. Final Answer:

    One node sends a request and waits for a reply from another node -> Option A
  4. Quick Check:

    Request-response = direct ask and reply [OK]
Hint: Request-response means ask first, then wait for answer [OK]
Common Mistakes:
  • Confusing request-response with continuous publishing
  • Thinking request-response is broadcasting
  • Assuming no reply is needed
2. Which of the following is the correct way to define a ROS service server in Python using the request-response model?
easy
A. service = rospy.Service('service_name', ServiceType, handler_function)
B. service = rospy.Publisher('service_name', ServiceType, handler_function)
C. service = rospy.Subscriber('service_name', ServiceType, handler_function)
D. service = rospy.Client('service_name', ServiceType, handler_function)

Solution

  1. Step 1: Recall ROS Python service server syntax

    In ROS, a service server is created using rospy.Service with the service name, type, and handler function.
  2. Step 2: Identify correct function

    Only rospy.Service matches this pattern; Publisher and Subscriber are for topics, Client is not a rospy function.
  3. Final Answer:

    service = rospy.Service('service_name', ServiceType, handler_function) -> Option A
  4. Quick Check:

    Service server uses rospy.Service [OK]
Hint: Service server uses rospy.Service, not Publisher or Subscriber [OK]
Common Mistakes:
  • Using Publisher or Subscriber instead of Service
  • Confusing client and server creation
  • Wrong function names like rospy.Client
3. Given this ROS Python service client code snippet, what will be printed if the service responds with response.result = 42?
import rospy
from example.srv import AddTwoInts

def call_service():
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        response = add_two_ints(20, 22)
        print(response.result)
    except rospy.ServiceException as e:
        print("Service call failed", e)

call_service()
medium
A. Service call failed
B. 42
C. 20
D. None

Solution

  1. Step 1: Understand the service client call

    The client waits for the service, calls it with 20 and 22, and expects a response with a 'result' attribute.
  2. Step 2: Analyze the response printing

    The code prints response.result, which is given as 42 in the question.
  3. Final Answer:

    42 -> Option B
  4. Quick Check:

    Print response.result = 42 [OK]
Hint: Prints the response.result value returned by the service [OK]
Common Mistakes:
  • Confusing request parameters with response
  • Expecting print of input values instead of response
  • Assuming exception without error
4. What is wrong with this ROS Python service server code snippet?
import rospy
from example.srv import Multiply

def handle_multiply(req):
    return req.a * req.b

rospy.init_node('multiply_server')
service = rospy.Service('multiply', Multiply, handle_multiply)
rospy.spin()
medium
A. The service type Multiply is not imported correctly
B. The service name cannot be 'multiply'
C. The handler must return a response object, not just a number
D. rospy.spin() is missing

Solution

  1. Step 1: Check the handler function return type

    In ROS services, the handler must return a response message object, not a raw value.
  2. Step 2: Identify the error in return statement

    Returning req.a * req.b (a number) is incorrect; it should return MultiplyResponse(req.a * req.b) or equivalent.
  3. Final Answer:

    The handler must return a response object, not just a number -> Option C
  4. Quick Check:

    Handler returns response object, not raw value [OK]
Hint: Handler must return response message object, not raw data [OK]
Common Mistakes:
  • Returning raw values instead of response objects
  • Forgetting to import response message class
  • Missing rospy.spin() (though present here)
5. You want to implement a ROS service that returns the sum of two integers only if both are positive; otherwise, it returns zero. Which handler function correctly implements this request-response logic?
hard
A. def handle_sum(req): return SumTwoIntsResponse(req.a + req.b)
B. def handle_sum(req): return SumTwoIntsResponse(req.a + req.b if req.a > 0 or req.b > 0 else 0)
C. def handle_sum(req): if req.a > 0 or req.b > 0: return SumTwoIntsResponse(req.a + req.b) else: return SumTwoIntsResponse(0)
D. def handle_sum(req): if req.a > 0 and req.b > 0: return SumTwoIntsResponse(req.a + req.b) else: return SumTwoIntsResponse(0)

Solution

  1. Step 1: Understand the condition for sum

    The sum should be returned only if both req.a and req.b are positive (greater than zero).
  2. Step 2: Check each option's condition logic

    def handle_sum(req): if req.a > 0 and req.b > 0: return SumTwoIntsResponse(req.a + req.b) else: return SumTwoIntsResponse(0) uses 'and' to check both positive, returning sum or zero correctly. def handle_sum(req): return SumTwoIntsResponse(req.a + req.b if req.a > 0 or req.b > 0 else 0) uses 'or' incorrectly and missing parentheses in ternary. def handle_sum(req): if req.a > 0 or req.b > 0: return SumTwoIntsResponse(req.a + req.b) else: return SumTwoIntsResponse(0) uses 'or' which is wrong logic. def handle_sum(req): return SumTwoIntsResponse(req.a + req.b) always returns sum ignoring condition.
  3. Final Answer:

    def handle_sum(req): if req.a > 0 and req.b > 0: return SumTwoIntsResponse(req.a + req.b) else: return SumTwoIntsResponse(0) -> Option D
  4. Quick Check:

    Both positive check with 'and' = def handle_sum(req): if req.a > 0 and req.b > 0: return SumTwoIntsResponse(req.a + req.b) else: return SumTwoIntsResponse(0) [OK]
Hint: Use 'and' to check both positive before summing [OK]
Common Mistakes:
  • Using 'or' instead of 'and' for both positive check
  • Returning sum without condition
  • Incorrect ternary syntax in return
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