10 #include <mrpt/core/lock_helper.h>
13 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
14 #include <mvsim/mvsim-msgs/GenericAnswer.pb.h>
15 #include <mvsim/mvsim-msgs/SrvGetPose.pb.h>
16 #include <mvsim/mvsim-msgs/SrvGetPoseAnswer.pb.h>
17 #include <mvsim/mvsim-msgs/SrvSetControllerTwist.pb.h>
18 #include <mvsim/mvsim-msgs/SrvSetControllerTwistAnswer.pb.h>
19 #include <mvsim/mvsim-msgs/SrvSetPose.pb.h>
20 #include <mvsim/mvsim-msgs/SrvSetPoseAnswer.pb.h>
21 #include <mvsim/mvsim-msgs/SrvShutdown.pb.h>
22 #include <mvsim/mvsim-msgs/SrvShutdownAnswer.pb.h>
27 using namespace mvsim;
29 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
31 mvsim_msgs::SrvSetPoseAnswer World::srv_set_pose(
const mvsim_msgs::SrvSetPose& req)
33 mvsim_msgs::SrvSetPoseAnswer ans;
34 ans.set_objectisincollision(
false);
36 const auto sId = req.objectid();
41 if (req.has_relativeincrement() && req.relativeincrement())
43 auto p = mrpt::poses::CPose3D(itV->second->getPose());
44 p = p + mrpt::poses::CPose3D(
45 req.pose().x(), req.pose().y(), req.pose().z(), req.pose().yaw(),
46 req.pose().pitch(), req.pose().roll());
47 itV->second->setPose(p.asTPose());
49 auto* absPose = ans.mutable_objectglobalpose();
50 absPose->set_x(p.x());
51 absPose->set_y(p.y());
52 absPose->set_z(p.z());
53 absPose->set_yaw(p.yaw());
54 absPose->set_pitch(p.pitch());
55 absPose->set_roll(p.roll());
60 {req.pose().x(), req.pose().y(), req.pose().z(), req.pose().yaw(),
61 req.pose().pitch(), req.pose().roll()});
63 ans.set_success(
true);
64 ans.set_objectisincollision(itV->second->hadCollision());
65 itV->second->resetCollisionFlag();
69 ans.set_success(
false);
74 mvsim_msgs::SrvGetPoseAnswer World::srv_get_pose(
const mvsim_msgs::SrvGetPose& req)
78 mvsim_msgs::SrvGetPoseAnswer ans;
79 const auto sId = req.objectid();
80 ans.set_objectisincollision(
false);
85 ans.set_success(
true);
86 const mrpt::math::TPose3D p = itV->second;
87 auto* po = ans.mutable_pose();
92 po->set_pitch(p.pitch);
96 auto* tw = ans.mutable_twist();
108 ans.set_success(
false);
120 mvsim_msgs::SrvSetControllerTwistAnswer World::srv_set_controller_twist(
121 const mvsim_msgs::SrvSetControllerTwist& req)
125 mvsim_msgs::SrvSetControllerTwistAnswer ans;
126 ans.set_success(
false);
128 const auto sId = req.objectid();
135 ans.set_errormessage(
"objectId not found");
139 auto veh = std::dynamic_pointer_cast<VehicleBase>(itV->second);
142 ans.set_errormessage(
"objectId is not of VehicleBase type");
149 ans.set_errormessage(
"objectId vehicle seems not to have any controller");
153 const mrpt::math::TTwist2D
t(
154 req.twistsetpoint().vx(), req.twistsetpoint().vy(), req.twistsetpoint().wz());
157 if (!ctrlAcceptTwist)
159 ans.set_errormessage(
160 "objectId vehicle controller did not accept the twist "
165 ans.set_success(
true);
169 mvsim_msgs::SrvShutdownAnswer World::srv_shutdown(
170 [[maybe_unused]]
const mvsim_msgs::SrvShutdown& req)
172 mvsim_msgs::SrvShutdownAnswer ans;
173 ans.set_accepted(
true);
180 #endif // MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
184 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
186 client_.advertiseService<mvsim_msgs::SrvSetPose, mvsim_msgs::SrvSetPoseAnswer>(
187 "set_pose", [
this](
const auto& req) {
return srv_set_pose(req); });
189 client_.advertiseService<mvsim_msgs::SrvGetPose, mvsim_msgs::SrvGetPoseAnswer>(
190 "get_pose", [
this](
const auto& req) {
return srv_get_pose(req); });
192 client_.advertiseService<
193 mvsim_msgs::SrvSetControllerTwist, mvsim_msgs::SrvSetControllerTwistAnswer>(
194 "set_controller_twist", [
this](
const auto& req) {
return srv_set_controller_twist(req); });
196 client_.advertiseService<mvsim_msgs::SrvShutdown, mvsim_msgs::SrvShutdownAnswer>(
197 "shutdown", [
this](
const auto& req) {
return srv_shutdown(req); });