반응형

launch 파일을 보면 node 실행할 때 parameter 를 같이 넘기는 경우가 있다.

그런걸 어떻게 하는지 알아본다.

 

패키지 만들기.

~/ros2_dev_ws/src$ ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp

 

package.xml 수정


  <description>C++ parpameter tutorial</description>
  <maintainer email="amuge@gmail.com">lionel.j</maintainer>
  <license>Apache License 2.0</license>

 

C++ node 코드 만들기.

#include <rclcpp/rclcpp.hpp>
#include <chrono>
#include <string>
#include <functional>

using namespace std::chrono_literals;

class ParametersClass: public rclcpp::Node
{
  public:
    ParametersClass()
      : Node("parameter_node") //node 이름 설정.
    {
      this->declare_parameter<std::string>("my_parameter", "world"); //parameter 이름 : my_parameter, 기본값 world
      timer_ = this->create_wall_timer(
      1000ms, std::bind(&ParametersClass::respond, this));  //1000ms 마다 respond 발생.
    }
    void respond()
    {
      this->get_parameter("my_parameter", parameter_string_);
      RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());  //파라메터 받아서 로그로 출력
    }
  private:
    std::string parameter_string_;
    rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char** argv)
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<ParametersClass>());
  rclcpp::shutdown();
  return 0;
}

 

빌드하고 실행하기

~/ros2_dev_ws$ rosdep install -i --from-path src --rosdistro foxy -y
#All required rosdeps installed successfully


~/ros2_dev_ws$ colcon build --packages-select cpp_parameters
Starting >>> cpp_parameters
Finished <<< cpp_parameters [1.99s]                     

Summary: 1 package finished [2.07s]

 

$ . install/setup.bash

 

1초 마다 찍힌다.

$ ros2 run cpp_parameters parameter_node
[INFO] [1610527971.223648148] [parameter_node]: Hello world
[INFO] [1610527972.223857653] [parameter_node]: Hello world
^C[INFO] [1610527973.173432118] [rclcpp]: signal_handler(signal_value=2)

 

파라메터 뭐 있는지 모를때.

$ ros2 run cpp_parameters parameter_node

 

일단 이렇게 띄워놓고 다른 터미널에서 

ros2 param list
/parameter_node:
  my_parameter
  use_sim_time

 

이렇게 하면 보인다. 아까 만든 my_parameter

여기다 원하는 파라메터 넣으려면

 

이거 떠있는 상태에서

 

$ ros2 run cpp_parameters parameter_node
[INFO] [1610528113.592845534] [parameter_node]: Hello world
[INFO] [1610528114.592825048] [parameter_node]: Hello world
[INFO] [1610528115.592706663] [parameter_node]: Hello world
[INFO] [1610528116.592724252] [parameter_node]: Hello earth
[INFO] [1610528117.592839319] [parameter_node]: Hello earth
[INFO] [1610528118.592743218] [parameter_node]: Hello earth

 

ros2 param set /parameter_node my_parameter earth
Set parameter successful

 

이렇게 실행 중에 넣을 수 있다.

 

lunch 파일로 해보기

 

lunch 디렉토리 안에 lunch 파일을 만든다.

 

~/ros2_dev_ws/src/cpp_parameters/launch$ ls
cpp_parameters_launch.py

 

 

$ cat cpp_parameters_launch.py 
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package="cpp_parameters",
            executable="parameter_node",
            name="custom_parameter_node",
            output="screen", #프린트아웃 될 곳을 콘솔로 쓴다.
            emulate_tty=True,
            parameters=[
                {"my_parameter": "earth"}  #여기다가 파라메터를 넣는다.
            ]
        )
    ])

 

CMakeLists.txt를 수정한다.

새로만든 launch 를 추가.

 

install(
    DIRECTORY launch
    DESTINATION share/${PROJECT_NAME}
    )

 

build

$ colcon build --packages-select cpp_parameters

 

실행

. install/setup.bash

 


$ ros2 launch cpp_parameters cpp_parameters_launch.py
[INFO] [launch]: All log files can be found below /home/lionelj/.ros/log/2021-01-13-18-03-48-626363-lionelj-Alienware-Area-51m-36893
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [parameter_node-1]: process started with pid [36895]
[parameter_node-1] [INFO] [1610528629.697921668] [custom_parameter_node]: Hello earth
[parameter_node-1] [INFO] [1610528630.697804856] [custom_parameter_node]: Hello earth
[parameter_node-1] [INFO] [1610528631.697828694] [custom_parameter_node]: Hello earth
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[parameter_node-1] [INFO] [1610528632.078469806] [rclcpp]: signal_handler(signal_value=2)
[INFO] [parameter_node-1]: process has finished cleanly [pid 36895]

반응형

'Embeded > ROS' 카테고리의 다른 글

ROS2 ros2doctor  (0) 2021.01.13
ROS2 msg 와 srv files  (0) 2021.01.13
ROS2 간단한 service 와 client 만들기 (C++)  (0) 2021.01.12
Posted by Real_G