3.8.8 参数服务实现

1.参数客户端实现

功能包cpp07_exercise的src目录下,新建C++文件exe06_param.cpp,并编辑文件,输入如下内容:

/*
   需求:修改turtlesim_node的背景颜色。
   步骤:
       1.包含头文件;
       2.初始化 ROS2 客户端;
       3.定义节点类;
            3-1.创建参数客户端;
            3-2.连接参数服务端;
            3-3.更新参数。
       4.创建对象指针,并调用其函数;
       5.释放资源。
*/
// 1.包含头文件;
#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;
// 3.定义节点类;
class ExeParamClient: public rclcpp::Node{
public:
    ExeParamClient():Node("exe_param_client"),red(0){
        // 3-1.创建参数客户端;
        param_client = std::make_shared<rclcpp::SyncParametersClient>(this,"/turtlesim");
    }
    // 3-2.连接参数服务端;
    bool connect_server(){
        while (!param_client->wait_for_service(1s))
        {
            if (!rclcpp::ok())
            {
                RCLCPP_INFO(this->get_logger(),"终端退出!");
                return false;
            }

            RCLCPP_INFO(this->get_logger(),"参数服务连接中,请稍等......");
        }
        return true;
    }
    // 3-3.更新参数。
    void update_param(){
        red = param_client->get_parameter<int32_t>("background_r");
        rclcpp::Rate rate(30.0);
        int i = red;
        while (rclcpp::ok())
        {
            i < 255 ? red += 5 : red -= 5;
            i += 5;
            if(i >= 510) i = 0;

            // RCLCPP_INFO(this->get_logger(),"red = %d", red);
            param_client->set_parameters({rclcpp::Parameter("background_r",red)});
            rate.sleep();
        }

    }
private:
    rclcpp::SyncParametersClient::SharedPtr param_client;
    int32_t red;
};

int main(int argc, char const *argv[])
{
    // 2.初始化 ROS2 客户端;
    rclcpp::init(argc,argv);

    // 4.创建对象指针,并调用其函数;
    auto param_client = std::make_shared<ExeParamClient>();
    if(!param_client->connect_server()) return 1;
    param_client->update_param();

    // rclcpp::spin(param_client);
    // 5.释放资源。
    rclcpp::shutdown();
    return 0;
}

2.launch文件

功能包cpp07_exercise的launch目录下,新建launch文件exe06_param.launch.py,并编辑文件,输入如下内容:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    # 创建turtlesim_node节点
    turtle = Node(package="turtlesim",executable="turtlesim_node")
    # 创建背景色修改节点
    param = Node(package="cpp07_exercise",executable="exe06_param")

    return LaunchDescription([turtle,param])

3.编辑配置文件

package.xml 无需修改,CMakeLists.txt 文件需要添加如下内容:

add_executable(exe06_param src/exe06_param.cpp)
ament_target_dependencies(
  exe06_param
  "rclcpp"
  "turtlesim"
)

文件中 install 修改为如下内容:

install(TARGETS 
  exe01_pub_sub
  exe02_server
  exe03_client
  exe04_action_server
  exe05_action_client
  exe06_param
  DESTINATION lib/${PROJECT_NAME})

4.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select cpp07_exercise

5.执行

当前工作空间下,启动终端输入如下指令:

. install/setup.bash
ros2 launch cpp07_exercise exe06_param.launch.py

指令执行后,将生成turtlesim_node节点对应的窗口,窗口背景色会动态改变,最终运行结果与演示案例类似。

results matching ""

    No results matching ""