Add the UME RobotArm and Damiao CAN-FD path, migrate the legacy UME controller, and introduce guarded cross-machine gRPC teleoperation with lifecycle, authority, configuration, and test coverage.
134 lines
5.2 KiB
C++
134 lines
5.2 KiB
C++
#ifndef CMVR_ES_ROBOT_ARM_H
|
|
#define CMVR_ES_ROBOT_ARM_H
|
|
|
|
#include <cstddef>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "algorithms/kinematics/ik_solver/common/include/ik_solver.h"
|
|
#include "common/types/arm/arm_types.h"
|
|
#include "devices/abstract_device.h"
|
|
|
|
namespace cmvr::device {
|
|
|
|
class RobotArm : public AbstractDevice {
|
|
public:
|
|
~RobotArm() override = default;
|
|
|
|
DeviceKind kind() const noexcept override { return DeviceKind::Arm; }
|
|
|
|
virtual RobotModel getRobotModel() const = 0;
|
|
virtual std::size_t getDof() const = 0;
|
|
virtual ArmState getRobotState() const = 0;
|
|
virtual JointGroupState getJointState() const = 0;
|
|
virtual CartesianPose getTcpPose(FrameType frame = FrameType::Base) const = 0;
|
|
virtual RobotMode getRobotMode() const = 0;
|
|
virtual SafetyMode getSafetyMode() const = 0;
|
|
virtual ControlMode getControlMode() const = 0;
|
|
|
|
// ArmTeleop requires an explicitly reviewed group-servo implementation.
|
|
// Existing and vendor arms remain unavailable until their implementations
|
|
// override this capability after timing and partial-write validation.
|
|
virtual bool supportsTeleopGroupServo() const noexcept { return false; }
|
|
virtual JointEffortSource jointEffortSource() const noexcept
|
|
{
|
|
return JointEffortSource::Unspecified;
|
|
}
|
|
|
|
virtual Result torqueOn() = 0;
|
|
virtual Result torqueOff() = 0;
|
|
virtual Result calibrateZeroQ(const std::string& joint_name) = 0;
|
|
|
|
virtual Result emergencyStop() = 0;
|
|
virtual Result protectiveStop() = 0;
|
|
virtual Result setSpeedScaling(double scaling) = 0;
|
|
virtual double getSpeedScaling() const = 0;
|
|
virtual bool isProtectiveStopped() const = 0;
|
|
virtual bool isEmergencyStopped() const = 0;
|
|
virtual bool isFault() const = 0;
|
|
|
|
virtual Result moveJ(const JointPositionCommand& target,
|
|
const MotionOptions& options) = 0;
|
|
virtual Result speedJ(const JointVelocityCommand& velocity,
|
|
double acceleration,
|
|
double duration) = 0;
|
|
virtual Result stopJ(double acceleration) = 0;
|
|
|
|
virtual Result moveL(const CartesianPose& target,
|
|
const MotionOptions& options,
|
|
FrameType frame = FrameType::Base) = 0;
|
|
virtual Result speedL(const CartesianVelocity& velocity,
|
|
double acceleration,
|
|
double duration,
|
|
FrameType frame = FrameType::Base) = 0;
|
|
virtual Result stopL(std::optional<double> acceleration = std::nullopt) = 0;
|
|
virtual Result stopMotion() = 0;
|
|
|
|
virtual Result moveP(const CartesianPose& target,
|
|
const MotionOptions& options,
|
|
FrameType frame = FrameType::Base)
|
|
{
|
|
return moveL(target, options, frame);
|
|
}
|
|
|
|
virtual Result startServoMode(const ServoOptions& options) = 0;
|
|
virtual Result servoJ(const JointPositionCommand& target) = 0;
|
|
virtual Result servoL(const CartesianPose& target,
|
|
FrameType frame = FrameType::Base) = 0;
|
|
virtual Result servoSpeedJ(const JointVelocityCommand& velocity) = 0;
|
|
virtual Result servoSpeedL(const CartesianVelocity& velocity,
|
|
FrameType frame = FrameType::Base) = 0;
|
|
virtual Result stopServoMode() = 0;
|
|
|
|
// Torque streaming is optional. Backends which do not provide an atomic
|
|
// group torque port retain source compatibility and fail explicitly.
|
|
virtual Result startTorqueMode(const TorqueServoOptions&)
|
|
{
|
|
return Result::failure(
|
|
ArmErrorCode::UnsupportedCommand,
|
|
"torque servo mode is unsupported by this RobotArm");
|
|
}
|
|
virtual Result servoTorque(const JointTorqueCommand&)
|
|
{
|
|
return Result::failure(
|
|
ArmErrorCode::UnsupportedCommand,
|
|
"torque servo command is unsupported by this RobotArm");
|
|
}
|
|
virtual Result stopTorqueMode()
|
|
{
|
|
return Result::failure(
|
|
ArmErrorCode::UnsupportedCommand,
|
|
"torque servo mode is unsupported by this RobotArm");
|
|
}
|
|
|
|
virtual Result connect(const std::string& ip, int port) = 0;
|
|
virtual Result disconnect() = 0;
|
|
virtual bool isConnected() const = 0;
|
|
virtual Result powerOn() = 0;
|
|
virtual Result powerOff() = 0;
|
|
virtual Result brakeRelease() = 0;
|
|
virtual Result shutdown() = 0;
|
|
virtual Result clearFault() = 0;
|
|
virtual Result unlockProtectiveStop() = 0;
|
|
virtual Result loadProgram(const std::string& program_name) = 0;
|
|
virtual Result playProgram() = 0;
|
|
virtual Result pauseProgram() = 0;
|
|
virtual Result stopProgram() = 0;
|
|
|
|
virtual std::vector<double> ik(const std::string& base_link,
|
|
const std::string& ee_link,
|
|
const CartesianPose& pose) = 0;
|
|
virtual std::shared_ptr<cmvr::IKSolver> kinematicsSolver() const = 0;
|
|
virtual CartesianPose fk(const std::string& base_link,
|
|
const std::string& ee_link) = 0;
|
|
virtual CartesianPose fk(bool is_tcp = true) = 0;
|
|
virtual CartesianVelocity getSpeedLCommandTwistBase() const = 0;
|
|
virtual bool busy() const = 0;
|
|
};
|
|
|
|
} // namespace cmvr::device
|
|
|
|
#endif // CMVR_ES_ROBOT_ARM_H
|