제가 작성하는 이 글은 제가 공부하기 위해 작성하고 제 학교 후배들에게 조금이라도 ros에 대해서 접하게 하고자 작성하게 되었습니다. 그러니 만약 틀린내용이나 그러니 제가 부족한 부분이 있을수 있으니 주의해주면서 봐주시면 감사하겠습니다 -Happy Lee-

run과 launch의 차이는 특정 패키지의 하나의 노드를 실행하는 것과 ros에 장점을 살리기 위한 노드를 동시에 실행시키기 위해 launch를 사용하게 된다.
ROS1에서는 roslaunch로 .launch XML 파일을 사용해 노드를 설정하며, 태그별 옵션을 제공하였지만 ROS2에서는 더 다양한 환경과 기능을 추가하기 위하여 기존 XML 방식 이외에 Python 방식도 추가되었다.
먼저 launch를 하는 방법에 대해서 알아보도록 하겠다.
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
param_dir = LaunchConfiguration(
'param_dir',
default=os.path.join(
get_package_share_directory('py_test'),
'param',
'arithmetic_config.yaml'))
return LaunchDescription([
DeclareLaunchArgument(
'param_dir',
default_value=param_dir,
description='Full path of parameter file'),
Node(
package='py_test',
executable='argument',
name='argument',
parameters=[param_dir],
output='screen'),
Node(
package='py_test',
executable='calculator',
name='calculator',
parameters=[param_dir],
output='screen'),
])
from ament_index_python.packages import get_package_share_directory : ROS 2의 ament_index 시스템을 사용하여 특정 패키지의 share 디렉토리 경로를 가져옴
from launch import LaunchDescription : 런치 파일의 구성 객체를 정의하고 설정 변수 등을 포함
from launch.actions import DeclareLaunchArgument : 런치 파일에서 런치 인자를 정의함
from launch.substitutions import LaunchConfiguration : 런치 파일에서 정의된 런치 인자를 참조하거나, 기본값을 설정
from launch_ros.actions import Node : 런치 파일에 노드 설정
def generate_launch_description() : 함수 제작
LaunchConfiguration : 런치 파일 내에서 사용 가능한 런치 변수를 정의
default=os.path.join : 파일 경로를 지정한는것
이것은 파라미터를 지정하는것인데 아직도 난 이해를 못하겠다. 그러니 이부분은 다시 찾아보고 공부를 해야겠다.
return LaunchDescription() : 여기가 중요하다. 이 부분이 이제 노드를 시행시키는 것인데 이 부분이 노드들을 시행시키는 것이다.
package : 패키지 이름
executable : 코드 실행 부분
name : 노드 이름
parameters : 상단에 파라미터 값 제공
output : 노드의 로그를 터미널에 출력
근데 여기서 궁금한게 executable 부분이 저렇게 써도 되는지 궁금할꺼다. 저거의 이유는

여기서 저 용어룰 저 코드로 실행시킨다는 말을 사용했기 때문에 저렇게 사용해도 된다.
from setuptools import find_packages, setup
import glob #new
import os #new
package_name = 'py_test'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
#추가---------------------------------------
('share/' + package_name + '/launch', glob.glob(os.path.join('launch', '*.launch.py'))),
('share/' + package_name + '/param', glob.glob(os.path.join('param', '*.yaml'))),
],
------------------------------------------
install_requires=['setuptools'],
zip_safe=True,
maintainer='happy',
maintainer_email='happy@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'argument = py_test.arithmetic.argument:main',
'operator = py_test.arithmetic.operator:main',
'calculator = py_test.calculator.main:main',
'checker = py_test.checker.main:main',
],
},
)
추가 부분만 설명드리자면 각 launch나 param에 있는 launch.py 그리고 .yaml 파일을 찾아서 share 쪽에다가 설치되는 것을 말합니다. 여기서 share가 궁금할텐데 이곳은 ROS 2 패키지의 표준 설치 경로로 복사되어 관리하는 곳이라고 생각하면 됩니다. 그래서 잘못 만들시 오류가 생길수 있습니다.
그리고 glob 같은경우 파일 시스템에서 특정 패턴과 일치하는 파일 목록을 가져오는 데 사용되어 launch 디렉토리에서 launch 파일을 다 찾아냅니다.
그리고 os는 알다싶이 운영체제 관련으로 그곳의 디렉토리를 보여줍니다.
자 이제 일단 토픽, 서비스, 액션에 대한 개념을 알았다. 다음은 ros에 대한 다른 것들에 대해 알아보도록 하겠다.