Search

[ROS2, launch] launch_ros.actions.Node의 output, emulate_tty 옵션

Last update:
아래와 같은 ros2 노드가 있다. 한 번은 ros2의 로거로 로깅을 하고, 한 번은 print()로 로깅을 하는 노드이다.
import rclpy from rclpy.node import Node class MyNode(Node): def __init__(self): super().__init__('my_node') self.get_logger().info('log from ros2 logger!') print('===== log from print =====') # not printed def main(): rclpy.init(args=None) my_node = MyNode() rclpy.spin(my_node) my_node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()
Python
복사
ros2 run 명령어로 실행을 해보면 아래와 같이 두 줄이 모두 로깅이 된다.
$ ros2 run my_package my_node [INFO] [1744080167.065278666] [my_node]: log from ros2 logger! ===== logging from print =====
Shell
복사
똑같은 노드를 launch 파일에서 실행해보자.
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): my_node = Node( package='my_package', executable='my_node', output='screen' emulate_tty=False ) return LaunchDescription([my_node])
Python
복사
아래처럼 print()로 찍은 로그는 출력되지 않는 것을 볼 수 있다.
$ ros2 launch my_package my_launch.py [INFO] [launch]: All log files can be found below /home/ubuntu/.ros/log/2025-04-08-02-44-51-866341-docker-desktop-2585 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [my_node-1]: process started with pid [2598] [my_node-1] [INFO] [1744080293.674119126] [my_node]: log from ros2 logger!
Shell
복사
~/.ros/log 디렉터리로 가서 저장된 로그를 출력해보자
$ cd ~/.ros/log $ ls 2025-04-08-02-46-35-600236-docker-desktop-2870 python3_2889_1744080396990.log $ cd 2025-04-08-02-46-35-600236-docker-desktop-2870/ $ ls launch.log $ cat launch.log 1744080395.6008389 [INFO] [launch]: All log files can be found below /home/ubuntu/.ros/log/2025-04-08-02-46-35-600236-docker-desktop-2870 1744080395.6009448 [INFO] [launch]: Default logging verbosity is set to INFO 1744080395.7075284 [INFO] [my_node-1]: process started with pid [2889] 1744080397.2635176 [my_node-1] [INFO] [1744080397.263281169] [my_node]: log from ros2 logger!
Shell
복사
역시 print()로 찍은 로그는 출력되지 않았다. emulate_tty 옵션이 False이기 때문이다.
이런 식으로 실험한 outputemulate_tty 옵션에 따른 결과를 정리하면 아래와 같다.
output
emulate_tty
ros2 logger → console
ros2 logger → file
stdout → console
stdout → file
log (default)
False
log
True
screen
False (default)
screen
True
both
False
both
True
아래와 같은 사실을 확인할 수 있다.
ros2 logger는 outputlog 옵션과 both 옵션이 똑같이 동작한다.
stdout(print())은 emulate_tty=True일 때만 출력된다.
권장하지는 않지만, 굳이 stdout을 쓰고 싶다면 emulate_tty=True 옵션을 주자.

References

188
issues