ros service client 通过launch读取json文件修改参数
在 ROS 中,使用 C++ 实现服务端与客户端通信,并通过 JSON 修改相机的自动曝光或亮度值,同时结合 launch 文件来启动,可以按照以下步骤进行。
- 创建自定义服务文件
首先,创建一个自定义的 .srv 文件,用于定义服务请求与响应。假设服务文件名为 SetCameraSettings.srv,内容如下:
srv
string json_config
---
bool success
string message
json_config 是包含相机参数的 JSON 字符串,响应部分包含 success 以及 message。
- 服务端实现 (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 项目中。
- 客户端实现 (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。
- 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)
- 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>
- 编译和运行
编译代码:
cd ~/catkin_ws
catkin_make
启动 launch 文件:
roslaunch your_package camera_settings.launch
原文地址:https://blog.csdn.net/xhxhss/article/details/142905729
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!