-
Notifications
You must be signed in to change notification settings - Fork 165
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
Bug report
Required Info:
- Operating System:
- Ubuntu 16.04
- Installation type:
- Source
- Version or commit hash:
- DDS implementation:
- Fast-RTPS
- Client library (if applicable):
- rclpy
Steps to reproduce issue
Launch system for 2 nodes (talker --> lifecycle node and listener --> regular node) with following actions:
- When talker is in the Inactive state, trigger a transition to Active state
- When talker reaches Active state, start the listener node.
Launch file is below:
from launch import LaunchDescription
import launch
import launch.actions
import launch.events
import launch_ros.actions
import launch_ros.events
import launch_ros.events.lifecycle
import lifecycle_msgs.msg
def generate_launch_description():
lifecycle_talker = launch_ros.actions.LifecycleNode(
node_name = 'talker', package='lifecycle', node_executable='lifecycle_talker', output='screen')
lifecycle_listener = launch_ros.actions.LifecycleNode(
node_name='listener', package='lifecycle', node_executable='lifecycle_listener', output='screen')
# When the talker reaches the 'inactive' state, make it take the 'activate' transition
register_event_handler_for_talker_reaches_inactive_state = launch.actions.RegisterEventHandler(
launch_ros.event_handlers.OnStateTransition(
target_lifecycle_node=lifecycle_talker, goal_state='inactive',
entities=[
launch.actions.LogInfo(
msg="node 'talker' reached the 'inactive' state, 'activating'."),
launch.actions.EmitEvent(event=launch_ros.events.lifecycle.ChangeState(
lifecycle_node_matcher=launch.events.process.matches_action(lifecycle_talker),
transition_id=lifecycle_msgs.msg.Transition.TRANSITION_ACTIVATE,
)),
],
)
)
# When the talker node reaches the 'active' state, log a message and start the listener node.
register_event_handler_for_talker_reaches_active_state = launch.actions.RegisterEventHandler(
launch_ros.event_handlers.OnStateTransition(
target_lifecycle_node=lifecycle_talker, goal_state='active',
entities=[
launch.actions.LogInfo(
msg="node 'talker' reached the 'active' state, launching 'listener'."),
lifecycle_listener,
],
)
)
# Make the talker node take the 'configure' transition.
emit_event_to_request_that_talker_does_configure_transition = launch.actions.EmitEvent(
event=launch_ros.events.lifecycle.ChangeState(
lifecycle_node_matcher=launch.events.process.matches_action(lifecycle_talker),
transition_id=lifecycle_msgs.msg.Transition.TRANSITION_CONFIGURE,
)
)
"""Launch a talker and a listener."""
return LaunchDescription([
register_event_handler_for_talker_reaches_inactive_state,
register_event_handler_for_talker_reaches_active_state,
lifecycle_talker,
emit_event_to_request_that_talker_does_configure_transition
])
Start the launch and when talker node is in Active state, trigger transition to Inactive with
ros2 lifecycle set talker deactivate
Once the talker node is back in the Active state, Ctrl-C makes the launch to hung with the following error:
^C[WARNING] [launch.LaunchService]: user interrupted with ctrl-c (SIGINT)
signal_handler(2)
signal_handler(2)
[INFO] [launch]: process[lifecycle_talker-1]: process has finished cleanly
[INFO] [launch]: process[lifecycle_listener-3]: process has finished cleanly
[INFO] [launch]: process[lifecycle_listener-2]: process has finished cleanly
[ERROR] [asyncio]: Task exception was never retrieved
future: <Task finished coro=<ExecuteProcess.__execute_process() done, defined at /home/sumanth.nirmal/ros2_ws/install/lib/python3.5/site-packages/launch/actions/execute_process.py:380> exception=InvalidStateError('FINISHED: <Future finished result=None>',)>
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
result = coro.send(None)
File "/home/sumanth.nirmal/ros2_ws/install/lib/python3.5/site-packages/launch/actions/execute_process.py", line 424, in __execute_process
self.__cleanup()
File "/home/sumanth.nirmal/ros2_ws/install/lib/python3.5/site-packages/launch/actions/execute_process.py", line 321, in __cleanup
self.__completed_future.set_result(None)
File "/usr/lib/python3.5/asyncio/futures.py", line 329, in set_result
raise InvalidStateError('{}: {!r}'.format(self._state, self))
asyncio.futures.InvalidStateError: FINISHED: <Future finished result=None>
signal_handler(2)
Expected behavior
The launch system cleanly exit on Ctrl-C
Actual behavior
The launch system hangs on Ctrl-C with the above launch file
Additional information
Also every time the talker node reaches Active state it starts a new Listener node.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working