[ROS 연구 노트 12] ROS에서 노드, 주제, 매개변수의 중복 이름에 대하여

[ROS 연구 노트 12] ROS에서 노드, 주제, 매개변수의 중복 이름에 대하여

앞부분에 쓰여진 이 일련의 노트는 AutoLabor 튜토리얼을 참조하며 구체적인 프로젝트 주소는 여기에

머리말

이 섹션에서는 ROS에서 발생할 수 있는 다양한 중복 이름 문제를 소개하고 학습 및 의사소통을 용이하게 하는 구체적인 예를 제공합니다.


1. ROS 작업 공간 범위

소위 작업 공간 커버리지는 다른 작업 공간에 동일한 이름을 가진 함수 패키지가 있는 상황을 나타냅니다.

ROS 개발에서 커스텀 워크스페이스를 생성할 수 있고 동시에 여러 개의 커스텀 워크스페이스가 존재할 수 있는데, 특정 워크스페이스의 함수 패키지가 같은 이름을 가질 수는 없지만 커스텀 워크스페이스의 함수 패키지와 빌드된 함수 패키지가 같은 경우가 있을 수 있습니다. -in 함수 패키지는 동일한 이름을 가질 수 있거나 동일한 이름을 가진 함수 패키지가 다른 사용자 지정 작업 공간에 나타날 수 있으므로 이 이름을 가진 함수 패키지가 호출될 때 어떤 것이 호출됩니까? 예를 들어 사용자 정의 작업 공간 A에는 기능 패키지 turtlesim이 있고 사용자 정의 작업 공간 B에는 기능 패키지 turtlesim이 있습니다. 물론 시스템 내장 공간에도 turtlesim이 있습니다. turtlesim 패키지가 호출되면 어떤 작업 공간이 호출됩니까? ?

성취하다

0. 새 작업 공간 A와 작업 공간 B를 생성하고 두 작업 공간 모두에 기능 패키지인 turtlesim을 생성합니다.

1. 다음과 같이 ~/.bashrc 파일 아래에 현재 작업 공간의 bash 형식을 추가합니다 .

source /home/用户/路径/工作空间A/devel/setup.bash
source /home/用户/路径/工作空间B/devel/setup.bash

2. 새 명령줄: source .bashrc환경 변수 로드

3. ROS 환경 환경 변수 보기echo $ROS_PACKAGE_PATH

결과: 맞춤형 작업 공간 B: 맞춤형 공간 A: 시스템 내장 공간

4. 명령을 호출합니다. roscd turtlesim사용자 정의 작업 공간 B로 들어갑니다.

이유

ROS는 .bashrc 파일을 구문 분석하고 ROS_PACKAGE_PATH ROS 패키지 경로를 생성합니다. 이 변수에서 작업 영역 우선 순위는 .bashrc의 구성에 따라 설정됩니다. 설정할 때 특정 원칙을 따라야 합니다. ROS_PACKAGE_PATH의 값은 반대 순서입니다. .bashrc에 있는 구성의 -> 사후 구성이 우선 순위가 높음 커스텀 스페이스 A와 커스텀 스페이스 B의 소스 순서를 변경하면 호출 시 워크스페이스 A로 진입합니다.

결론적으로

함수 패키지의 이름이 같은 경우 ROS_PACKAGE_PATH에 따라 검색되며 먼저 구성된 것이 먼저 실행됩니다.

숨겨진 위험

보안 위험이 있습니다.예를 들어, 현재 작업 공간 B가 더 높은 우선 순위를 가지므로 프로그램이 turtlesim을 호출할 때 작업 공간 A나 시스템의 내장된 turtlesim을 호출하지 않습니다.작업 공간 A에 다른 기능 패키지가 있는 경우 자체 Turtlesim에 의존하지만 ROS 작업 공간에서 다루는 관련 원칙에 따라 실제 실행은 작업 공간 B의 Turtlesim을 호출하여 비정상적인 실행 및 잠재적인 안전 위험을 초래합니다.

버그 설명:

.bashrc 파일에 여러 작업 공간이 있는 경우 ROS PACKAGE PATH에 두 개의 작업 공간만 포함되는 경우가 발생할 수 있으며 사용자 정의 작업 공간 re-catkin_make의 빌드 및 개발 디렉토리를 삭제한 다음 bashrc 파일을 다시 로드할 수 있습니다. 문제가 해결되었습니다.

이 문제를 설명하기 위해 각각 비슷한 기능을 완성하기 위해 두 개의 새로운 작업 공간과 두 개의 기능 패키지를 만듭니다.

먼저 다음과 같이 문장을 인쇄하는 기능을 완성하기 위해 유사한 기능 패키지를 가진 두 개의 새로운 작업 공간, 즉 ws_cover1를 생성했습니다 .ws_cover2hello

파일 끝에 경로를 .bashrc추가 하면 추가된 우선순위가 더 높으며, 자동 완성 기능을 사용하면 우선순위가 더 높은 것이 완료됩니다.source xxxx


2. ROS 노드 이름 설정

시나리오: ROS에서 생성된 노드는 이름이 있는데, C++에서 노드를 초기화할 때 ros::init(argc,argv,"xxxx");API:를 통해 노드 이름을 정의하고, Python에서 노드를 초기화할 때 를 rospy.init_node("yyyy")통해 . ROS의 네트워크 토폴로지에서 같은 이름을 가진 노드는 나타날 수 없는데, 같은 이름이 존재할 수 있으면 호출 시 혼동을 일으키기 때문에 같은 이름의 노드를 시작하거나 같은 노드를 시작할 수 없다는 뜻이다. 여러번 , 사실 같은 이름의 노드가 ROS에서 시작되면 기존 노드는 바로 종료되는데 이런 수요가 있다면 어떻게 최적화를 할까요?

ROS에서 제공하는 솔루션은 네임스페이스 또는 이름 재매핑을 사용하는 것입니다.

네임스페이스는 이름의 접두사이고 이름 재매핑은 이름의 별칭입니다. 이 두 전략 모두 노드 중복 이름 문제를 해결할 수 있으며 두 가지 전략을 구현하는 방법에는 여러 가지가 있습니다.

  • rosrun 명령
  • 발사 파일
  • 인코딩 구현

위의 세 가지 방법은 네임스페이스 또는 이름 재매핑을 통해 중복 노드 이름을 피할 수 있습니다.

경우

두 개의 turtlesim_node 노드를 시작합니다.물론 두 개의 터미널을 직접 열고 직접 시작하면 처음으로 시작된 노드가 닫히고 프롬프트가 표시됩니다.

[ WARN] [1578812836.351049332]: Shutdown request received.
[ WARN] [1578812836.351207362]: Reason given for shutdown: [new node registered with same name]

두 개의 노드가 같은 이름을 가질 수 없기 때문에 중복 이름 문제에 대한 다양한 솔루션이 다음에 소개됩니다.


2.1 rosrun 네임스페이스 설정 및 리매핑

1.rosrun은 네임스페이스를 설정합니다.

1.1 네임스페이스 데모 설정

语法: rosrun 包名 节点名 __ns:=新名称

rosrun turtlesim turtlesim_node __ns:=/xxx
rosrun turtlesim turtlesim_node __ns:=/yyy

두 노드가 모두 실행 중입니다.

1.2 실행 결과

rosnode list노드 정보 보기 및 결과 표시:

/xxx/turtlesim
/yyy/turtlesim

예를 들어 두 개의 거북이 제어 노드를 시작합니다.

2. rosrun 이름 재매핑

2.1 노드 별칭 지정

구문: rosrun 패키지 이름 노드 이름 __name:= 새 이름

rosrun turtlesim  turtlesim_node __name:=t1 |  rosrun turtlesim   turtlesim_node /turtlesim:=t1(不适用于python)
rosrun turtlesim  turtlesim_node __name:=t2 |  rosrun turtlesim   turtlesim_node /turtlesim:=t2(不适用于python)

두 노드 모두 실행할 수 있습니다.

2.2 실행 결과

rosnode list노드 정보 보기 및 결과 표시:

/t1
/t2

예를 들어 두 개의 거북이 제어 노드를 시작합니다.

3. rosrun 네임스페이스 및 이름 재매핑 중첩

3.1 네임스페이스와 이름 리매핑을 동시에 설정

구문: rosrun 패키지 이름 노드 이름 __ns:=新名称,__name:=新名称

rosrun turtlesim turtlesim_node __ns:=/xxx __name:=tn

3.2 실행 결과

rosnode list노드 정보 보기 및 결과 표시:

/xxx/tn

환경 변수를 사용하여 네임스페이스를 설정할 수도 있습니다.노드를 시작하기 전에 터미널에 다음 명령을 입력하십시오.

내보내기 ROS_NAMESPACE=xxxx


2.2 파일 설정 네임스페이스 및 리매핑 실행

실행 파일의 사용 구문을 소개할 때 노드 태그에는 각각 이름 재매핑 및 네임스페이스 설정을 구현하는 데 사용되는 name 및 ns라는 두 가지 속성이 있습니다. 또한 실행 파일을 사용하여 네임스페이스 및 이름 다시 매핑을 설정하는 것도 비교적 간단합니다.

1. 실행 파일

<launch>
	<!--- 名称重映射 --->
    <node pkg="turtlesim" type="turtlesim_node" name="t1" />
    <!--- 名称重映射 --->
    <node pkg="turtlesim" type="turtlesim_node" name="t2" />
    <!--- 名称重映射 + 命名空间 --->
    <node pkg="turtlesim" type="turtlesim_node" name="t1" ns="hello"/>

</launch>

노드 태그에서 이름 속성은 필수이며 ns는 선택 사항입니다.

2. 달리기

rosnode list노드 정보 보기 및 결과 표시:

/t1
/t2
/t1/hello

예시 결과


2.3 인코딩 설정 네임스페이스 및 재매핑

노드 구현을 사용자 지정하면 네임스페이스를 설정하고 구현을 다시 매핑할 수 있습니다.

1. C++ 구현: 리매핑

1.1 이름 별칭 설정

핵심 코드:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);

1.2 구현

타임스탬프가 이름에 추가됩니다.

2. C++ 구현: 네임스페이스

2.1 네임스페이스 설정

핵심 코드

  std::map<std::string, std::string> map;
  map["__ns"] = "xxxx";
  ros::init(map,"wangqiang");

2.2 실행

노드 이름은 네임스페이스를 설정합니다.

3. Python 구현: 리매핑

3.1 이름 별칭 설정

핵심 코드:rospy.init_node("lisi",anonymous=True)

3.2 실행

노드 이름에 타임스탬프가 추가됩니다.


3 ROS 주제 이름 설정

ROS에서 노드 이름은 같은 이름을 가질 수 있고 같은 토픽 이름도 같은 이름을 가질 수 있습니다.

ROS의 노드 터미널에서 서로 다른 노드 간의 통신은 주제에 따라 다르며 주제 이름도 반복될 수 있습니다.이 경우 시스템에서 예외를 throw하지는 않지만 예기치 않은 구독 메시지가 발생할 수 있으므로 노드 비정상적으로 실행합니다. 이 경우 두 노드의 주제 이름을 같은 것에서 다른 것으로 변경해야 합니다.

또는 두 개의 노드가 통신할 수 있으며 두 노드 간에 동일한 메시지 유형을 사용하지만 주제 이름이 다르기 때문에 통신이 실패합니다. 이 경우 두 노드의 주제 이름을 다른 것에서 같은 것으로 변경해야 합니다.

실제 응용 프로그램에서는 논리에 따라 동일한 항목 이름을 다르게 설정해야 하는 경우가 있으며 서로 다른 항목 이름을 동일하게 설정하는 것도 가능합니다. ROS에서 제공되는 솔루션 전략은 노드 이름 변경과 유사하며 이름 재매핑 또는 이름 접두사를 사용합니다. 서로 다른 접두사에 따라 글로벌, 상대 및 개인의 세 가지 유형이 있습니다.

  • 전역(매개변수 이름은 노드 네임스페이스와 동일한 수준에 있는 ROS 시스템을 직접 참조함)
  • 상대적(매개변수 이름은 노드 이름과 동일한 수준에 있는 노드의 네임스페이스를 참조함)
  • private(매개변수 이름은 노드 이름을 참조하고 노드 이름의 하위임)

이름 재매핑은 이름에 별칭을 붙이고 이름에 접두사를 추가하는 것입니다.이 구현은 노드 이름 바꾸기보다 복잡합니다.이름 공간을 접두사로 사용할 뿐만 아니라 노드 이름을 접두사로 사용합니다. 두 가지 전략을 구현하는 방법에는 여러 가지가 있습니다.

  • rosrun 명령
  • 발사 파일
  • 인코딩 구현

이 섹션에서는 세 가지를 하나씩 사용하는 방법을 설명하며 세 가지에서 실현해야 하는 요구 사항은 비슷합니다.

경우

비교적 사용하기 쉬운 키보드 제어 기능 패키지가 ROS에서 제공됩니다: ros-noetic-teleop-twist-keyboard, 이 기능 패키지는 로봇의 움직임을 제어할 수 있으며 기능은 거북이의 키보드 제어 노드와 유사합니다. sudo apt install ros -noetic-teleop-twist-keyboard를 사용하여 함수 패키지를 설치한 다음 rosrun teleop_twist_keyboard teleop_twist_keyboard.py를 실행하여 거북이 디스플레이 노드를 시작할 수 있지만 이때 전자는 거북이 움직임을 제어할 수 없습니다. 두 사람이 사용하는 토픽 이름이 다르고 전자 cmd_vel/turtle1/cmd_vel토픽을 사용하는 토픽이기 때문입니다. 주제 이름을 일관성 있게 수정해야 사용할 수 있습니다. 어떻게 해야 하나요?


3.1 rosrun 설정 주제 재매핑

rosrun 이름 재매핑 구문: rorun 패키지 이름 노드 이름 주제 이름: = 새 주제 이름

teleop_twist_keyboard 및 거북이 디스플레이 노드 통신을 실현하는 두 가지 방식이 있습니다.

1. 반응식 1

teleop_twist_keyboard 노드의 주제를 다음으로 설정합니다./turtle1/cmd_vel

키보드 제어 노드를 시작합니다.rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/turtle1/cmd_vel

거북이 표시 노드를 시작합니다.rosrun turtlesim turtlesim_node

두 사람은 정상적인 의사 소통을 할 수 있습니다.

2. 반응식 2

거북이 표시 노드의 주제를 다음으로 설정합니다./cmd_vel

키보드 제어 노드를 시작합니다.rosrun teleop_twist_keyboard teleop_twist_keyboard.py

거북이 표시 노드를 시작합니다.rosrun turtlesim turtlesim_node /turtle1/cmd_vel:=/cmd_vel

두 사람은 정상적인 의사 소통을 할 수 있습니다.


예시 결과

3.2 발사 파일 설정 주제 재매핑

실행 파일은 주제 재매핑 구문을 설정합니다.

<node pkg="xxx" type="xxx" name="xxx">
    <remap from="原话题" to="新话题" />
</node>

teleop_twist_keyboard 및 거북이 디스플레이 노드 통신을 실현하는 두 가지 방식이 있습니다.

1. 반응식 1

teleop_twist_keyboard 노드의 주제를 다음으로 설정합니다./turtle1/cmd_vel

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="t1" />
    <node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="key">
        <remap from="/cmd_vel" to="/turtle1/cmd_vel" />
    </node>

</launch>

두 사람은 정상적인 의사 소통을 할 수 있습니다.

2. 반응식 2

거북이 표시 노드의 주제를 다음으로 설정합니다./cmd_vel

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="t1">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
    </node>
    <node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="key" />

</launch>

두 사람은 정상적인 의사 소통을 할 수 있습니다.


예시 결과:

3.3 코드 설정 주제명

토픽의 이름은 노드의 네임스페이스 및 노드의 이름과 일정한 관계가 있으며, 토픽의 이름은 크게 세 가지로 나눌 수 있습니다.

  • 전역(주제는 노드 네임스페이스와 동일한 수준에 있는 ROS 시스템을 참조함)
  • 상대적(노드 이름과 동일한 수준에 있는 노드의 네임스페이스를 참조하는 항목)
  • 비공개(주제는 노드 이름의 하위 항목인 노드 이름 참조)

코딩을 결합하여 구체적인 관계를 보여줍니다.

1. C++ 구현

프레젠테이션 준비:

1. 노드 이름을 설정하기 위해 노드 초기화

ros::init(argc,argv,"hello")

2. 다른 유형의 주제 설정

3. 노드를 시작할 때 __ns:= xxx를 전달합니다.

4. 노드가 시작된 후 rostopic을 사용하여 주제 정보를 봅니다.

1.1 전역 이름

형식: /로 시작하는 이름, 노드 이름과 관련 없음

예: /xxx/yyy/zzz

예 1:ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",1000);

결과 1:/chatter

예 2:ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter/money",1000);

결과 2:/chatter/money

결과 예:

1.2 친척 이름

형식: /시작하지 않는 이름, 주제 이름을 결정하려면 네임스페이스(노드 이름이 있는 수준)를 참조하십시오.

예 1:ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);

결과 1:xxx/chatter

예 2:ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);

결과 2:xxx/chatter/money

예시 결과:

1.3 개인 이름

형식: 다음으로 ~시작하는 이름

예 1:

ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);

결과 1:/xxx/hello/chatter

예 2:

ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);

결과 2:/xxx/hello/chatter/money

추신: 를 사용할 때 ~주제 이름이 때때로 /로 시작하면 주제 이름이 절대적입니다.

예 3:

ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter/money",1000);

결과 3:/chatter/money

예시 결과:

2. 파이썬 구현

프레젠테이션 준비:

1. 노드 이름을 설정하기 위해 노드 초기화

rospy.init_node("hello")

2. 다른 유형의 주제 설정

3. 노드를 시작할 때 __ns:= xxx를 전달합니다.

4. 노드가 시작된 후 rostopic을 사용하여 주제 정보를 봅니다.

2.1 전역 이름

형식: /로 시작하는 이름, 노드 이름과 관련 없음

예 1:pub = rospy.Publisher("/chatter",String,queue_size=1000)

결과 1:/chatter

예 2:pub = rospy.Publisher("/chatter/money",String,queue_size=1000)

결과 2:/chatter/money

2.2 친척 이름

형식: /시작하지 않는 이름, 주제 이름을 결정하려면 네임스페이스(노드 이름이 있는 수준)를 참조하십시오.

예 1:pub = rospy.Publisher("chatter",String,queue_size=1000)

결과 1:xxx/chatter

예 2:pub = rospy.Publisher("chatter/money",String,queue_size=1000)

결과 2:xxx/chatter/money

2.3 개인 이름

형식: 다음으로 ~시작하는 이름

예 1:pub = rospy.Publisher("~chatter",String,queue_size=1000)

결과 1:/xxx/hello/chatter

예 2:pub = rospy.Publisher("~chatter/money",String,queue_size=1000)

결과 2:/xxx/hello/chatter/money


4. ROS 파라미터 이름 설정

ROS에서 노드 이름 주제 이름은 같은 이름을 가질 수 있으며 매개 변수 이름도 같은 이름을 가질 수 있습니다.

매개변수 이름이 같으면 덮어쓰게 되는데, 이 상황을 피하려면 어떻게 해야 합니까?

매개변수 중복 이름 처리에 대해서는 리매핑 구현이 없으며, 매개변수 중복 이름을 최대한 피하기 위해 매개변수 이름에 접두어를 추가하는 방식을 사용합니다. 구현은 주제 이름과 유사하며, 글로벌, 상대 및 개인의 세 가지 유형이 있습니다.

  • 전역(매개변수 이름은 노드 네임스페이스와 동일한 수준에 있는 ROS 시스템을 직접 참조함)
  • 상대적(매개변수 이름은 노드 이름과 동일한 수준에 있는 노드의 네임스페이스를 참조함)
  • private(매개변수 이름은 노드 이름을 참조하고 노드 이름의 하위임)

매개변수를 설정하는 세 가지 방법도 있습니다.

  • rosrun 명령
  • 발사 파일
  • 인코딩 구현

세 가지 설정 방법은 이전에 다루었지만 명명 문제는 이전에 관련되지 않았으며 이 섹션에서는 세 가지 명명된 설정을 하나씩 설명합니다.

경우

노드를 시작할 때 매개변수 서버에 대한 매개변수를 추가합니다(매개변수 이름 설정에 주의해야 함).


4.1 rosrun 설정 파라미터

rosrun은 노드를 시작할 때 매개 변수를 설정할 수도 있습니다.

문법: rosrun 包名 节点名称 _参数名:=参数值

1. 파라미터 설정

거북이 표시 노드를 시작하고 매개변수 A = 100으로 설정합니다.

rosrun turtlesim turtlesim_node _A:=100

2. 달리기

rosparam list노드 정보 보기 및 결과 표시:

/turtlesim/A
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r

결과는 매개변수 A가 노드 이름 앞에 붙는 것을 보여줍니다. 즉, rosrun 실행 설정 매개변수 이름이 개인 모드를 사용함을 의미합니다.

예:


4.2 시작 파일 설정 매개변수

런치 파일을 통해 파라미터를 설정하는 방식은 이전에 소개한 바 있으며 파라미터는 노드 라벨 외부 또는 노드 라벨 내의 param 또는 rosparam을 통해 설정할 수 있습니다. 노드 태그 외부에 설정된 매개변수는 전역적이며 를 참조 /하고 노드 태그에 설정된 매개변수는 전용입니다. 를 참조하십시오 /命名空间/节点名称.

1. 파라미터 설정

param 태그를 예로 들어 매개변수를 설정합니다.

<launch>

    <param name="p1" value="100" />
    <node pkg="turtlesim" type="turtlesim_node" name="t1">
        <param name="p2" value="100" />
    </node>

</launch>

2. 달리기

rosparam list노드 정보 보기 및 결과 표시:

/p1
/t1/p1

실행 결과는 예상과 일치합니다.

예시 결과:


4.3 인코딩 설정 파라미터

인코딩 방법은 보다 편리하게 설정할 수 있습니다: 전역, 상대 및 개인 매개변수.

1. C++ 구현

C++에서는 ros::param 또는 ros::NodeHandle을 사용하여 매개변수를 설정할 수 있습니다.

1.1ros::param 설정 파라미터

파라미터 설정을 위한 호출 API는 ros::param::set 이며, 이 함수에서 파라미터 이름으로 파라미터 1이 전달되고 파라미터 2는 전달된 파라미터의 값입니다. /로 시작하면 전역 매개변수이고 ~로 시작하면 개인 매개변수이고 / 또는 ~로 시작하지 않으면 상대 매개변수입니다. 코드 예:

ros::param::set("/set_A",100); //全局,和命名空间以及节点名称无关
ros::param::set("set_B",100); //相对,参考命名空间
ros::param::set("~set_C",100); //私有,参考命名空间与节点名称

실행할 때 설정된 네임스페이스가 xxx이고 노드 이름이 yyy라고 가정하고 rosparam 목록을 사용하여 다음을 확인합니다.

/set_A
/xxx/set_B
/xxx/yyy/set_C

1.2ros::NodeHandle 설정 파라미터

매개변수를 설정할 때 먼저 NodeHandle 객체를 생성한 후 해당 객체의 setParam 함수를 호출해야 하는데 이 함수의 매개변수 1은 매개변수 이름이고 매개변수 2는 설정할 매개변수 값입니다. /로 시작하면 전역 매개변수이고 매개변수 이름이 /로 시작하지 않으면 매개변수가 상대 매개변수인지 전용 매개변수인지는 NodeHandle 객체와 관련이 있습니다. 인수가 없는 기본 구성이 호출되면 매개변수는 상대 매개변수입니다. NodeHandle 객체가 다음을 사용하여 생성된 경우:

ros::NodeHandle nh("~")이면 매개변수는 전용 매개변수입니다. 코드 예:

ros::NodeHandle nh;
nh.setParam("/nh_A",100); //全局,和命名空间以及节点名称无关

nh.setParam("nh_B",100); //相对,参考命名空间

ros::NodeHandle nh_private("~");
nh_private.setParam("nh_C",100);//私有,参考命名空间与节点名称

실행할 때 설정된 네임스페이스가 xxx이고 노드 이름이 yyy라고 가정하고 rosparam 목록을 사용하여 다음을 확인합니다.

/nh_A
/xxx/nh_B
/xxx/yyy/nh_C

예:

2. 파이썬 구현

파이썬에서 매개변수 설정의 문법적 구현은 C++보다 간단하며 호출되는 API는 rospy.set_param입니다. 이 함수에서 매개변수 1은 매개변수 이름으로 전달되고 매개변수 2는 매개변수 값입니다. , 매개변수가 /로 시작하면 전역 매개변수, ~로 시작하면 개인 매개변수, /나 ~로 시작하지 않으면 상대 매개변수입니다. 코드 예:

rospy.set_param("/py_A",100)  #全局,和命名空间以及节点名称无关
rospy.set_param("py_B",100)  #相对,参考命名空间
rospy.set_param("~py_C",100)  #私有,参考命名空间与节点名称

실행할 때 설정된 네임스페이스가 xxx이고 노드 이름이 yyy라고 가정하고 rosparam 목록을 사용하여 다음을 확인합니다.

/py_A
/xxx/py_B
/xxx/yyy/py_C


참조

http://www.autolabor.com.cn/book/ROSTutorials/di-2-zhang-ros-jia-gou-she-ji/23-fu-wu-tong-xin/224-fu-wu-tong- xin-zi-ding-yi-srv-diao-yong-b-python.html

추천

출처blog.csdn.net/qq_44940689/article/details/129355130