Skip to content

Commit 719099e

Browse files
author
Shota Aoki
authored
sync_read, sync_write関連をDynamixelクラスへ移植 (#19)
* readインダイレクトアドレスの設定関数をDynamixelクラスに作成 * テストするためnext_indirect_addr_read()をpublicに変更。extract_present_position_from_sync_readを実装 * sync_readの関数をdynamixelクラスへ移植 * sync_write関係の関数をdynamixelクラスに実装 * sync_write用のデータ加工関数をdynamixelクラスに移植 * dynamixelクラスのsync_write関係の関数を使用する * 不要な関数を削除 * lintエラーを修正
1 parent 7ae7985 commit 719099e

File tree

7 files changed

+627
-168
lines changed

7 files changed

+627
-168
lines changed

‎rt_manipulators_lib/include/dynamixel_base.hpp‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <memory>
1919
#include <string>
20+
#include <vector>
2021

2122
#include "hardware_communicator.hpp"
2223

@@ -72,6 +73,63 @@ class DynamixelBase {
7273
virtual unsigned int from_velocity_rps(const double velocity_rps) { return 0; }
7374
virtual unsigned int from_current_ampere(const double current_ampere) { return 0; }
7475

76+
virtual bool auto_set_indirect_address_of_present_position(
77+
const dynamixel_base::comm_t & comm) { return false; }
78+
virtual bool auto_set_indirect_address_of_present_velocity(
79+
const dynamixel_base::comm_t & comm) { return false; }
80+
virtual bool auto_set_indirect_address_of_present_current(
81+
const dynamixel_base::comm_t & comm) { return false; }
82+
virtual bool auto_set_indirect_address_of_present_input_voltage(
83+
const dynamixel_base::comm_t & comm) { return false; }
84+
virtual bool auto_set_indirect_address_of_present_temperature(
85+
const dynamixel_base::comm_t & comm) { return false; }
86+
virtual bool auto_set_indirect_address_of_goal_position(
87+
const dynamixel_base::comm_t & comm) { return false; }
88+
virtual bool auto_set_indirect_address_of_goal_velocity(
89+
const dynamixel_base::comm_t & comm) { return false; }
90+
virtual bool auto_set_indirect_address_of_goal_current(
91+
const dynamixel_base::comm_t & comm) { return false; }
92+
93+
virtual unsigned int indirect_addr_of_present_position(void) { return 0; }
94+
virtual unsigned int indirect_addr_of_present_velocity(void) { return 0; }
95+
virtual unsigned int indirect_addr_of_present_current(void) { return 0; }
96+
virtual unsigned int indirect_addr_of_present_input_voltage(void) { return 0; }
97+
virtual unsigned int indirect_addr_of_present_temperature(void) { return 0; }
98+
virtual unsigned int indirect_addr_of_goal_position(void) { return 0; }
99+
virtual unsigned int indirect_addr_of_goal_velocity(void) { return 0; }
100+
virtual unsigned int indirect_addr_of_goal_current(void) { return 0; }
101+
102+
virtual unsigned int start_address_for_indirect_read(void) { return 0; }
103+
virtual unsigned int length_of_indirect_data_read(void) { return 0; }
104+
virtual unsigned int next_indirect_addr_read(void) const { return 0; }
105+
106+
virtual unsigned int start_address_for_indirect_write(void) { return 0; }
107+
virtual unsigned int length_of_indirect_data_write(void) { return 0; }
108+
virtual unsigned int next_indirect_addr_write(void) const { return 0; }
109+
110+
virtual bool extract_present_position_from_sync_read(
111+
const dynamixel_base::comm_t & comm, const std::string & group_name,
112+
double & position_rad) { return false; }
113+
virtual bool extract_present_velocity_from_sync_read(
114+
const dynamixel_base::comm_t & comm, const std::string & group_name,
115+
double & velocity_rps) { return false; }
116+
virtual bool extract_present_current_from_sync_read(
117+
const dynamixel_base::comm_t & comm, const std::string & group_name,
118+
double & current_ampere) { return false; }
119+
virtual bool extract_present_input_voltage_from_sync_read(
120+
const dynamixel_base::comm_t & comm, const std::string & group_name,
121+
double & voltage_volt) { return false; }
122+
virtual bool extract_present_temperature_from_sync_read(
123+
const dynamixel_base::comm_t & comm, const std::string & group_name,
124+
int & temperature_deg) { return false; }
125+
126+
virtual void push_back_position_for_sync_write(
127+
const double position_rad, std::vector<uint8_t> & write_data) {}
128+
virtual void push_back_velocity_for_sync_write(
129+
const double velocity_rps, std::vector<uint8_t> & write_data) {}
130+
virtual void push_back_current_for_sync_write(
131+
const double current_ampere, std::vector<uint8_t> & write_data) {}
132+
75133
protected:
76134
uint8_t id_;
77135
std::string name_;

‎rt_manipulators_lib/include/dynamixel_xm.hpp‎

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#ifndef RT_MANIPULATORS_LIB_INCLUDE_DYNAMIXEL_XM_HPP_
1616
#define RT_MANIPULATORS_LIB_INCLUDE_DYNAMIXEL_XM_HPP_
1717

18+
#include <string>
19+
#include <vector>
20+
1821
#include "dynamixel_base.hpp"
1922

2023
namespace dynamixel_xm {
@@ -52,8 +55,74 @@ class DynamixelXM : public dynamixel_base::DynamixelBase {
5255
unsigned int from_velocity_rps(const double velocity_rps);
5356
unsigned int from_current_ampere(const double current_ampere);
5457

55-
private:
58+
bool auto_set_indirect_address_of_present_position(const dynamixel_base::comm_t & comm);
59+
bool auto_set_indirect_address_of_present_velocity(const dynamixel_base::comm_t & comm);
60+
bool auto_set_indirect_address_of_present_current(const dynamixel_base::comm_t & comm);
61+
bool auto_set_indirect_address_of_present_input_voltage(const dynamixel_base::comm_t & comm);
62+
bool auto_set_indirect_address_of_present_temperature(const dynamixel_base::comm_t & comm);
63+
bool auto_set_indirect_address_of_goal_position(const dynamixel_base::comm_t & comm);
64+
bool auto_set_indirect_address_of_goal_velocity(const dynamixel_base::comm_t & comm);
65+
bool auto_set_indirect_address_of_goal_current(const dynamixel_base::comm_t & comm);
66+
67+
unsigned int indirect_addr_of_present_position(void);
68+
unsigned int indirect_addr_of_present_velocity(void);
69+
unsigned int indirect_addr_of_present_current(void);
70+
unsigned int indirect_addr_of_present_input_voltage(void);
71+
unsigned int indirect_addr_of_present_temperature(void);
72+
unsigned int indirect_addr_of_goal_position(void);
73+
unsigned int indirect_addr_of_goal_velocity(void);
74+
unsigned int indirect_addr_of_goal_current(void);
75+
76+
unsigned int start_address_for_indirect_read(void);
77+
unsigned int length_of_indirect_data_read(void);
78+
unsigned int next_indirect_addr_read(void) const;
79+
80+
unsigned int start_address_for_indirect_write(void);
81+
unsigned int length_of_indirect_data_write(void);
82+
unsigned int next_indirect_addr_write(void) const;
83+
84+
bool extract_present_position_from_sync_read(
85+
const dynamixel_base::comm_t & comm, const std::string & group_name,
86+
double & position_rad);
87+
bool extract_present_velocity_from_sync_read(
88+
const dynamixel_base::comm_t & comm, const std::string & group_name,
89+
double & velocity_rps);
90+
bool extract_present_current_from_sync_read(
91+
const dynamixel_base::comm_t & comm, const std::string & group_name,
92+
double & current_ampere);
93+
bool extract_present_input_voltage_from_sync_read(
94+
const dynamixel_base::comm_t & comm, const std::string & group_name,
95+
double & voltage_volt);
96+
bool extract_present_temperature_from_sync_read(
97+
const dynamixel_base::comm_t & comm, const std::string & group_name,
98+
int & temperature_deg);
99+
100+
void push_back_position_for_sync_write(
101+
const double position_rad, std::vector<uint8_t> & write_data);
102+
void push_back_velocity_for_sync_write(
103+
const double velocity_rps, std::vector<uint8_t> & write_data);
104+
void push_back_current_for_sync_write(
105+
const double current_ampere, std::vector<uint8_t> & write_data);
106+
107+
protected:
56108
int HOME_POSITION_;
109+
unsigned int total_length_of_indirect_addr_read_;
110+
unsigned int total_length_of_indirect_addr_write_;
111+
uint16_t indirect_addr_of_present_position_;
112+
uint16_t indirect_addr_of_present_velocity_;
113+
uint16_t indirect_addr_of_present_current_;
114+
uint16_t indirect_addr_of_present_input_voltage_;
115+
uint16_t indirect_addr_of_present_temperature_;
116+
uint16_t indirect_addr_of_goal_position_;
117+
uint16_t indirect_addr_of_goal_velocity_;
118+
uint16_t indirect_addr_of_goal_current_;
119+
120+
bool set_indirect_address_read(
121+
const dynamixel_base::comm_t & comm, const uint16_t addr, const uint16_t len,
122+
uint16_t & indirect_addr);
123+
bool set_indirect_address_write(
124+
const dynamixel_base::comm_t & comm, const uint16_t addr, const uint16_t len,
125+
uint16_t & indirect_addr);
57126
};
58127

59128
} // namespace dynamixel_xm

‎rt_manipulators_lib/include/hardware.hpp‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,6 @@ class Hardware {
8686
const uint16_t i);
8787

8888
protected:
89-
bool write_word_data_to_group(const std::string& group_name, const uint16_t address,
90-
const uint16_t write_data);
91-
9289
std::shared_ptr<hardware_communicator::Communicator> comm_;
9390

9491
private:
@@ -97,8 +94,6 @@ class Hardware {
9794
bool limit_goal_current_by_present_position(const std::string& group_name);
9895
bool create_sync_read_group(const std::string& group_name);
9996
bool create_sync_write_group(const std::string& group_name);
100-
bool set_indirect_address(const std::string& group_name, const uint16_t addr_indirect_start,
101-
const uint16_t addr_target, const uint16_t len_target);
10297
void read_write_thread(const std::vector<std::string>& group_names,
10398
const std::chrono::milliseconds& update_cycle_ms);
10499

0 commit comments

Comments
 (0)