6 #include <std_msgs/Int32.h> 7 #include <std_msgs/Int16.h> 8 #include <std_msgs/UInt16.h> 9 #include <std_msgs/Int8.h> 10 #include <std_msgs/String.h> 11 #include <std_msgs/Float64.h> 17 #define REACTIVE_RATE_FUNCTION //指示姿勢に変化がない場合に制御周期を落としてCPU負荷を下げる機能 18 #ifdef REACTIVE_RATE_FUNCTION 19 #define CONTROL_WAIT_HZ (50) 20 #define CONTROL_ACTIVE_HZ (200) 22 #define CONTROL_HZ (200) 30 typedef dynamic_reconfigure::Server<sciurus17_msgs::ServoParameterConfig>
RECONFIG_TYPE;
53 std::vector<std::string>
split(
const std::string& input,
char delimiter)
55 std::istringstream stream(input);
58 std::vector<std::string> result;
59 while (std::getline(stream, field, delimiter)) {
60 result.push_back(field);
68 std::string topic = header.at(
"topic");
69 const std_msgs::UInt16ConstPtr& msg =
event.getMessage();
70 uint16_t set_gain_data = msg->data;
75 std::vector<std::string> topic_list =
split(topic,
'/');
76 std::string joint_name = topic_list[ topic_list.size()-2 ];
78 for( std::vector<JOINT_CONTROL>::iterator it=driver_addr->
joints.begin() ; it!=driver_addr->
joints.end() ; ++it ){
79 if( it->get_joint_name() == joint_name ){
81 set_req_data.
dxl_id = it->get_dxl_id();
82 set_req_data.
gain = set_gain_data;
108 for( std::vector<JOINT_CONTROL>::iterator it=driver_addr->
joints.begin() ; it!=driver_addr->
joints.end() ; ++it ){
109 if( it->get_dxl_id() == id ){
120 config.torque_enable =
true;
135 std::string current_name;
136 std::string dxl_pos_name;
137 std::string temp_name;
138 std::string gain_name;
139 std::string joint_name;
141 for( std::vector<JOINT_CONTROL>::iterator it=driver->
joints.begin() ; it!=driver->
joints.end() ; ++it ){
142 joint_name = it->get_joint_name();
143 current_name = ( joint_name +
"/current");
145 dxl_pos_name = ( joint_name +
"/dxl_position");
147 temp_name = ( joint_name +
"/temp");
149 gain_name = ( joint_name +
"/gain");
156 for( std::vector<JOINT_CONTROL>::iterator it=driver->
joints.begin() ; it!=driver->
joints.end() ; ++it ){
158 dynamic_reconfigure::Server<sciurus17_msgs::ServoParameterConfig>::CallbackType
f;
160 server->setCallback(f);
161 reconfig_srv.push_back( std::unique_ptr<RECONFIG_TYPE>(server) );
168 std::vector<ros::Publisher>::iterator current_it;
169 std::vector<ros::Publisher>::iterator dxl_pos_it;
170 std::vector<ros::Publisher>::iterator temp_it;
172 std_msgs::Float64 current_out;
173 std_msgs::Int16 dxl_pos_out;
174 std_msgs::Float64 temp_out;
180 for( std::vector<JOINT_CONTROL>::iterator it=driver->
joints.begin() ; it!=driver->
joints.end() ; ++it ){
181 current_out.data = it->get_current();
182 current_it->publish( current_out );
184 dxl_pos_out.data = it->get_dxl_pos();
185 dxl_pos_it->publish( dxl_pos_out );
188 temp_out.data = it->get_temprature();
189 temp_it->publish( temp_out );
217 int main(
int argc,
char* argv[] )
225 if( !setting.
load() ){
231 std::string errorlog;
232 if( sciurus17.
get_error( errorlog ) > 0 ){
233 ROS_INFO(
"Initialize error (%s)",errorlog.c_str());
238 driver_addr = &sciurus17;
243 #ifdef REACTIVE_RATE_FUNCTION 254 uint32_t prev_tempCount = 0;
255 bool read_temp_flg =
false;
268 if( sciurus17.
tempCount != prev_tempCount ){
269 read_temp_flg =
true;
272 read_temp_flg =
false;
277 if( sciurus17.
read( t, d ) ){
279 sciurus17.
write( t, d );
295 std::string errorlog;
296 while( sciurus17.
get_error( errorlog ) > 0 ){
301 #ifdef REACTIVE_RATE_FUNCTION
void set_param_home_offset(uint8_t dxl_id, int val)
void set_param_pos_gain_all(int p, int i, int d)
static std::vector< ros::Publisher > dxl_position_pub
int main(int argc, char *argv[])
void init_reconfigure(DXLPORT_CONTROL *driver)
std::string::size_type get_error(std::string &errorlog)
static std::vector< std::unique_ptr< RECONFIG_TYPE > > reconfig_srv
bool set_torque(uint8_t dxl_id, bool torque)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
static std::vector< ros::Publisher > temp_pub
void set_param_drive_mode(uint8_t dxl_id, int val)
#define DXL_DEFAULT_PGAIN
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void set_param_vol_limit(uint8_t dxl_id, int max, int min)
ROSCPP_DECL const std::string & getName()
static std::vector< ros::Publisher > current_pub
void startup_motion(void)
#define CONTROL_ACTIVE_HZ
uint16_t moving_threshold
void write(ros::Time, ros::Duration)
std::map< std::string, std::string > M_string
bool is_change_positions(void)
void publish(const boost::shared_ptr< M > &message) const
void publish_topic_data(DXLPORT_CONTROL *driver, bool temp_flg)
static std_msgs::String lasterror_out
void gainCallback(const ros::MessageEvent< std_msgs::UInt16 const > &event)
void init_topics(DXLPORT_CONTROL *driver, ros::NodeHandle nh)
struct SET_GAIN_QUEUE ST_SET_GAIN_QUEUE
void set_goal_current_all(uint16_t current)
ros::Duration getDuration(ros::Time t) const
static std::vector< ros::Subscriber > gain_sub
ros::Time getTime() const
static std::queue< ST_SET_GAIN_QUEUE > set_gain_request
void set_gain(uint8_t dxl_id, uint16_t gain)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void set_param_current_limit(uint8_t dxl_id, int val)
static DXLPORT_CONTROL * driver_addr
void set_param_delay_time(uint8_t dxl_id, int val)
uint8_t return_delay_time
void set_param_moving_threshold(uint8_t dxl_id, int val)
std::vector< std::string > split(const std::string &input, char delimiter)
bool read(ros::Time, ros::Duration)
void write_joint_param(DXLPORT_CONTROL &driver, ST_JOINT_PARAM set_param)
void set_param_vel_gain(uint8_t dxl_id, int p, int i)
ROSCPP_DECL void shutdown()
void update(const ros::Time &time, const ros::Duration &period, bool reset_controllers=false)
std::string self_check(void)
static std::queue< ST_JOINT_PARAM > set_joint_param_request
std::vector< JOINT_CONTROL > joints
void set_param_ope_mode(uint8_t dxl_id, int val)
dynamic_reconfigure::Server< sciurus17_msgs::ServoParameterConfig > RECONFIG_TYPE
void set_param_temp_limit(uint8_t dxl_id, int val)
void set_param_pos_gain(uint8_t dxl_id, int p, int i, int d)
SET_GAIN_QUEUE(const SET_GAIN_QUEUE &src)
void reconfigureCallback(sciurus17_msgs::ServoParameterConfig &config, uint32_t level, uint8_t id)
void SigintHandler(int sig)