Skip to content

Commit 5bdf957

Browse files
committed
Merge branch 'master' into run_flaky
2 parents 41f6fa8 + 4616170 commit 5bdf957

3 files changed

Lines changed: 70 additions & 16 deletions

File tree

include/ur_client_library/primary/primary_client.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,20 @@ class PrimaryClient
258258
return consumer_->getConfigurationData();
259259
}
260260

261+
/*!
262+
* \brief Get the latest kinematics info.
263+
*
264+
* The kinematics info contains the controller's calibrated DH parameters: the nominal model
265+
* combined with the per-arm calibration deltas, plus the calibration checksum/status. It
266+
* will be updated in the background. This will always show the latest received kinematics
267+
* info independent of the time that has passed since receiving it. If no kinematics info
268+
* has been received yet, this will return a nullptr.
269+
*/
270+
std::shared_ptr<KinematicsInfo> getKinematicsInfo()
271+
{
272+
return consumer_->getKinematicsInfo();
273+
}
274+
261275
/*!
262276
* \brief Get the Robot type
263277
*

include/ur_client_library/primary/primary_consumer.h

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535

3636
#include <functional>
3737
#include <mutex>
38-
#include <condition_variable>
3938

4039
namespace urcl
4140
{
@@ -89,7 +88,7 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
8988
virtual bool consume(VersionMessage& pkg) override
9089
{
9190
std::scoped_lock lock(version_information_mutex_);
92-
version_information_ = std::make_shared<VersionInformation>();
91+
version_information_ = VersionInformation();
9392
version_information_->major = pkg.major_version_;
9493
version_information_->minor = pkg.minor_version_;
9594
version_information_->bugfix = pkg.svn_version_;
@@ -107,7 +106,8 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
107106
virtual bool consume(KinematicsInfo& pkg) override
108107
{
109108
URCL_LOG_DEBUG("%s", pkg.toString().c_str());
110-
kinematics_info_ = std::make_shared<KinematicsInfo>(pkg);
109+
std::scoped_lock lock(kinematics_info_mutex_);
110+
kinematics_info_ = std::make_unique<KinematicsInfo>(pkg);
111111
return true;
112112
}
113113

@@ -166,22 +166,22 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
166166
{
167167
URCL_LOG_DEBUG("Robot mode is now %s", robotModeString(static_cast<RobotMode>(pkg.robot_mode_)).c_str());
168168
std::scoped_lock lock(robot_mode_mutex_);
169-
robot_mode_ = std::make_shared<RobotModeData>(pkg);
169+
robot_mode_ = std::make_unique<RobotModeData>(pkg);
170170
return true;
171171
}
172172

173173
virtual bool consume(SafetyModeMessage& pkg) override
174174
{
175175
URCL_LOG_DEBUG("Robot safety mode is now %s", safetyModeString(pkg.safety_mode_type_).c_str());
176176
std::scoped_lock lock(safety_mode_mutex_);
177-
safety_mode_ = std::make_shared<SafetyModeMessage>(pkg);
177+
safety_mode_ = std::make_unique<SafetyModeMessage>(pkg);
178178
return true;
179179
}
180180

181181
virtual bool consume(ConfigurationData& pkg) override
182182
{
183183
std::scoped_lock lock(configuration_data_mutex_);
184-
configuration_data_ = std::make_shared<ConfigurationData>(pkg);
184+
configuration_data_ = std::make_unique<ConfigurationData>(pkg);
185185
return true;
186186
}
187187

@@ -203,7 +203,12 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
203203
*/
204204
std::shared_ptr<KinematicsInfo> getKinematicsInfo()
205205
{
206-
return kinematics_info_;
206+
std::scoped_lock lock(kinematics_info_mutex_);
207+
if (kinematics_info_ == nullptr)
208+
{
209+
return nullptr;
210+
}
211+
return std::make_shared<KinematicsInfo>(*kinematics_info_);
207212
}
208213

209214
/*!
@@ -215,7 +220,11 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
215220
std::shared_ptr<RobotModeData> getRobotModeData()
216221
{
217222
std::scoped_lock lock(robot_mode_mutex_);
218-
return robot_mode_;
223+
if (robot_mode_ == nullptr)
224+
{
225+
return nullptr;
226+
}
227+
return std::make_shared<RobotModeData>(*robot_mode_);
219228
}
220229

221230
/*!
@@ -227,7 +236,11 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
227236
std::shared_ptr<SafetyModeMessage> getSafetyModeMessage()
228237
{
229238
std::scoped_lock lock(safety_mode_mutex_);
230-
return safety_mode_;
239+
if (safety_mode_ == nullptr)
240+
{
241+
return nullptr;
242+
}
243+
return std::make_shared<SafetyModeMessage>(*safety_mode_);
231244
}
232245

233246
/*!
@@ -240,7 +253,11 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
240253
std::shared_ptr<VersionInformation> getVersionInformation()
241254
{
242255
std::scoped_lock lock(version_information_mutex_);
243-
return version_information_;
256+
if (!version_information_.has_value())
257+
{
258+
return nullptr;
259+
}
260+
return std::make_shared<VersionInformation>(*version_information_);
244261
}
245262

246263
/*!
@@ -253,20 +270,25 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
253270
std::shared_ptr<ConfigurationData> getConfigurationData()
254271
{
255272
std::scoped_lock lock(configuration_data_mutex_);
256-
return configuration_data_;
273+
if (configuration_data_ == nullptr)
274+
{
275+
return nullptr;
276+
}
277+
return std::make_shared<ConfigurationData>(*configuration_data_);
257278
}
258279

259280
private:
260281
std::function<void(ErrorCode&)> error_code_message_callback_;
261-
std::shared_ptr<KinematicsInfo> kinematics_info_;
282+
std::mutex kinematics_info_mutex_;
283+
std::unique_ptr<KinematicsInfo> kinematics_info_;
262284
std::mutex robot_mode_mutex_;
263-
std::shared_ptr<RobotModeData> robot_mode_;
285+
std::unique_ptr<RobotModeData> robot_mode_;
264286
std::mutex version_information_mutex_;
265-
std::shared_ptr<VersionInformation> version_information_;
266-
std::shared_ptr<ConfigurationData> configuration_data_;
287+
std::optional<VersionInformation> version_information_;
267288
std::mutex configuration_data_mutex_;
289+
std::unique_ptr<ConfigurationData> configuration_data_;
268290
std::mutex safety_mode_mutex_;
269-
std::shared_ptr<SafetyModeMessage> safety_mode_;
291+
std::unique_ptr<SafetyModeMessage> safety_mode_;
270292
};
271293

272294
} // namespace primary_interface

tests/test_primary_client.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,24 @@ TEST_F(PrimaryClientTest, test_configuration_data)
268268
EXPECT_NE(client_->getRobotType(), RobotType::UNDEFINED);
269269
}
270270

271+
TEST_F(PrimaryClientTest, test_kinematics_info)
272+
{
273+
EXPECT_NO_THROW(client_->start());
274+
275+
// Once we connect to the primary client we should receive kinematics info
276+
auto start_time = std::chrono::system_clock::now();
277+
const auto timeout = std::chrono::seconds(1);
278+
auto kinematics_info = client_->getKinematicsInfo();
279+
while (kinematics_info == nullptr && std::chrono::system_clock::now() - start_time < timeout)
280+
{
281+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
282+
kinematics_info = client_->getKinematicsInfo();
283+
}
284+
285+
// We should have received a kinematics info package
286+
EXPECT_NE(kinematics_info, nullptr);
287+
}
288+
271289
TEST_F(PrimaryClientTest, test_get_robot_series)
272290
{
273291
EXPECT_NO_THROW(client_->start());

0 commit comments

Comments
 (0)