Skip to content

Commit 7ae7985

Browse files
author
Shota Aoki
authored
sync_read,write以外のDynamixel関係の関数をDynamixelクラスへ移植する (#18)
* position PIDゲインの書き込みをdynamixelクラスへ移植 * 速度PIゲインの書き込みをDynamixelクラスへ移植 * lintエラーの修正 * profile acceleration velocityの書き込みをdynamixelクラスへ移植 * Dynamixelのアドレステーブルに合わせて関数の順番を並び替える * テストの実行順を変更 * Operating modeの読み書きをDynamixelクラスに移植 * リミット値の読み書きをDynamixelクラスへ移植 * 単位変換関数をdynamixelクラスに移植
1 parent 65bc609 commit 7ae7985

File tree

6 files changed

+392
-180
lines changed

6 files changed

+392
-180
lines changed

rt_manipulators_lib/include/dynamixel_base.hpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,47 @@ class DynamixelBase {
3131

3232
uint8_t get_id() const { return id_; }
3333
std::string get_name() const { return name_; }
34+
35+
virtual bool read_operating_mode(
36+
const dynamixel_base::comm_t & comm, uint8_t & mode) { return false; }
37+
virtual bool write_operating_mode(
38+
const dynamixel_base::comm_t & comm, const uint8_t mode) { return false; }
39+
virtual bool read_current_limit(
40+
const dynamixel_base::comm_t & comm, double & limit_ampere) { return false; }
41+
virtual bool read_max_position_limit(
42+
const dynamixel_base::comm_t & comm, double & limit_radian) { return false; }
43+
virtual bool read_min_position_limit(
44+
const dynamixel_base::comm_t & comm, double & limit_radian) { return false; }
45+
3446
virtual bool write_torque_enable(
3547
const dynamixel_base::comm_t & comm, const bool enable) { return false; }
3648

49+
virtual bool write_velocity_i_gain(
50+
const dynamixel_base::comm_t & comm, const unsigned int gain) { return false; }
51+
virtual bool write_velocity_p_gain(
52+
const dynamixel_base::comm_t & comm, const unsigned int gain) { return false; }
53+
virtual bool write_position_d_gain(
54+
const dynamixel_base::comm_t & comm, const unsigned int gain) { return false; }
55+
virtual bool write_position_i_gain(
56+
const dynamixel_base::comm_t & comm, const unsigned int gain) { return false; }
57+
virtual bool write_position_p_gain(
58+
const dynamixel_base::comm_t & comm, const unsigned int gain) { return false; }
59+
60+
virtual bool write_profile_acceleration(
61+
const dynamixel_base::comm_t & comm, const double acceleration_rpss) { return false; }
62+
virtual bool write_profile_velocity(
63+
const dynamixel_base::comm_t & comm, const double velocity_rps) { return false; }
64+
65+
virtual unsigned int to_profile_acceleration(const double acceleration_rpss) { return 1; }
66+
virtual unsigned int to_profile_velocity(const double velocity_rps) { return 1; }
67+
virtual double to_position_radian(const int position) { return 0.0; }
68+
virtual double to_velocity_rps(const int velocity) { return 0.0; }
69+
virtual double to_current_ampere(const int current) { return 0.0; }
70+
virtual double to_voltage_volt(const int voltage) { return 0.0; }
71+
virtual unsigned int from_position_radian(const double position_rad) { return 0; }
72+
virtual unsigned int from_velocity_rps(const double velocity_rps) { return 0; }
73+
virtual unsigned int from_current_ampere(const double current_ampere) { return 0; }
74+
3775
protected:
3876
uint8_t id_;
3977
std::string name_;

rt_manipulators_lib/include/dynamixel_xm.hpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,39 @@ namespace dynamixel_xm {
2121

2222
class DynamixelXM : public dynamixel_base::DynamixelBase {
2323
public:
24-
explicit DynamixelXM(const uint8_t id);
24+
explicit DynamixelXM(const uint8_t id, const int home_position = 2048);
25+
26+
bool read_operating_mode(const dynamixel_base::comm_t & comm, uint8_t & mode);
27+
bool write_operating_mode(const dynamixel_base::comm_t & comm, const uint8_t mode);
28+
bool read_current_limit(const dynamixel_base::comm_t & comm, double & limit_ampere);
29+
bool read_max_position_limit(const dynamixel_base::comm_t & comm, double & limit_radian);
30+
bool read_min_position_limit(const dynamixel_base::comm_t & comm, double & limit_radian);
31+
2532
bool write_torque_enable(const dynamixel_base::comm_t & comm, const bool enable);
33+
34+
bool write_velocity_i_gain(const dynamixel_base::comm_t & comm, const unsigned int gain);
35+
bool write_velocity_p_gain(const dynamixel_base::comm_t & comm, const unsigned int gain);
36+
bool write_position_d_gain(const dynamixel_base::comm_t & comm, const unsigned int gain);
37+
bool write_position_i_gain(const dynamixel_base::comm_t & comm, const unsigned int gain);
38+
bool write_position_p_gain(const dynamixel_base::comm_t & comm, const unsigned int gain);
39+
40+
bool write_profile_acceleration(
41+
const dynamixel_base::comm_t & comm, const double acceleration_rpss);
42+
bool write_profile_velocity(
43+
const dynamixel_base::comm_t & comm, const double velocity_rps);
44+
45+
unsigned int to_profile_acceleration(const double acceleration_rpss);
46+
unsigned int to_profile_velocity(const double velocity_rps);
47+
double to_position_radian(const int position);
48+
double to_velocity_rps(const int velocity);
49+
double to_current_ampere(const int current);
50+
double to_voltage_volt(const int voltage);
51+
unsigned int from_position_radian(const double position_rad);
52+
unsigned int from_velocity_rps(const double velocity_rps);
53+
unsigned int from_current_ampere(const double current_ampere);
54+
55+
private:
56+
int HOME_POSITION_;
2657
};
2758

2859
} // namespace dynamixel_xm

rt_manipulators_lib/include/hardware.hpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ class Hardware {
8888
protected:
8989
bool write_word_data_to_group(const std::string& group_name, const uint16_t address,
9090
const uint16_t write_data);
91-
bool write_double_word_data_to_group(const std::string& group_name, const uint16_t address,
92-
const uint32_t write_data);
9391

9492
std::shared_ptr<hardware_communicator::Communicator> comm_;
9593

@@ -103,15 +101,6 @@ class Hardware {
103101
const uint16_t addr_target, const uint16_t len_target);
104102
void read_write_thread(const std::vector<std::string>& group_names,
105103
const std::chrono::milliseconds& update_cycle_ms);
106-
double dxl_pos_to_radian(const int32_t position);
107-
double dxl_velocity_to_rps(const int32_t velocity) const;
108-
double dxl_current_to_ampere(const int16_t current) const;
109-
double dxl_voltage_to_volt(const int16_t voltage) const;
110-
uint32_t radian_to_dxl_pos(const double position);
111-
uint32_t to_dxl_velocity(const double velocity_rps);
112-
uint16_t to_dxl_current(const double current_ampere);
113-
uint32_t to_dxl_acceleration(const double acceleration_rpss);
114-
uint32_t to_dxl_profile_velocity(const double velocity_rps);
115104

116105
hardware_joints::Joints joints_;
117106
std::map<JointGroupName, uint16_t> addr_sync_read_position_;

rt_manipulators_lib/src/dynamixel_xm.cpp

Lines changed: 157 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,176 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include <cmath>
1516

1617
#include "dynamixel_xm.hpp"
1718

1819

1920
namespace dynamixel_xm {
2021

22+
const uint16_t ADDR_OPERATING_MODE = 11;
23+
const uint16_t ADDR_CURRENT_LIMIT = 38;
24+
const uint16_t ADDR_MAX_POSITION_LIMIT = 48;
25+
const uint16_t ADDR_MIN_POSITION_LIMIT = 52;
2126
const uint16_t ADDR_TORQUE_ENABLE = 64;
27+
const uint16_t ADDR_VELOCITY_I_GAIN = 76;
28+
const uint16_t ADDR_VELOCITY_P_GAIN = 78;
29+
const uint16_t ADDR_POSITION_D_GAIN = 80;
30+
const uint16_t ADDR_POSITION_I_GAIN = 82;
31+
const uint16_t ADDR_POSITION_P_GAIN = 84;
32+
const uint16_t ADDR_PROFILE_ACCELERATION = 108;
33+
const uint16_t ADDR_PROFILE_VELOCITY = 112;
2234

23-
DynamixelXM::DynamixelXM(const uint8_t id)
24-
: dynamixel_base::DynamixelBase(id) {
35+
const double TO_ACCELERATION_REV_PER_MM = 214.577;
36+
const double TO_ACCELERATION_TO_RAD_PER_MM = TO_ACCELERATION_REV_PER_MM * 2.0 * M_PI;
37+
const double TO_ACCELERATION_TO_RAD_PER_SS = TO_ACCELERATION_TO_RAD_PER_MM / 3600.0;
38+
const double DXL_ACCELERATION_FROM_RAD_PER_SS = 1.0 / TO_ACCELERATION_TO_RAD_PER_SS;
39+
const int DXL_MAX_ACCELERATION = 32767;
40+
const double TO_VELOCITY_REV_PER_MIN = 0.229;
41+
const double TO_VELOCITY_RAD_PER_MIN = TO_VELOCITY_REV_PER_MIN * 2.0 * M_PI;
42+
const double TO_VELOCITY_RAD_PER_SEC = TO_VELOCITY_RAD_PER_MIN / 60.0;
43+
const double DXL_VELOCITY_FROM_RAD_PER_SEC = 1.0 / TO_VELOCITY_RAD_PER_SEC;
44+
const int DXL_MAX_VELOCITY = 32767;
45+
const double TO_RADIANS = (180.0 / 2048.0) * M_PI / 180.0;
46+
const double TO_CURRENT_AMPERE = 0.00269;
47+
const double TO_VOLTAGE_VOLT = 0.1;
48+
const double TO_DXL_POS = 1.0 / TO_RADIANS;
49+
const double TO_DXL_CURRENT = 1.0 / TO_CURRENT_AMPERE;
50+
51+
DynamixelXM::DynamixelXM(const uint8_t id, const int home_position)
52+
: dynamixel_base::DynamixelBase(id), HOME_POSITION_(home_position) {
2553
name_ = "XM";
2654
}
2755

56+
bool DynamixelXM::read_operating_mode(const dynamixel_base::comm_t & comm, uint8_t & mode) {
57+
return comm->read_byte_data(id_, ADDR_OPERATING_MODE, mode);
58+
}
59+
60+
bool DynamixelXM::write_operating_mode(const dynamixel_base::comm_t & comm, const uint8_t mode) {
61+
return comm->write_byte_data(id_, ADDR_OPERATING_MODE, mode);
62+
}
63+
64+
bool DynamixelXM::read_current_limit(
65+
const dynamixel_base::comm_t & comm, double & limit_ampere) {
66+
uint16_t dxl_current_limit = 0;
67+
bool retval = comm->read_word_data(id_, ADDR_CURRENT_LIMIT, dxl_current_limit);
68+
limit_ampere = to_current_ampere(dxl_current_limit);
69+
return retval;
70+
}
71+
72+
bool DynamixelXM::read_max_position_limit(
73+
const dynamixel_base::comm_t & comm, double & limit_radian) {
74+
uint16_t dxl_position_limit = 0;
75+
bool retval = comm->read_word_data(id_, ADDR_MAX_POSITION_LIMIT, dxl_position_limit);
76+
limit_radian = to_position_radian(dxl_position_limit);
77+
return retval;
78+
}
79+
80+
bool DynamixelXM::read_min_position_limit(
81+
const dynamixel_base::comm_t & comm, double & limit_radian) {
82+
uint16_t dxl_position_limit = 0;
83+
bool retval = comm->read_word_data(id_, ADDR_MIN_POSITION_LIMIT, dxl_position_limit);
84+
limit_radian = to_position_radian(dxl_position_limit);
85+
return retval;
86+
}
87+
2888
bool DynamixelXM::write_torque_enable(const dynamixel_base::comm_t & comm, const bool enable) {
2989
return comm->write_byte_data(id_, ADDR_TORQUE_ENABLE, enable);
3090
}
3191

92+
bool DynamixelXM::write_velocity_i_gain(
93+
const dynamixel_base::comm_t & comm, const unsigned int gain) {
94+
return comm->write_word_data(id_, ADDR_VELOCITY_I_GAIN, static_cast<uint16_t>(gain));
95+
}
96+
97+
bool DynamixelXM::write_velocity_p_gain(
98+
const dynamixel_base::comm_t & comm, const unsigned int gain) {
99+
return comm->write_word_data(id_, ADDR_VELOCITY_P_GAIN, static_cast<uint16_t>(gain));
100+
}
101+
102+
bool DynamixelXM::write_position_d_gain(
103+
const dynamixel_base::comm_t & comm, const unsigned int gain) {
104+
return comm->write_word_data(id_, ADDR_POSITION_D_GAIN, static_cast<uint16_t>(gain));
105+
}
106+
107+
bool DynamixelXM::write_position_i_gain(
108+
const dynamixel_base::comm_t & comm, const unsigned int gain) {
109+
return comm->write_word_data(id_, ADDR_POSITION_I_GAIN, static_cast<uint16_t>(gain));
110+
}
111+
112+
bool DynamixelXM::write_position_p_gain(
113+
const dynamixel_base::comm_t & comm, const unsigned int gain) {
114+
return comm->write_word_data(id_, ADDR_POSITION_P_GAIN, static_cast<uint16_t>(gain));
115+
}
116+
117+
bool DynamixelXM::write_profile_acceleration(
118+
const dynamixel_base::comm_t & comm, const double acceleration_rpss) {
119+
return comm->write_double_word_data(
120+
id_,
121+
ADDR_PROFILE_ACCELERATION,
122+
static_cast<uint32_t>(to_profile_acceleration(acceleration_rpss)));
123+
}
124+
125+
bool DynamixelXM::write_profile_velocity(
126+
const dynamixel_base::comm_t & comm, const double velocity_rps) {
127+
return comm->write_double_word_data(
128+
id_,
129+
ADDR_PROFILE_VELOCITY,
130+
static_cast<uint32_t>(to_profile_velocity(velocity_rps)));
131+
}
132+
133+
unsigned int DynamixelXM::to_profile_acceleration(const double acceleration_rpss) {
134+
int dxl_acceleration = DXL_ACCELERATION_FROM_RAD_PER_SS * acceleration_rpss;
135+
if (dxl_acceleration > DXL_MAX_ACCELERATION) {
136+
dxl_acceleration = DXL_MAX_ACCELERATION;
137+
} else if (dxl_acceleration <= 0) {
138+
// XMシリーズでは、'0'が最大加速度を意味する
139+
// よって、加速度の最小値は'1'である
140+
dxl_acceleration = 1;
141+
}
142+
143+
return static_cast<unsigned int>(dxl_acceleration);
144+
}
145+
146+
unsigned int DynamixelXM::to_profile_velocity(const double velocity_rps) {
147+
int dxl_velocity = DXL_VELOCITY_FROM_RAD_PER_SEC * velocity_rps;
148+
if (dxl_velocity > DXL_MAX_VELOCITY) {
149+
dxl_velocity = DXL_MAX_VELOCITY;
150+
} else if (dxl_velocity <= 0) {
151+
// XMシリーズでは、'0'が最大速度を意味する
152+
// よって、速度の最小値は'1'である
153+
dxl_velocity = 1;
154+
}
155+
156+
return static_cast<unsigned int>(dxl_velocity);
157+
}
158+
159+
double DynamixelXM::to_position_radian(const int position) {
160+
return (position - HOME_POSITION_) * TO_RADIANS;
161+
}
162+
163+
double DynamixelXM::to_velocity_rps(const int velocity) {
164+
return velocity * TO_VELOCITY_RAD_PER_SEC;
165+
}
166+
167+
double DynamixelXM::to_current_ampere(const int current) {
168+
return current * TO_CURRENT_AMPERE;
169+
}
170+
171+
double DynamixelXM::to_voltage_volt(const int voltage) {
172+
return voltage * TO_VOLTAGE_VOLT;
173+
}
174+
175+
unsigned int DynamixelXM::from_position_radian(const double position_rad) {
176+
return position_rad * TO_DXL_POS + HOME_POSITION_;
177+
}
178+
179+
unsigned int DynamixelXM::from_velocity_rps(const double velocity_rps) {
180+
return velocity_rps * DXL_VELOCITY_FROM_RAD_PER_SEC;
181+
}
182+
183+
unsigned int DynamixelXM::from_current_ampere(const double current_ampere) {
184+
return current_ampere * TO_DXL_CURRENT;
185+
}
186+
32187
} // namespace dynamixel_xm

0 commit comments

Comments
 (0)