rby1-sdk
Loading...
Searching...
No Matches
dynamixel_bus.h
1#pragma once
2
3#include <memory>
4#include <optional>
5#include <string>
6#include <vector>
7
8#include "rby1-sdk/export.h"
9
10namespace rb {
11
12class DynamixelBusImpl;
13
14class RBY1_SDK_API DynamixelBus {
15 public:
16 static constexpr float kProtocolVersion = 2.0;
17
18 static constexpr int kDefaultBaudrate = 2000000;
19
20 static constexpr uint16_t kAddrTorqueEnable = 64;
21 static constexpr uint16_t kAddrPresentCurrent = 126;
22 static constexpr uint16_t kAddrPresentVelocity = 128;
23 static constexpr uint16_t kAddrPresentPosition = 132;
24 static constexpr uint16_t kAddrGoalCurrent = 102;
25 static constexpr uint16_t kAddrGoalPosition = 116;
26 static constexpr uint16_t kAddrOperatingMode = 11;
27 static constexpr uint16_t kAddrPresentButtonState = 132;
28 static constexpr uint16_t kAddrGoalVibrationLevel = 102;
29
30 static constexpr uint16_t kAddrPositionPGain = 84;
31 static constexpr uint16_t kAddrPositionIGain = 82;
32 static constexpr uint16_t kAddrPositionDGain = 80;
33
34 static constexpr int kTorqueEnable = 1;
35 static constexpr int kTorqueDisable = 0;
36
37 static constexpr int kCurrentControlMode = 0;
38 static constexpr int kCurrentBasedPositionControlMode = 5;
39
40 static constexpr int kAddrCurrentTemperature = 146;
41
42 struct ButtonState { // RB Gripper
43 int button;
44 int trigger;
45 };
46
47 struct MotorState {
48 bool torque_enable;
49
50 double position;
51 double velocity;
52 double current;
53 double torque;
54
55 int temperature;
56 };
57
58 struct PIDGain {
59 uint16_t p_gain;
60 uint16_t i_gain;
61 uint16_t d_gain;
62 };
63
64 explicit DynamixelBus(const std::string& dev_name);
65
67
68 void SetTorqueConstant(const std::vector<double>& torque_constant);
69
70 bool OpenPort();
71
72 bool SetBaudRate(int baudrate);
73
74 bool Ping(int id);
75
76 std::optional<std::pair<int /* id */, ButtonState>> ReadButtonStatus(int id);
77
78 void SendTorqueEnable(int id, int onoff);
79
80 void SetPositionPGain(int id, uint16_t p_gain);
81
82 void SetPositionIGain(int id, uint16_t i_gain);
83
84 void SetPositionDGain(int id, uint16_t d_gain);
85
86 void SetPositionPIDGain(int id, std::optional<uint16_t> p_gain, std::optional<uint16_t> i_gain,
87 std::optional<uint16_t> d_gain);
88
89 void SetPositionPIDGain(int id, uint16_t p_gain, uint16_t i_gain, uint16_t d_gain);
90
91 void SetPositionPIDGain(int id, const DynamixelBus::PIDGain& pid_gain);
92
93 std::optional<uint16_t> GetPositionPGain(int id);
94
95 std::optional<uint16_t> GetPositionIGain(int id);
96
97 std::optional<uint16_t> GetPositionDGain(int id);
98
99 std::optional<DynamixelBus::PIDGain> GetPositionPIDGain(int id);
100
101 std::optional<int> ReadTorqueEnable(int id);
102
103 std::optional<double> ReadEncoder(int id);
104
105 void SendGoalPosition(int id, int goal_position);
106
107 std::optional<int> ReadOperatingMode(int id, bool use_cache = false);
108
109 bool SendOperatingMode(int id, int mode);
110
111 void SendTorque(int id, double joint_torque);
112
113 void SendCurrent(int id, double current);
114
115 std::optional<int> ReadTemperature(int id);
116
117 std::optional<std::vector<std::pair<int, int>>> GroupFastSyncRead(const std::vector<int>& ids, int addr, int len);
118
119 std::optional<std::vector<std::pair<int /* id */, double /* enc (rad) */>>> GroupFastSyncReadEncoder(
120 const std::vector<int>& ids);
121
122 std::optional<std::vector<std::pair<int, int>>> GroupFastSyncReadOperatingMode(const std::vector<int>& ids,
123 bool use_cache = false);
124
125 std::optional<std::vector<std::pair<int, int>>> GroupFastSyncReadTorqueEnable(const std::vector<int>& ids);
126
127 //
128 std::optional<std::vector<std::pair<int, MotorState>>> GetMotorStates(const std::vector<int>& ids);
129
130 void GroupSyncWriteTorqueEnable(const std::vector<std::pair<int, int>>& id_and_eanble_vector);
131
132 void GroupSyncWriteTorqueEnable(const std::vector<int>& ids, int enable);
133
134 void GroupSyncWriteOperatingMode(const std::vector<std::pair<int, int>>& id_and_mode_vector);
135
136 void GroupSyncWriteSendPosition(const std::vector<std::pair<int, double>>& id_and_position_vector);
137
138 void GroupSyncWriteSendTorque(const std::vector<std::pair<int, double>>& id_and_torque_vector);
139
140 void SendVibration(int id, int level);
141
142 private:
143 std::unique_ptr<DynamixelBusImpl> impl_;
144};
145
146} // namespace rb
Definition dynamixel_bus.h:14
Definition dynamixel_bus.h:42
Definition dynamixel_bus.h:47
Definition dynamixel_bus.h:58