自学内容网 自学内容网

ros service client 通过launch读取json文件修改参数

在 ROS 中,使用 C++ 实现服务端与客户端通信,并通过 JSON 修改相机的自动曝光或亮度值,同时结合 launch 文件来启动,可以按照以下步骤进行。

  1. 创建自定义服务文件
    首先,创建一个自定义的 .srv 文件,用于定义服务请求与响应。假设服务文件名为 SetCameraSettings.srv,内容如下:

srv

string json_config
---
bool success
string message

json_config 是包含相机参数的 JSON 字符串,响应部分包含 success 以及 message。

  1. 服务端实现 (C++)
    服务端负责解析 JSON 并通过 OpenCV 控制相机设置。

cpp

// camera_settings_server.cpp
#include "ros/ros.h"
#include "your_package/SetCameraSettings.h"
#include <opencv2/opencv.hpp>
#include <jsoncpp/json/json.h>

cv::VideoCapture cap(0); // 打开默认摄像头

bool handle_set_camera_settings(your_package::SetCameraSettings::Request &req,
                                your_package::SetCameraSettings::Response &res)
{
    Json::Value config;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse(req.json_config, config);

    if (!parsingSuccessful)
    {
        res.success = false;
        res.message = "Failed to parse JSON.";
        return true;
    }

    try
    {
        if (config.isMember("exposure"))
        {
            double exposure = config["exposure"].asDouble();
            cap.set(cv::CAP_PROP_EXPOSURE, exposure);
        }

        if (config.isMember("brightness"))
        {
            double brightness = config["brightness"].asDouble();
            cap.set(cv::CAP_PROP_BRIGHTNESS, brightness);
        }

        res.success = true;
        res.message = "Settings updated successfully";
    }
    catch (const std::exception &e)
    {
        res.success = false;
        res.message = e.what();
    }

    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "camera_settings_server");
    ros::NodeHandle nh;

    // 启动服务
    ros::ServiceServer service = nh.advertiseService("set_camera_settings", handle_set_camera_settings);
    ROS_INFO("Ready to update camera settings.");

    ros::spin(); // 保持节点运行
    return 0;
}

依赖项
使用 jsoncpp 解析 JSON 字符串。
使用 OpenCV 控制相机曝光和亮度。
你需要确保 jsoncpp 和 opencv 被正确链接到你的 CMake 项目中。

  1. 客户端实现 (C++)
    客户端负责发送 JSON 请求给服务端。
// camera_settings_client.cpp (更新)
#include "ros/ros.h"
#include "your_package/SetCameraSettings.h"
#include <jsoncpp/json/json.h>
#include <fstream>
#include <iostream>

bool loadJsonFromFile(const std::string& file_path, Json::Value& jsonConfig)
{
    std::ifstream config_doc(file_path, std::ifstream::binary);
    if (!config_doc.is_open()) {
        ROS_ERROR("Could not open the JSON config file.");
        return false;
    }
    
    config_doc >> jsonConfig;
    config_doc.close();
    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "camera_settings_client");
    ros::NodeHandle nh;

    // 获取 JSON 文件路径参数
    std::string json_file_path;
    nh.getParam("json_file_path", json_file_path);

    // 定义服务客户端
    ros::ServiceClient client = nh.serviceClient<your_package::SetCameraSettings>("set_camera_settings");

    your_package::SetCameraSettings srv;

    // 加载JSON配置文件
    Json::Value config;
    if (!loadJsonFromFile(json_file_path, config))
    {
        ROS_ERROR("Failed to load JSON config from file.");
        return 1;
    }

    // 将JSON配置转换为字符串并发送给服务端
    Json::FastWriter writer;
    srv.request.json_config = writer.write(config);

    // 调用服务
    if (client.call(srv))
    {
        if (srv.response.success)
        {
            ROS_INFO("Camera settings updated successfully: %s", srv.response.message.c_str());
        }
        else
        {
            ROS_ERROR("Failed to update camera settings: %s", srv.response.message.c_str());
        }
    }
    else
    {
        ROS_ERROR("Failed to call service set_camera_settings");
    }

    return 0;
}

解释
loadJsonFromFile():这是一个辅助函数,用于从指定的 JSON 文件路径读取内容并返回 Json::Value 对象。
json_file_path:这个变量指向包含相机设置的 JSON 文件的路径。
客户端调用服务:客户端会读取 JSON 文件中的配置,并通过服务将这些配置发送到服务端

确保 JSON 文件内容是有效的,格式类似如下:

{
  "exposure": -6.0,
  "brightness": 150
}

你可以将此文件命名为 camera_settings.json 并放在一个合适的路径下,如 /home/user/config/camera_settings.json。

  1. CMakeLists.txt 配置
    在 CMakeLists.txt 中,确保链接 OpenCV 和 JsonCpp 库,同时生成服务相关代码。

cmake

cmake_minimum_required(VERSION 3.0.2)
project(your_package)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

find_package(OpenCV REQUIRED)
find_package(JsonCpp REQUIRED)

add_service_files(
  FILES
  SetCameraSettings.srv
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package(
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)

include_directories(
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
  ${JsonCpp_INCLUDE_DIRS}
)

add_executable(camera_settings_server src/camera_settings_server.cpp)
target_link_libraries(camera_settings_server ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ${JsonCpp_LIBRARIES})
add_dependencies(camera_settings_server your_package_generate_messages_cpp)

add_executable(camera_settings_client src/camera_settings_client.cpp)
target_link_libraries(camera_settings_client ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ${JsonCpp_LIBRARIES})
add_dependencies(camera_settings_client your_package_generate_messages_cpp)
  1. launch 文件
    创建一个 launch 文件,用于同时启动服务端和客户端节点。
    通过 launch 文件将 JSON 文件路径传递给客户端节点,可以通过使用 ROS 参数来实现:
<!-- camera_settings.launch -->
<launch>
  <!-- 启动服务端 -->
  <node name="camera_settings_server" pkg="your_package" type="camera_settings_server" output="screen" />

  <!-- 启动客户端,传递json文件路径参数 -->
  <node name="camera_settings_client" pkg="your_package" type="camera_settings_client" output="screen">
    <param name="json_file_path" value="/home/user/config/camera_settings.json" />
  </node>
</launch>
  1. 编译和运行
    编译代码:
cd ~/catkin_ws
catkin_make

启动 launch 文件:

roslaunch your_package camera_settings.launch

原文地址:https://blog.csdn.net/xhxhss/article/details/142905729

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!