1. 이론 공부
런치파일 프로그래밍 : 2부 18장
런치파일 : 2개이상의 노드를 동시에 실행시키는 설정파일, 노드를 실행시키면서 패키지의 파라미터 초기화, 노드 네임스페이스 설정, 환경변수 설정 등을 수행할수 있다.
노드를 개별적으로 실행할때는 ros2 run <패키지명> <노드명> 명령어 사용
런치파일을 실행할때는 ros2 lauch <패키지명> <런치파일명> 명령어 사용
런치파일은 xml파일형식(ROS1 방식), 파이썬 형식 모두 가능하다.
런치(launch) 파일은 패키지 디렉토리 아래에 launch 디렉토리를 만들고 그안에 저장한다.
런치파일 작성방법 -> ROS2 버전별로 문법이 약간씩 다르니 반드시 리눅스에서는 Eloquent 버전의 튜토리얼문서를 참고할것
https://docs.ros.org/en/eloquent/Tutorials/Launch-Files/Creating-Launch-Files.html#ros2launch
https://docs.ros.org/en/eloquent/Tutorials/Launch-system.html
2. rplidar_ros2 패키지의 런치파일 분석
rplidar_ros2 패키지 디렉토리의 내용물은 다음과 같고 launch 디렉토리가 존재하고 그안에 런치파일이 저장되어 있다.
launch 디렉토리 아래에는 rplidar 제품모델별로 사용가능한 런치파일이 저장되어 있다.
사용모델은 rplidar A1이므로 view_rplidar_launch.py 파일을 사용하면됨
빌드설정파일(CMakeLists.txt) 에서 install 명령어를 이용하여 launch 디렉토리 아래에 저장된 런치파일을 ros2_ws/install/share/패키지명 디렉토리에 복사해야한다.
런치파일을 실행할때도 노드를 실행할때와 동일하게 환경설정파일을 먼저 실행해야한다.
런치파일을 실행하기전에 먼저 패키지를 빌드해야한다.
view_rplidar_launch.py 런치파일분석
https://github.com/Slamtec/rplidar_ros/blob/ros2/launch/view_rplidar_launch.py
필요한 패키지 import
파이썬 런치파일의 내용은 복잡해보이지만 간단히 얘기하면 아래와 같은 1개의 함수 generate_launch_description를 정의하면 된다.
지역변수를 선언하고 파라미터의 초기값을 저장한 LaunchConfiguration 객체를 생성하여 대입
serial_port : 함수의 지역변수
'serial_port' : 노드의 파라미터(rplidar_scan_publisher.cpp ) -> 파라미터는 문자열로 표현함
'/dev/ttyUSB0' : 초기값
첫문장의 의미는 serial_port라는 함수의 지역변수에 초기값으로 '/dev/ttyUSB0'을 갖는 'serial_port'라는 파라미터를 저장한 LaunchConfiguration 객체를 대입하라는 의미임
rviz2를 위한 환경설정파일의 경로를 찾아서 저장하는 부분임
rviz 환경설정파일은 rplidar_ros2/rviz/rplidar_ros2.rviz 이다. 이것은 Rviz 공부할때 다시 설명하겠다.
다음은 함수의 리턴문임 LaunchDescription 클래스의 생성자를 호출하고 그 결과값인 LaunchDescription 임시객체를 리턴하는 문장임
LaunchDescription 클래스 생성자의 매개변수의 앞부분은 런치인수(LaunchArgumnet)를 선언하는 부분임, 여기서 선언한 런치인수는 아래의 노드객체에서 초기화할때 사용한다.
노드의 파라미터 'serial_port' 를 위에서 선언한 serial_port 의 값으로 초기화 하라는 의미임
실행할 노드를 정의하는 부분임
실행할 노드는 2개로 정의되어 있음, 같은 형식으로 실행할 노드를 추가하면 됨
첫번째 노드는 rplidar_ros2 패키지의 rplidar_scan_publisher 노드와 노드의 파라미터 초기값을 설정
두번째 노드는 rviz2 패키지의 rviz2 노드를 실행하고 매개변수는 앞에서 설정한 rviz_config_dir 디렉토리 아래의 설정파일(rplidar_ros2/rviz/rplidar_ros2.rviz)의 내용으로 초기화하라는 의미임
Node 생성자의 parameters는 노드에서 선언한 파라미터의 초기값을 설정하는부분이고 아래와 같이 지역변수를 이용하여 초기화해도 되고 교재처럼 yaml 파일에 먼저 초기값을 저장해두고 파일의 내용으로 초기화하는 방식을 사용해도됨(교재 420페이지 참고)
예를 들어 'serial_port' 처럼 작음따옴표 안에 있는 문자열은 rplidar_scan_publisher 노드에서 선언된 파라미터를 의미하고
serial_port 변수는 generate_launch_description 함수안에서 선언된 지역변수를 의미한다.
ROS2 버전별로 약간의 문법차이가 있는데 Eloquent버전에서는 교재의 executable을 node_executable 변경해야함
foxy버전에서는 executable을 사용한다.
3. 런치파일 작성
먼저 앞에서 만든 dynamixel_server 패키지에 런치파일을 추가해보자
먼저 패키지 디렉토리에 launch 디렉토리를 생성한다.
$ cd ~/ros2_ws/src/dynamixel_server/
$ mkdir launch
launch 디렉토리 아래에 런치파일을 생성한다.
$ cd launch
$ vi dynamixel.launch.py
가장 간단한 형태의 런티파일이다. 먼저 필요한 파이썬 패키지를 임포트하고 함수 generate_launch_description을 정의해주면 된다. 함수는 몸체는 없고 단순히 LaunchDescription 클래스의 생성자를 호출하여 임시 LaunchDescription 객체를 생성하고 바로 리턴한다. 생성자의 인수자리에 2개의 Node 객체를 Node 생성자를 호출하여 생성해준다. Node 생성자의 인수는 패키지명, 노드네임스페이스, 실행할 노드실행파일명, 노드이름이다.
같은 노드를 실행하기 때문에 구분해주기 위하여 노드 네임스페이스를 다르게 정의한다.
패키지를 실행할때 처럼 런티파일을 어디서든 실행하려면 빌드설정파일에 런치파일을 install 디렉토리에 설치해줘야한다.
다음과 같은 코드를 빌드설정파일에 추가해줘야한다.launch 디렉토리 아래에의 내용물을 install/share/<패키지명> 아래에 설치(복사)하라는 의미임
패키지 빌드
빌드설정파일이 수정되었으므로 다시 빌드해야한다.
$ cd ~/ros2_ws
$ colcon build --symlink-install --packages-select dynamixel_server
런치파일실행
$ source ~/ros2_ws/install/setup.bash
$ ros2 launch ros2_dynamixel_pkg_rclcpp dynamixel.launch.py
2개의 같은 노드가 실행되므로 네임스페이스를 이용하여 구분해주면 된다.
새로운 터미널을 실행하여 서비스를 호출해본다.
먼저 파라미터와 서비스 리스트를 확인해본다
$ ros2 param list -> 서버이름이 네임스페이스로 구분됨
$ ros2 service list -> 서비스가 네임스페이스 ds1, ds2로 구분되어 있음을 확인
먼저 파라미터를 400으로 설정한다.
$ ros2 param set /ds1/dynamixel_server motor_speed 400
$ ros2 param get /ds1/dynamixel_server motor_speed
$ ros2 service call /ds1/start_motor std_srvs/srv/Empty -> 첫번째 노드의 start_motor 서비스 호출
$ ros2 service call /ds1/stop_motor std_srvs/srv/Empty -> 첫번째 노드의 stop_motor 서비스 호출
두번째 노드에 대해서도 똑같이 동작해야한다.
* 2개의 프로그램이 하나의 장치(/dev/ttyUSB0)를 사용하기 때문에 종료시 문제발생하니 수정해야함
다시 실행할때는 다이나믹셀 전원을 끈다음 다시 연결할것
4. 실습과제
위 예제처럼 앞에서 만든 dynamixel 패키지 런치파일 작성하고 런치파일을 이용하여 실행해보라
런치파일에서 2개의 dynamixel_subscriber 노드를 실행하고 ros2 명령어로 각각의 dynamixel_subscriber 노드에 토픽을 퍼블리시하여 동작을 테스트해볼것, ros2 명령어로 토픽을 퍼블리시하는 방법은 교재 136페이지를 참고하라.(ros2 topic pub)
런치파일, 패키지설정파일, 실행결과를 첨부하라