143 lines
5.4 KiB
C++
143 lines
5.4 KiB
C++
//
|
|
// Created by cmvr on 2026/6/29.
|
|
//
|
|
|
|
#ifndef CMVR_ES_HUAYAN_ARM_H
|
|
#define CMVR_ES_HUAYAN_ARM_H
|
|
|
|
#ifndef CMVR_ES_HUAYAN_ROBOT_H
|
|
#define CMVR_ES_HUAYAN_ROBOT_H
|
|
|
|
#include <atomic>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "cmvr/config/arm_config/arm_config.pb.h"
|
|
#include "devices/arm/robot_arm.h"
|
|
|
|
namespace cmvr::device {
|
|
|
|
class HuayanRobot final : public RobotArm {
|
|
public:
|
|
explicit HuayanRobot(const config::RobotArmConfig& cfg);
|
|
~HuayanRobot() override;
|
|
|
|
std::string typeName() const override { return "HuayanRobot"; }
|
|
bool init() override;
|
|
bool stop() override;
|
|
|
|
RobotModel getRobotModel() const override { return model_; }
|
|
std::size_t getDof() const override { return model_.dof; }
|
|
ArmState getRobotState() const override;
|
|
JointGroupState getJointState() const override;
|
|
CartesianPose getTcpPose(FrameType frame = FrameType::Base) const override;
|
|
RobotMode getRobotMode() const override;
|
|
SafetyMode getSafetyMode() const override;
|
|
ControlMode getControlMode() const override { return servo_mode_.load() ? ControlMode::Servo : ControlMode::Position; }
|
|
|
|
Result torqueOn() override;
|
|
Result torqueOff() override;
|
|
Result calibrateZeroQ(const std::string& joint_name) override;
|
|
Result emergencyStop() override;
|
|
Result protectiveStop() override { return emergencyStop(); }
|
|
Result setSpeedScaling(double scaling) override;
|
|
double getSpeedScaling() const override { return speed_scaling_; }
|
|
bool isProtectiveStopped() const override;
|
|
bool isEmergencyStopped() const override;
|
|
bool isFault() const override;
|
|
|
|
Result moveJ(const JointPositionCommand& target, const MotionOptions& options) override;
|
|
Result speedJ(const JointVelocityCommand& velocity, double acceleration, double duration) override;
|
|
Result stopJ(double acceleration) override;
|
|
Result moveL(const CartesianPose& target, const MotionOptions& options, FrameType frame = FrameType::Base) override;
|
|
Result speedL(const CartesianVelocity& velocity, double acceleration, double duration, FrameType frame = FrameType::Base) override;
|
|
Result stopL(double acceleration) override;
|
|
Result stopMotion() override;
|
|
|
|
Result startServoMode(const ServoOptions& options) override;
|
|
Result servoJ(const JointPositionCommand& target) override;
|
|
Result servoL(const CartesianPose& target, FrameType frame = FrameType::Base) override;
|
|
Result servoSpeedJ(const JointVelocityCommand& velocity) override;
|
|
Result servoSpeedL(const CartesianVelocity& velocity, FrameType frame = FrameType::Base) override;
|
|
Result stopServoMode() override;
|
|
|
|
Result connect(const std::string& ip, int port) override;
|
|
Result disconnect() override;
|
|
bool isConnected() const override;
|
|
Result powerOn() override { return torqueOn(); }
|
|
Result powerOff() override { return torqueOff(); }
|
|
Result brakeRelease() override { return torqueOn(); }
|
|
Result shutdown() override;
|
|
Result clearFault() override;
|
|
Result unlockProtectiveStop() override { return clearFault(); }
|
|
Result loadProgram(const std::string& program_name) override;
|
|
Result playProgram() override;
|
|
Result pauseProgram() override;
|
|
Result stopProgram() override;
|
|
|
|
std::vector<double> ik(const std::string& base_link,
|
|
const std::string& ee_link,
|
|
const CartesianPose& pose) override;
|
|
std::shared_ptr<cmvr::IKSolver> kinematicsSolver() const override { return nullptr; }
|
|
CartesianPose fk(const std::string& base_link, const std::string& ee_link) override;
|
|
CartesianPose fk(bool is_tcp = true) override;
|
|
CartesianVelocity getSpeedLCommandTwistBase() const override;
|
|
bool busy() const override { return busy_.load(); }
|
|
|
|
private:
|
|
struct HrState {
|
|
int moving{0};
|
|
int enabled{0};
|
|
int error{0};
|
|
int error_code{0};
|
|
int error_axis{0};
|
|
int brake{0};
|
|
int paused{0};
|
|
int emergency_stop{0};
|
|
int safeguard{0};
|
|
int electrified{0};
|
|
int connected_to_box{0};
|
|
int blending_done{0};
|
|
int in_pos{0};
|
|
bool valid{false};
|
|
};
|
|
|
|
Result ensureConnected_(const std::string& context) const;
|
|
Result unsupported_(const std::string& name) const;
|
|
Result hrResult_(int code, const std::string& context) const;
|
|
bool validDof_(std::size_t size, std::string& error) const;
|
|
HrState readHrState_() const;
|
|
std::vector<double> readJointPositionRad_() const;
|
|
std::vector<double> readJointVelocityRad_() const;
|
|
CartesianPose readTcpPose_() const;
|
|
CartesianVelocity readTcpVelocity_() const;
|
|
std::vector<double> currentJointPositionDeg_() const;
|
|
std::string nextCommandId_() const;
|
|
Result waitMotionDone_(const std::string& context, int timeout_ms) const;
|
|
|
|
private:
|
|
config::RobotArmConfig cfg_;
|
|
config::VendorRobotArmBackendConfig vendor_cfg_;
|
|
RobotModel model_;
|
|
std::string ip_;
|
|
int port_{10003};
|
|
unsigned int box_id_{0};
|
|
unsigned int robot_id_{0};
|
|
std::string tcp_name_{"TCP"};
|
|
std::string ucs_name_{"Base"};
|
|
double speed_scaling_{1.0};
|
|
std::atomic<bool> connected_{false};
|
|
std::atomic<bool> busy_{false};
|
|
std::atomic<bool> servo_mode_{false};
|
|
mutable std::mutex mutex_;
|
|
mutable std::atomic<unsigned long long> command_seq_{0};
|
|
};
|
|
|
|
} // namespace cmvr::device
|
|
|
|
#endif // CMVR_ES_HUAYAN_ROBOT_H
|
|
|
|
|
|
#endif //CMVR_ES_HUAYAN_ARM_H
|