Skip to content

Latest commit

ย 

History

History
189 lines (157 loc) ยท 4.06 KB

File metadata and controls

189 lines (157 loc) ยท 4.06 KB

parameter ์‚ฌ์šฉํ•˜๊ธฐ (C++)

  1. ๊ฐœ์š”
  2. ์‹ค์Šต

1. ๊ฐœ์š”

  • ROS parameter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
  • node๋ฅผ ์ž‘์„ฑํ• ๋•Œ ํ•ด๋‹น node์—์„œ ํ•„์š”ํ•œ parameters๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

2. ์‹ค์Šต

2-1 package ์ƒ์„ฑํ•˜๊ธฐ

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp

2-1-1 package.xml ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

  • package ์ƒ์„ฑ์‹œ์— --dependencies ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ์„œ package.xml๊ณผ CMakeLists.txt์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • package.xml ์ˆ˜์ •ํ•˜๊ธฐ
<description>C++ parameter tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>

2-2 C++ node ์ž‘์„ฑํ•˜๊ธฐ

  • ros2_ws/src/cpp_parameters/src/cpp_parameters_node.cpp ํŒŒ์ผ ์ƒ์„ฑ
#include <chrono>
#include <functional>
#include <string>

#include <rclcpp/rclcpp.hpp>

using namespace std::chrono_literals;

class MinimalParam : public rclcpp::Node
{
public:
  MinimalParam()
  : Node("minimal_param_node")
  {
    this->declare_parameter("my_parameter", "world");

    timer_ = this->create_wall_timer(
      1000ms, std::bind(&MinimalParam::timer_callback, this));
  }

  void timer_callback()
  {
    std::string my_param = this->get_parameter("my_parameter").as_string();

    RCLCPP_INFO(this->get_logger(), "Hello %s!", my_param.c_str());

    std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")};
    this->set_parameters(all_new_parameters);
  }

private:
  rclcpp::TimerBase::SharedPtr timer_;
};

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

2-2-1 ์‹คํ–‰์ž(executable) ์ถ”๊ฐ€ํ•˜๊ธฐ

  • CMakeLists.txt ์ˆ˜์ •ํ•˜๊ธฐ (find_package(rclcpp REQUIRED) ์•„๋ž˜ ์ถ”๊ฐ€ํ•˜๊ธฐ)
add_executable(minimal_param_node src/cpp_parameters_node.cpp)
ament_target_dependencies(minimal_param_node rclcpp)

install(TARGETS
    minimal_param_node
  DESTINATION lib/${PROJECT_NAME}
)

2-3 ๋นŒ๋“œ ๋ฐ ์‹คํ–‰ํ•˜๊ธฐ

  • ์˜์กด์„ฑ ํ™•์ธํ•˜๋Š” ๋ช…๋ น ์‹คํ–‰
cd ~/ros2_ws
rosdep install -i --from-path src --rosdistro foxy -y
  • ์ƒˆ package๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ
cd ~/ros2_ws
colcon build --packages-select cpp_parameters
  • ์ƒˆ ํ„ฐ๋ฏธ๋„ ์—ด๊ณ  source ํ•˜๊ธฐ
source install/setup.bash
  • node ์‹คํ–‰ํ•˜๊ธฐ
ros2 run cpp_parameters minimal_param_node
  • ๊ฒฐ๊ณผ
[INFO] [minimal_param_node]: Hello world!

2-3-1 console๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

  • node ์‹คํ–‰ํ•˜๊ธฐ
ros2 run cpp_parameters minimal_param_node
  • ์ƒˆ ํ„ฐ๋ฏธ๋„ ์—ด๊ณ  source ์‹คํ–‰ํ•œ ํ›„์— ์•„๋ž˜ ๋ช…๋ น ์‹คํ–‰
ros2 param list
  • my_parameter ์„ค์ •ํ•˜๊ธฐ
ros2 param set /minimal_param_node my_parameter earth
  • ๊ฒฐ๊ณผ
Set parameter successful
  • ์ƒˆ ํ„ฐ๋ฏธ๋„์—์„œ source ํ›„ ์•„๋ž˜ ๋ช…๋ น ์‹คํ–‰ํ•ด๋ณด๊ธฐ
ros2 run cpp_parameters minimal_param_node
  • ๊ฒฐ๊ณผ
[INFO] [minimal_param_node]: Hello earth!

2-3-2 launch ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

  • ros2_ws/src/cpp_parameters/ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์— launch ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
  • launch ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์— 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="minimal_param_node",
            name="custom_minimal_param_node",
            output="screen",
            emulate_tty=True,
            parameters=[
                {"my_parameter": "earth"}
            ]
        )
    ])
  • CMakeLists.txt ํŒŒ์ผ์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ
install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)
  • ๋นŒ๋“œํ•˜๊ธฐ
colcon build --packages-select cpp_parameters
  • ์ƒˆ ํ„ฐ๋ฏธ๋„์—์„œ source ํ•˜๊ธฐ
source install/setup.bash
  • node ์‹คํ–‰ํ•˜๊ธฐ
ros2 launch cpp_parameters cpp_parameters_launch.py
  • ๊ฒฐ๊ณผ
[INFO] [custom_minimal_param_node]: Hello earth!