ROS에서 실행 파일에 대한 심층 분석

ROS에서 실행 파일에 대한 심층 분석

1. 시작 파일 소개

ROS의 관점에서 로봇 시스템은 노드와 토픽 (일부 매개 변수, 서비스 등 추가)으로 구성된 네트워크 (rosgraph)이며, 각각은 특정 기능을 수행 할 수 있습니다. 일반적으로 로봇이 실행 중일 때 많은 노드를 켜야하는데 노드를 하나씩 시작하는 것이 더 번거 롭습니다. 시작 파일과 roslaunch 명령을 통해 한 번에 여러 노드를 시작할 수 있으며 다양한 매개 변수를 설정할 수 있습니다.

2. 시작 파일 실행

roslaunch 명령을 사용하여 실행 파일을 시작하는 방법은 최소한 두 가지입니다.

1.借助 ros package 路径启动
roslaunch  pkg_name  launchfile_name.launch 

2.直接给出 launch 文件的绝对路径
roslaunch path_to_launchfile

실행 파일을 시작하는 데 어떤 방법을 사용하든 뒤에 매개 변수를 추가 할 수 있습니다.

--screen: 令 ros node 的信息(如果有的话)输出到屏幕上,而不是保存在某个 log 文件中,
这样比较方便调试

arg:=value: 如果 launch 文件中有待赋值的变量,可以通过这种方式赋值,例如:
roslaunch   pkg_name  launchfile_name  model:=urdf/myfile.urdf  # launch file 中有参数 
“model” 需要赋值

roslaunch 명령을 실행하면 먼저 시스템의 rosmaster가 실행 중인지 확인합니다. 이미 시작된 경우 기존 rosmaster를 사용하고, 시작되지 않은 경우 먼저 rosmaster를 시작한 다음에서 설정을 실행합니다. 시작 파일 사전 구성이 시작됩니다.
런치 파일은 컴파일 할 필요가 없으며 설정 후 위의 방식으로 직접 실행할 수 있습니다.

3. 시작 파일의 형식

시작 파일은 기본적으로 헤더에 추가 할 수있는 xml 파일입니다.

<?xml version="1.0"?>

다른 xml 형식 파일과 마찬가지로 시작 파일도 태그를 통해 작성됩니다.
주요 태그는 다음과 같습니다.

<launch>                <!--根标签-->
<node>                  <!--需要启动的node及其参数-->
<include>               <!--包含其他launch-->
<machine>               <!--指定运行的机器-->
<env-loader>            <!--设置环境变量-->
<param>                 <!--定义参数到参数服务器-->
<rosparam>              <!--加载yaml文件中的参数到参数服务器-->
<arg>                   <!--定义变量-->
<remap>                 <!--设定 topic 映射-->
<group>                 <!--设定分组-->
</launch>               <!--根标签-->

다음은 각각 런치와 노드에 대한 소개입니다.

<launch>, <node>
这两个 tag 是 launch 文件的核心部分。基本格式如下:
<launch>
<node pkg="package_name" type="executable_file" name="node_name1"/>
<node pkg="another_package" type="another_executable" name="another_node"></node>
...
</launch>
其中
pkg 是节点所在的 package 名称
type是 package 中的可执行文件,如果是 python 或者 Julia 编写的,就可能是 .py 或者 .jl 文件,如果是
 c++ 编写的,就是源文件编译之后的可执行文件的名字。与CMakeLists.txt文件中的可执行文件的名字一致
name是节点启动之后的名字, 每一个节点都要有自己独一无二的名字。与启动后的节点名一致

참고 : roslaunch는 노드의 시작 순서를 보장 할 수 없으므로 시작 파일의 모든 노드는 시작 순서에 견고해야합니다.

실제로 pkg, type, name 외에도 다음과 같이 더 많은 매개 변수를 설정할 수 있습니다.

<launch>
<node
    pkg=""
    type=""
    name=""  
    respawn="true" 
    required="true"
    launch-prefix="xterm -e"
    output="screen"
    ns="some_namespace"
/>
</launch>

위의 명령에서

respawn:若该节点关闭,是否自动重新启动

required:若该节点关闭,是否关闭其他所有节点

launch-prefix: 是否新开一个窗口执行。例如,需要通过窗口进行机器人移动控制的时候,应该为控制 node
 新开一个窗口;或者当 node 有些信息输出,不希望与其他 node 信息混杂在一起的时候。
 
output:默认情况下,launch 启动 node 的信息会存入下面的 log 文件中 
/.ros/log/run_id/node_name-number-stdout.log
可以通过此处参数设置,令信息显示在屏幕上

ns:将 node 归入不同的 namespace,即在 node name 前边加 ns 指定的前缀。为了实现这类操作,在 node 
源文件中定义 node name 和 topic name 时要采用 relative name, 即不加slash符号 /.

다시 매핑

종종 노드 태그의 하위 태그로 나타나며 주제를 수정하는 데 사용할 수 있습니다. 많은 rosnode 소스 파일에서 수신 또는 전송 될 토픽이 지정되지 않을 수 있지만 대신 input_topic과 output_topic 만 사용되므로 특정 시나리오에서는 추상 토픽 이름을 토픽 이름으로 바꿔야합니다.

간단히 말해 remap의 역할은 동일한 노드 파일을 다른 환경에 적용 할 수 있도록하는 것이며, 소스 파일을 변경하지 않고 외부에서 주제를 수정하기 위해 remap을 사용할 수 있습니다.

재 맵핑의 일반적인 사용 형식은 다음과 같습니다.

<node pkg="some" type="some" name="some">
<remap from="origin" to="new" />
</node>

포함

이 태그의 기능은 시작 파일의 중첩과 유사하게이 시작 파일에 다른 시작 파일을 추가하는 것입니다.

기본 형식 :

<include file="path-to-launch-file" />

위의 파일 경로에 특정 경로를 지정할 수 있지만 일반적으로 프로그램의 이식성을 위해 find 명령을 사용하여 파일 경로를 지정하는 것이 가장 좋습니다.

<include file="$(find package-name)/launch-file-name" />

위의 명령에서 $ (find package-name)은이 시스템의 해당 패키지 경로와 동일합니다. 이렇게하면 다른 시스템으로 변경하더라도 동일한 패키지를 설치하면 해당 경로를 찾을 수 있습니다.

때로는 다른 시작으로 도입 된 노드의 이름을 균일하게 지정하거나 / vehicle1 / gps, / vehicle1 / lidar, / vehicle1 / imu와 같은 유사한 특성을 가진 노드의 이름을 지정해야 할 수 있습니다. 쉬운 검색을위한 접두사. 이는 ns (네임 스페이스) 속성을 설정하여 수행 할 수 있습니다. 명령은 다음과 같습니다.

<include file="$(find package-name)/launch-file-name " ns="namespace_name" />

arg

매개 변수는 <arg> 태그를 통해 재사용 할 수 있으며 동시에 여러 위치를 수정하는 것도 편리합니다.
<arg> 세 가지 일반적인 방법 :

<arg name="foo">: 声明一个 arg,但不赋值。稍后可以通过命令行赋值,或者通过 <include> tag 赋值。
<arg name="foo" default="1">: 赋默认值。这个值可以被命令行和<include> tag 重写。
<arg name="foo" value="1">: 赋固定值,这个值不可以被改写.

명령 줄에서 값 할당

roslaunch package_name file_name.launch  arg1:=value1  arg2:=value2

변수 대체 $ (find *) 및 $ (arg *)

실행 파일에는 일반적으로 사용되는 두 가지 변수 대체 형식이 있습니다.

$(find pkg): 例如$(find rospy)/manifest.xml. 如果可能,强烈推荐这种基于 package 的路径设置

$(arg arg_name): 将此处替换成 <arg> tag 指定的 arg value.

예 :

<arg name="gui" default="true" />  
# 先设置默认值,如果没有额外的赋值,就用这个默认值了
<param name="use_gui" value="$(arg gui)"/>

다른 예시:

<node name="add_two_ints_client" pkg="beginner_tutorials" type="add_two_ints_client" args="$(arg a) $(arg b)" />

이 설정 후 roslaunch를 시작할 때 args에 값을 할당 할 수 있습니다.

roslaunch beginner_tutorials launch_file.launch a:=1 b:=5

param 및 rosparam

param에 관해서는 먼저 ROS 마스터가 관리하고 공유 사전 (dict) 유형 데이터를 제공하는 매개 변수 서버를 알아야합니다. 노드는이 서버를 통해 런타임에 필요한 매개 변수를 저장하고 가져옵니다.

param 서버는 고속 액세스를 위해 설계되지 않았으므로 일반적으로 구성 매개 변수와 같은 정적 데이터를 저장하는 데만 적합합니다.

전 세계적으로 사용할 수 있으므로 매개 변수를 쉽게보고 수정할 수 있습니다.

param의 이름은 topic 및 node와 동일하며 둘 다 네임 스페이스 계층 구조를 가지고있어 다른 소스의 이름 충돌을 방지 할 수 있습니다. 액세스는 또한 아래 매개 변수와 같은 구조를 반영합니다.

/camera/left/name: leftcamera
/camera/left/exposure: 1
/camera/right/name: rightcamera
/camera/right/exposure: 1.1

위 데이터의 경우

如果读取参数 /camare/left/name 可以得到 leftcamera

如果读取 param /camera/left可以得到 dict 为 
{name: leftcamera, exposure: 1}

如果读取 param /camera,则得到 dict 为 
{left: {name: leftcamera, exposure: 1}, 
right: {name: rightcamera, exposure: 1.1}} 

Param
은 arg와 다르고 param은 공유되며 그 값은 값으로 제한되지 않으며 파일 또는 명령 행일 수도 있습니다.
체재

<param name="param_name" type="type1" value="val"/>     # type可以省略,系统自动判断
<param name="param_name" textfile="$(find pkg)/path/file"/>     # 读取 file 存成 string
<param name="param_name" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
实例:
<param name="param" type="yaml" command="cat '$(find pkg)/*.yaml'"/> # command 的结果存在 
param 中

Param은 전역 범위에있을 수 있고 해당 이름은 원래 이름이거나 노드와 같이 더 작은 범위에있는 경우 전역 이름은 node / param 형식입니다.

예를 들어, 전역 범위에서 다음 매개 변수를 정의합니다.

<param name="publish_frequency" type="double" value="10.0" />

그런 다음 노드 범위에서 다음 매개 변수를 정의하십시오.

 <node name="node1" pkg="pkg1" type="exe1">
<param name="param1" value="False"/>
 </node>

rosparam list를 사용하여 서버에있는 매개 변수를 나열하면

/publish_frequency
/node1/param1   # 自动加上了 namespace 前缀

참고 : 네임 스페이스는 매개 변수 이름 앞에 추가되지만 여전히 전역으로 볼 수 있습니다.

으르렁 거리다

<param> 只能对单个 param 操作,而且只有三种:value, textfile, command 形式,返回的是单个 param 的
内容。
<rosparam> 则可以批量操作,还包括一些对参数设置的命令,如 dump, delete 等

load : YAML 파일에서 매개 변수 배치를로드합니다. 형식은 다음과 같습니다.

<rosparam command="load" file="$(find rosparam)/example.yaml" />

삭제 : 매개 변수 삭제

<rosparam command="delete" param="my_param" />

<param>과 유사한 할당 작업

<rosparam param="my_param">[1,2,3,4]</rosparam>

또는

<rosparam>
a: 1
b: 2
</rosparam>

<rosparam> 태그도 태그에 배치 할 수 있습니다. 이때 매개 변수 이름 앞에 노드 네임 스페이스가 추가됩니다.

그룹
이 동일한 특정 네임 스페이스에있는 모든 노드와 같은 여러 노드에 대해 동일한 설정을 설정하고 동일한 주제를 다시 매핑하려는 경우 태그를 사용할 수 있습니다. 모든 공통 태그는 예를 들어 그룹 설정에서 사용할 수 있습니다.

<group ns="wg2">
<remap from="chatter" to="talker"/> # 对该 group 中后续所有 node 都有效
<node ... />
<node ... >
    <remap from="chatter" to="talker1"/> # 各个 node 中可以重新设置 remap
</node>
</group>

추천

출처blog.csdn.net/m0_45388819/article/details/111030891