ROS2 class 에서 parameter 쓰기 (C++), launch 파일 만들기
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 |