10 #include <mrpt/core/exceptions.h> 11 #include <mrpt/math/distributions.h> 12 #include <mrpt/math/ops_containers.h> 13 #include <mrpt/system/datetime.h> 15 #include <mvsim/mvsim-msgs/ObservationLidar2D.pb.h> 16 #include <mvsim/mvsim-msgs/TimeStampedPose.pb.h> 33 const auto& lstCmds =
cli->argCmd.getValue();
35 if (lstCmds.size() != 2 && lstCmds.size() != 3)
39 const std::string subcommand = lstCmds.at(1);
45 return (itSubcmd->second)();
54 client.setMinLoggingLevel(
55 mrpt::typemeta::TEnumType<mrpt::system::VerbosityLevel>::name2value(
56 cli->argVerbosity.getValue()));
58 std::cout <<
"# Connecting to server...\n";
60 std::cout <<
"# Connected.\n";
61 std::cout <<
"# Querying list of topics to server...\n";
64 std::cout <<
"# Done. Found " << lstTopics.size() <<
" topics:\n";
66 for (
const auto& n : lstTopics)
68 if (
cli->argDetails.isSet())
70 std::cout <<
"- name: \"" << n.name <<
"\"\n" 71 <<
" type: \"" << n.type <<
"\"\n" 74 ASSERT_EQUAL_(n.endpoints.size(), n.publishers.size());
76 for (
size_t i = 0; i < n.endpoints.size(); i++)
78 std::cout <<
" - endpoint: \"" << n.endpoints[i] <<
"\"\n" 79 <<
" - publisherNode: \"" << n.publishers[i]
85 std::cout << n.name <<
" [" << n.type <<
"] from node ";
86 if (n.publishers.size() != 1)
87 std::cout << n.publishers.size() <<
" publishers.\n";
89 std::cout << n.publishers.at(0) <<
"\n";
97 mvsim_msgs::TimeStampedPose out;
98 if (
bool ok = out.ParseFromString(data); !
ok)
100 std::cerr <<
"ERROR: Protobuf could not parse message.\n";
103 out.PrintDebugString();
107 mvsim_msgs::ObservationLidar2D out;
108 if (
bool ok = out.ParseFromString(data); !
ok)
110 std::cerr <<
"ERROR: Protobuf could not parse message.\n";
113 out.PrintDebugString();
118 const auto [typeName, serializedData] =
119 mvsim::internal::parseMessageToParts(msg);
120 std::cout <<
"[" << mrpt::system::dateTimeLocalToString(mrpt::Clock::now())
121 <<
"] Received data : \n";
122 std::cout <<
" - typeName: " << typeName <<
"\n";
123 std::cout <<
" - data: " << serializedData.size() <<
" bytes\n";
125 if (typeName == mvsim_msgs::TimeStampedPose().GetTypeName())
127 else if (typeName == mvsim_msgs::ObservationLidar2D().GetTypeName())
130 std::cout << std::endl;
137 client.setMinLoggingLevel(
138 mrpt::typemeta::TEnumType<mrpt::system::VerbosityLevel>::name2value(
139 cli->argVerbosity.getValue()));
141 const auto& lstCmds =
cli->argCmd.getValue();
144 const auto& topicName = lstCmds.at(2);
146 std::cout <<
"# Connecting to server...\n";
148 std::cout <<
"# Connected.\n";
150 std::cout <<
"# Subscribing to topic '" << topicName
151 <<
"'. Press CTRL+C to stop.\n";
166 client.setMinLoggingLevel(
167 mrpt::typemeta::TEnumType<mrpt::system::VerbosityLevel>::name2value(
168 cli->argVerbosity.getValue()));
170 const auto& lstCmds =
cli->argCmd.getValue();
173 const auto& topicName = lstCmds.at(2);
175 std::cout <<
"# Connecting to server...\n";
177 std::cout <<
"# Connected.\n";
179 const double WAIT_SECONDS = 5.0;
181 std::cout <<
"# Subscribing to topic '" << topicName
182 <<
"'. Will listen for " << WAIT_SECONDS <<
" seconds...\n";
185 std::optional<double> lastMsgTim;
186 std::vector<double> measuredPeriods;
190 const double t = mrpt::Clock::nowDouble();
193 const double dt = t - lastMsgTim.value();
194 measuredPeriods.push_back(dt);
199 std::this_thread::sleep_for(
200 std::chrono::milliseconds(static_cast<size_t>(WAIT_SECONDS * 1000)));
202 const double rate = numMsgs / WAIT_SECONDS;
204 std::cout << std::endl;
205 std::cout <<
"- ReceivedMsgs: " << numMsgs << std::endl;
206 std::cout <<
"- Rate: " << rate <<
" # Hz" << std::endl;
210 double periodMean = 0, periodStd = 0;
211 mrpt::math::meanAndStd(measuredPeriods, periodMean, periodStd);
213 std::cout <<
"- MeanPeriod: " << periodMean
214 <<
" # [sec] 1/T = " << 1.0 / periodMean <<
" Hz" 217 std::cout <<
"- PeriodStdDev: " << periodStd <<
" # [sec]" << std::endl;
219 double periodMin = 0, periodMax = 0;
220 mrpt::math::minimum_maximum(measuredPeriods, periodMin, periodMax);
222 std::cout <<
"- PeriodMin: " << periodMin <<
" # [sec]" << std::endl;
223 std::cout <<
"- PeriodMax: " << periodMax <<
" # [sec]" << std::endl;
225 const double conf = 0.05;
226 double tMean, tLow, tHigh;
228 mrpt::math::CVectorDouble x;
229 for (
size_t i = 0; i < measuredPeriods.size(); i++)
230 x.push_back(measuredPeriods[i]);
232 mrpt::math::confidenceIntervals(x, tMean, tLow, tHigh, conf, 100);
234 std::cout <<
"- Period_05percent: " << tLow <<
" # [sec]" << std::endl;
235 std::cout <<
"- Period_95percent: " << tHigh <<
" # [sec]" << std::endl;
246 std::cerr <<
"Error: missing or unknown subcommand.\n";
254 mvsim topic --help Show this help 255 mvsim topic list [--details] List all advertised topics in the server 256 mvsim topic echo <topicName> Subscribe and print a topic 257 mvsim topic hz <topicName> Estimate topic publication rate (in Hz) 261 return showErrorMsg ? 1 : 0;
const std::map< std::string, cmd_t > cliTopicCommands
std::function< int(void)> cmd_t
static int printCommandsTopic(bool showErrorMsg)
void setConsoleErrorColor()
static void echo_ObservationLidar2D(const std::string &data)
geometry_msgs::TransformStamped t
std::vector< InfoPerTopic > requestListOfTopics()
static void callbackSubscribeTopicGeneric(const zmq::message_t &msg)
static void echo_TimeStampedPose(const std::string &data)
std::unique_ptr< cli_flags > cli
void setConsoleNormalColor()
void subscribe_topic_raw(const std::string &topicName, const topic_callback_t &callback)