47 lines
1.7 KiB
C++
47 lines
1.7 KiB
C++
#include <iostream>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <grpcpp/grpcpp.h>
|
|
// 包含刚才手动翻译出的头文件
|
|
#include "agv_calib_control.grpc.pb.h"
|
|
|
|
using namespace agv::calibration::control;
|
|
|
|
// 继承并实现定义在 .proto 里的服务契约
|
|
class AgvCalibServiceImpl final : public AgvCalibControlService::Service {
|
|
|
|
// 覆盖接管控制权的方法
|
|
grpc::Status SetControlMode(grpc::ServerContext* context,
|
|
const ModeRequest* request,
|
|
StandardResponse* reply) override {
|
|
|
|
if (request->target_mode() == ModeRequest::OPEN_LOOP_MODE) {
|
|
std::cout << "\n[Windows底层] 收到 Linux 指令: 进入开环提线木偶模式" << std::endl;
|
|
// TODO: 在这里调用 Windows 原有的底盘驱动 DLL 或 CAN 接口,切断避障算法
|
|
|
|
reply->set_success(true);
|
|
reply->set_message("Windows 已交出控制权,避障与运动学逆解已关闭");
|
|
}
|
|
return grpc::Status::OK;
|
|
}
|
|
// TODO: 接着 override 实现 ExecuteOpenLoopCmd 等其他函数...
|
|
};
|
|
|
|
void RunServer() {
|
|
// 🚨 关键排雷:必须绑定 0.0.0.0,千万不要写 localhost 或 127.0.0.1,否则 ROS2 连不上!
|
|
std::string server_address("0.0.0.0:50051");
|
|
AgvCalibServiceImpl service;
|
|
|
|
grpc::ServerBuilder builder;
|
|
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
|
|
builder.RegisterService(&service);
|
|
|
|
std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
|
|
std::cout << "🚀 Windows 车端 gRPC 代理已启动,监听外部请求: " << server_address << std::endl;
|
|
server->Wait();
|
|
}
|
|
|
|
int main() {
|
|
RunServer();
|
|
return 0;
|
|
} |