1
0
mirror of https://gitlab.com/obbart/universal_robots_ros_driver.git synced 2026-04-10 18:10:47 +02:00

added handling of protocol-version 1 and CB3 robots

This commit is contained in:
Tristan Schnell
2019-04-17 16:53:39 +02:00
parent 736cd36940
commit 9bafd44687
6 changed files with 82 additions and 4 deletions

View File

@@ -57,6 +57,8 @@ public:
static size_t generateSerializedRequest(uint8_t* buffer, double output_frequency, static size_t generateSerializedRequest(uint8_t* buffer, double output_frequency,
std::vector<std::string> variable_names); std::vector<std::string> variable_names);
static size_t generateSerializedRequest(uint8_t* buffer, std::vector<std::string> variable_names);
double output_frequency_; double output_frequency_;
std::string variable_names_; std::string variable_names_;

View File

@@ -54,6 +54,12 @@ class GetUrcontrolVersionRequest : public RTDEPackage
public: public:
GetUrcontrolVersionRequest() = default; GetUrcontrolVersionRequest() = default;
virtual ~GetUrcontrolVersionRequest() = default; virtual ~GetUrcontrolVersionRequest() = default;
static size_t generateSerializedRequest(uint8_t* buffer);
private:
static const uint16_t PAYLOAD_SIZE = 0;
static const PackageType PACKAGE_TYPE = PackageType::RTDE_GET_URCONTROL_VERSION;
}; };
} // namespace rtde_interface } // namespace rtde_interface

View File

@@ -38,6 +38,7 @@
#include "ur_rtde_driver/rtde/request_protocol_version.h" #include "ur_rtde_driver/rtde/request_protocol_version.h"
#include "ur_rtde_driver/rtde/control_package_setup_outputs.h" #include "ur_rtde_driver/rtde/control_package_setup_outputs.h"
#include "ur_rtde_driver/rtde/control_package_start.h" #include "ur_rtde_driver/rtde/control_package_start.h"
#include "ur_rtde_driver/log.h"
static const int UR_RTDE_PORT = 30004; static const int UR_RTDE_PORT = 30004;
static const std::string PIPELINE_NAME = "RTDE Data Pipeline"; static const std::string PIPELINE_NAME = "RTDE Data Pipeline";
@@ -62,6 +63,9 @@ private:
comm::URProducer<PackageHeader> prod_; comm::URProducer<PackageHeader> prod_;
comm::Pipeline<PackageHeader> pipeline_; comm::Pipeline<PackageHeader> pipeline_;
constexpr static const double CB3_MAX_FREQUENCY = 125.0;
constexpr static const double URE_MAX_FREQUENCY = 500.0;
std::vector<std::string> readRecipe(); std::vector<std::string> readRecipe();
}; };

View File

@@ -67,5 +67,26 @@ size_t ControlPackageSetupOutputsRequest::generateSerializedRequest(uint8_t* buf
return size; return size;
} }
size_t ControlPackageSetupOutputsRequest::generateSerializedRequest(uint8_t* buffer,
std::vector<std::string> variable_names)
{
if (variable_names.size() == 0)
{
return 0;
}
std::string variables;
for (const auto& piece : variable_names)
variables += (piece + ",");
variables.pop_back();
uint16_t payload_size = sizeof(double) + variables.size();
size_t size = 0;
size += PackageHeader::serializeHeader(buffer, PACKAGE_TYPE, payload_size);
size += comm::PackageSerializer::serialize(buffer + size, variables);
return size;
}
} // namespace rtde_interface } // namespace rtde_interface
} // namespace ur_driver } // namespace ur_driver

View File

@@ -48,5 +48,10 @@ std::string GetUrcontrolVersion::toString() const
return ss.str(); return ss.str();
} }
size_t GetUrcontrolVersionRequest::generateSerializedRequest(uint8_t* buffer)
{
return PackageHeader::serializeHeader(buffer, PACKAGE_TYPE, PAYLOAD_SIZE);
}
} // namespace rtde_interface } // namespace rtde_interface
} // namespace ur_driver } // namespace ur_driver

View File

@@ -45,12 +45,50 @@ bool RTDEClient::init()
uint8_t buffer[4096]; uint8_t buffer[4096];
size_t size; size_t size;
size_t written; size_t written;
size = RequestProtocolVersionRequest::generateSerializedRequest(buffer, 2); // negotiate version
uint16_t protocol_version = 2;
size = RequestProtocolVersionRequest::generateSerializedRequest(buffer, protocol_version);
stream_.write(buffer, size, written); stream_.write(buffer, size, written);
std::unique_ptr<comm::URPackage<PackageHeader>> package; std::unique_ptr<comm::URPackage<PackageHeader>> package;
pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000)); pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000));
size = ControlPackageSetupOutputsRequest::generateSerializedRequest(buffer, 500.0, readRecipe()); rtde_interface::RequestProtocolVersion* tmp_version =
dynamic_cast<rtde_interface::RequestProtocolVersion*>(package.get());
if (!tmp_version->accepted_)
{
protocol_version = 1;
size = RequestProtocolVersionRequest::generateSerializedRequest(buffer, protocol_version);
stream_.write(buffer, size, written);
pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000));
tmp_version = dynamic_cast<rtde_interface::RequestProtocolVersion*>(package.get());
if (!tmp_version->accepted_)
{
LOG_ERROR("Could not negotiate protocol version");
return false;
}
}
// determine maximum frequency from ur-control version
double max_frequency = URE_MAX_FREQUENCY;
size = GetUrcontrolVersionRequest::generateSerializedRequest(buffer);
stream_.write(buffer, size, written);
pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000));
rtde_interface::GetUrcontrolVersion* tmp_control_version =
dynamic_cast<rtde_interface::GetUrcontrolVersion*>(package.get());
if (tmp_control_version->major_ < 5)
{
max_frequency = CB3_MAX_FREQUENCY;
}
// sending output recipe
LOG_INFO("Setting up RTDE communication with frequency %f", max_frequency);
if (protocol_version == 2)
{
size = ControlPackageSetupOutputsRequest::generateSerializedRequest(buffer, max_frequency, readRecipe());
}
else
{
size = ControlPackageSetupOutputsRequest::generateSerializedRequest(buffer, readRecipe());
}
stream_.write(buffer, size, written); stream_.write(buffer, size, written);
return pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000)); return pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000));
} }
@@ -62,7 +100,9 @@ bool RTDEClient::start()
size = ControlPackageStartRequest::generateSerializedRequest(buffer); size = ControlPackageStartRequest::generateSerializedRequest(buffer);
std::unique_ptr<comm::URPackage<PackageHeader>> package; std::unique_ptr<comm::URPackage<PackageHeader>> package;
stream_.write(buffer, size, written); stream_.write(buffer, size, written);
return pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000)); pipeline_.getLatestProduct(package, std::chrono::milliseconds(1000));
rtde_interface::ControlPackageStart* tmp = dynamic_cast<rtde_interface::ControlPackageStart*>(package.get());
return tmp->accepted_;
} }
std::vector<std::string> RTDEClient::readRecipe() std::vector<std::string> RTDEClient::readRecipe()
{ {