cmvr-es/cmvr-es/devices/arm/robot_arm.h
xtkuang af67751937 feat: add safe UME teleoperation framework
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.
2026-07-31 08:48:04 +08:00

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