c++通过webservice获取机器人当前位置

[复制链接]
查看100 | 回复0 | 昨天 17:03 | 显示全部楼层 |阅读模式


PCSDK提供的dll基于c#。如果其他语言要获取机器人信息或者写入数据,使用webservice更方便。

webservice相关介绍参见:https://developercenter.robotstudio.com/api/rwsApi/

例如,希望在c++获取当前机器人位置,可以使用以下代码:

#include <iostream>  #include <string>  #include <curl/curl.h>  #include <nlohmann/json.hpp>  
// 便于JSON库的使用 using json = nlohmann::json;
// 回调函数,用于接收libcurl的数据 size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp){ ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}
int main(){ CURL* curl; CURLcode res;
// 初始化libcurl curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init();
if (curl) { std::string readBuffer;
// 设置URL std::string url = "http://127.0.0.1/rw/motionsystem ... arget/?json=1"; // 替换为实际的URL
// 设置用户名和密码 std::string userpwd = "Default User:robotics";
// 设置Digest认证 struct curl_slist* headers = NULL; // 我们将设置用户名和密码,并告诉libcurl使用Digest认证。 curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_easy_setopt(curl, CURLOPT_USERPWD, userpwd.c_str());
// 设置URL curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
// 设置回调函数以接收数据 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
// 如果服务器返回401(需要认证),libcurl会自动尝试使用提供的用户名和密码进行Digest认证。
// 执行请求 res = curl_easy_perform(curl);
// 检查请求是否成功 if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { // 解析返回的JSON数据 try { json j = json::parse(readBuffer); // 输出解析后的JSON数据 json state = j["_embedded"]["_state"][0];                //// 获取并显示x, y, z, q1, q2, q3, q4数据   std::string x = state["x"]; std::string y = state["y"]; std::string z = state["z"]; std::string q1 = state["q1"]; std::string q2 = state["q2"]; std::string q3 = state["q3"]; std::string q4 = state["q4"];
Quaternion q; q.w = std::stod(q1); q.x = std::stod(q2); q.y = std::stod(q3);                q.z = std::stod(q4); EulerAngles angles = ToEulerAngles(q);
std::cout << "机器人位置:" << std::endl; std::cout << "x: " << x << ", y: " << y << ", z: " << z << std::endl; std::cout << "rz: " << angles.yaw << ", ry: " << angles.pitch << ", rx: " <<angles.roll << std::endl; std::cout << "q1: " << q1 << ", q2: " << q2 << ", q3: " << q3 << ", q4: " << q4 << std::endl; } catch (const json::parse_error& e) { std::cerr << "Error parsing JSON: " << e.what() << std::endl; } }
// 清理 curl_slist_free_all(headers); // 如果我们使用了自定义的headers,则需要释放它们(但在本例中我们没有真正使用自定义的Digest头部) curl_easy_cleanup(curl); }
// 全局清理 curl_global_cleanup();
return 0;}
struct Quaternion { double w, x, y, z;};
struct EulerAngles { double roll, pitch, yaw;};//欧拉角转化四元数Quaternion ToQuaternion(double yaw, double pitch, double roll) // yaw (Z), pitch (Y), roll (X){ double cy = cos(yaw * 0.5); double sy = sin(yaw * 0.5); double cp = cos(pitch * 0.5); double sp = sin(pitch * 0.5); double cr = cos(roll * 0.5); double sr = sin(roll * 0.5); Quaternion q; q.w = cy * cp * cr + sy * sp * sr; q.x = cy * cp * sr - sy * sp * cr; q.y = sy * cp * sr + cy * sp * cr; q.z = sy * cp * cr - cy * sp * sr; return q;}//四元数转化为欧拉角EulerAngles ToEulerAngles(Quaternion q) { EulerAngles angles; double M_PI = 3.14159265;
// roll (x-axis rotation) double sinr_cosp = 2 * (q.w * q.x + q.y * q.z); double cosr_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); angles.roll = std::atan2(sinr_cosp, cosr_cosp)/ M_PI * 180;
// pitch (y-axis rotation) double sinp = 2 * (q.w * q.y - q.z * q.x); if (std::abs(sinp) >= 1) angles.pitch = std::copysign(M_PI / 2, sinp)/ M_PI * 180; // use 90 degrees if out of range else angles.pitch = std::asin(sinp)/M_PI * 180;
// yaw (z-axis rotation) double siny_cosp = 2 * (q.w * q.z + q.x * q.y); double cosy_cosp = 1 - 2 * (q.y * q.y + q.z * q.z); angles.yaw = std::atan2(siny_cosp, cosy_cosp)/M_PI*180;
return angles;}

********************************

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则