ROS2에서 node를 알아보는 명령어는 ROS와 어떻게 다를까?
ros2라고 치는 거 외에는 거의 같아 보인다~
그리고 catkin_make로 빌드를 했었는데 이번에는 colcon 빌드를 사용하는데 어떻게 패키지를 만드는지 정리해본다
ROS에서 가장 최소 단위이면서 독립적으로 실행할 수 있는 프로그램을 Node라고 하는데
그 노드의 리스트를 확인하는 명령어이다
먼저 노드를 하나 실행을 해보자~ turtlesim 패키지를 실행한다음에 노드를 확인할 수가 있는데
ros2 run turtlesim turtlesim_node
turtlesim이라는 패키지의 turtlesim_node를 노드를 실행
이제 노드를 확인하는데 다른 터미널 창을 열어준다
ros2 node list
결과는 아래처럼 실행된 노드의 리스트 보여준다
/turtlesim
이번에는 또 다른 터미널 창을 열어준 후에 teleop 키보드를 하나 실행시켜보자
ros2 run turtlesim turtle_teleop_key
그리고 나서 list를 확인해보면 (위에서 list를 확인했던 터미널에서 다시 입력)
ros2 node list
이번에 결과는 아래처럼 나오게 되고, 노드가 한 개 더 보여지게 된다
/teleop_turtle
/turtlesim
이제 노드의 정보 보기
ros2 node info /노드명 (list를 했을 때 나온 노드명)
ros2 node info /turtlesim
결과는
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
/turtlesim 노드에 Subscribers, Publishers, Service Servers 까지 다 알려주게 된다
시각화로 볼 수 있는 툴이 있다. 실행은 rqt_graph 인데 없다면 설치
rqt_graph (툴) 설치하기
sudo apt install ros-foxy-rqt*
실행
rqt_graph
원은 노드를 의미디버깅을 할 때에 예를 들어 A노드에서 B노드로 데이터를 보내고 있다고 치면
실제로 rqt_graph를 실행해서 실제로 잘 되고 있는지 확인할 수가 있다
ros의 디버깅 툴 rqt라는 것 안에 rqt_graph도 있고 다른 것들도 많이 제공하고 있다
위에서 본 노드들이 모여있는 것이 패키지라고 할 수 있는데
파일 관점: 라이브러리, 파일들을 모아놓은 것들, 하나의 디렉토리로 구성
기능 관점: 관련 있는 프로그램(노드)을 모아놓은 것, 시뮬레이션, 하드웨어 등
또한 빌드할 때에는 colcon build의 단위이기도 하다
build를 할 때 한 a패키지, b패키지, c패키지가 있다고 하면
그중에서 b패키지의 한 노드의 코드 한줄만 바꿨다고 하면 전체를 다 빌드하는게 아니고
하나의 b패키지만 빌드를 하는 것 (시간 소요를 줄임)
c++ 로 패키지 만들기
ros2 pkg create --build-type ament_cmake {만들려는 패키지이름} --dependencies rclcpp {종속성1} {종속성2} ...
python 패키지 만들기
ros2 pkg create --build-type ament_python {만들려는 패키지이름} --dependencies rclpy {종속성1} {종속성2} ...
위의 명령어를 실행하게되면 패키지 디렉토리가 만들어지고
src 디렉토리와 CMakeLists.txt, package.xml 파일이 만들어진다
colcon 빌드를 할 때 --symlink-install 을 하게 되면 전체를 빌드하게되는데
반면 colcon으로 특정 패키지만 빌드하기는 아래처럼 진행한다
colcon build --symlink-install --packages-select 패키지명