00001 #include <unistd.h>
00002 #include <iostream>
00003 #include <cstdlib>
00004 #include <cstring>
00005 #include <vector>
00006 #include "hrpsys/io/iob.h"
00007
00008 #include <ros/ros.h>
00009 #include <boost/algorithm/string.hpp>
00010 #include <osrf_msgs/JointCommands.h>
00011 #include <sensor_msgs/JointState.h>
00012 #include <sensor_msgs/Imu.h>
00013 #include <atlas_msgs/AtlasState.h>
00014 #include <atlas_msgs/AtlasCommand.h>
00015 #include <hrpUtil/Eigen3d.h>
00016
00017 static ros::NodeHandle* rosnode;
00018 static ros::Publisher pub_joint_commands_;
00019 static ros::Subscriber sub_atlas_state;
00020 static atlas_msgs::AtlasCommand jointcommands;
00021 static atlas_msgs::AtlasCommand initial_jointcommands;
00022
00023 static atlas_msgs::AtlasState js;
00024 static int init_sub_flag = FALSE;
00025
00026 static std::vector<double> command;
00027 static std::vector<double> prev_command;
00028 static std::vector<std::vector<double> > forces;
00029 static std::vector<std::vector<double> > gyros;
00030 static std::vector<std::vector<double> > accelerometers;
00031 static std::vector<std::vector<double> > attitude_sensors;
00032 static std::vector<std::vector<double> > force_offset;
00033 static std::vector<std::vector<double> > gyro_offset;
00034 static std::vector<std::vector<double> > accel_offset;
00035 static std::vector<int> power;
00036 static std::vector<int> servo;
00037 static bool isLocked = false;
00038 static int frame = 0;
00039 static timespec g_ts;
00040 static long g_period_ns=1000000;
00041 static ros::Time rg_ts;
00042
00043 #define CHECK_JOINT_ID(id) if ((id) < 0 || (id) >= number_of_joints()) return E_ID
00044 #define CHECK_FORCE_SENSOR_ID(id) if ((id) < 0 || (id) >= number_of_force_sensors()) return E_ID
00045 #define CHECK_ACCELEROMETER_ID(id) if ((id) < 0 || (id) >= number_of_accelerometers()) return E_ID
00046 #define CHECK_GYRO_SENSOR_ID(id) if ((id) < 0 || (id) >= number_of_gyro_sensors()) return E_ID
00047 #define CHECK_ATTITUDE_SENSOR_ID(id) if ((id) < 0 || (id) >= number_of_attitude_sensors()) return E_ID
00048
00049 #define JOINT_ID_REAL2MODEL(id) joint_id_real2model[id]
00050 #define JOINT_ID_MODEL2REAL(id) joint_id_model2real(id)
00051 #define NUM_OF_REAL_JOINT sizeof(joint_id_real2model)/sizeof(joint_id_real2model[0])
00052 static int joint_id_real2model[] = {0, 1, 2, 9, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, 6, 7, 8, 21, 22, 23, 24, 25, 26};
00053 static int joint_id_model2real(int id)
00054 {
00055 for (int i = 0; i < NUM_OF_REAL_JOINT; i++){
00056 if (joint_id_real2model[i] == id){
00057 return i;
00058 }
00059 }
00060 return -1;
00061 }
00062
00063 #ifdef __APPLE__
00064 typedef int clockid_t;
00065 #define CLOCK_MONOTONIC 0
00066 #include <mach/mach_time.h>
00067 int clock_gettime(clockid_t clk_id, struct timespec *tp)
00068 {
00069 if (clk_id != CLOCK_MONOTONIC) return -1;
00070
00071 uint64_t clk;
00072 clk = mach_absolute_time();
00073
00074 static mach_timebase_info_data_t info = {0,0};
00075 if (info.denom == 0) mach_timebase_info(&info);
00076
00077 uint64_t elapsednano = clk * (info.numer / info.denom);
00078
00079 tp->tv_sec = elapsednano * 1e-9;
00080 tp->tv_nsec = elapsednano - (tp->tv_sec * 1e9);
00081 return 0;
00082 }
00083
00084 #define TIMER_ABSTIME 0
00085 int clock_nanosleep(clockid_t clk_id, int flags, struct timespec *tp,
00086 struct timespec *remain)
00087 {
00088 if (clk_id != CLOCK_MONOTONIC || flags != TIMER_ABSTIME) return -1;
00089
00090 static mach_timebase_info_data_t info = {0,0};
00091 if (info.denom == 0) mach_timebase_info(&info);
00092
00093 uint64_t clk = (tp->tv_sec*1e9 + tp->tv_nsec)/(info.numer/info.denom);
00094
00095 mach_wait_until(clk);
00096 return 0;
00097 }
00098 #endif
00099
00100
00101 int number_of_joints()
00102 {
00103 return (int)command.size();
00104 }
00105
00106 int number_of_force_sensors()
00107 {
00108 return (int)forces.size();
00109 }
00110
00111 int number_of_gyro_sensors()
00112 {
00113 return (int)gyros.size();
00114 }
00115
00116 int number_of_accelerometers()
00117 {
00118 return (int)accelerometers.size();
00119 }
00120
00121 int number_of_attitude_sensors()
00122 {
00123 return (int)attitude_sensors.size();
00124 }
00125
00126 int set_number_of_joints(int num)
00127 {
00128 command.resize(num);
00129 prev_command.resize(num);
00130 power.resize(num);
00131 servo.resize(num);
00132 for (int i=0; i<num; i++){
00133 command[i] = power[i] = servo[i] = prev_command[i] = 0;
00134 }
00135 return TRUE;
00136 }
00137
00138 int set_number_of_force_sensors(int num)
00139 {
00140 forces.resize(num);
00141 force_offset.resize(num);
00142 for (unsigned int i=0; i<forces.size();i++){
00143 forces[i].resize(6);
00144 force_offset[i].resize(6);
00145 for (int j=0; j<6; j++){
00146 forces[i][j] = 0;
00147 force_offset[i][j] = 0;
00148 }
00149 }
00150 return TRUE;
00151 }
00152
00153 int set_number_of_gyro_sensors(int num)
00154 {
00155 gyros.resize(num);
00156 gyro_offset.resize(num);
00157 for (unsigned int i=0; i<gyros.size();i++){
00158 gyros[i].resize(3);
00159 gyro_offset[i].resize(3);
00160 for (int j=0; j<3; j++){
00161 gyros[i][j] = 0.0;
00162 gyro_offset[i][j] = 0.0;
00163 }
00164 }
00165 return TRUE;
00166 }
00167
00168 int set_number_of_accelerometers(int num)
00169 {
00170 accelerometers.resize(num);
00171 accel_offset.resize(num);
00172 for (unsigned int i=0; i<accelerometers.size();i++){
00173 accelerometers[i].resize(3);
00174 accel_offset[i].resize(3);
00175 for (int j=0; j<3; j++){
00176 accelerometers[i][j] = j == 2 ? 9.81 : 0.0;
00177 accel_offset[i][j] = 0;
00178 }
00179 }
00180 return TRUE;
00181 }
00182
00183 int set_number_of_attitude_sensors(int num)
00184 {
00185 attitude_sensors.resize(num);
00186 for (unsigned int i=0; i<attitude_sensors.size();i++){
00187 attitude_sensors[i].resize(3);
00188 for (int j=0; j<3; j++){
00189 attitude_sensors[i][j] = 0.0;
00190 }
00191 }
00192 return TRUE;
00193 }
00194
00195 int read_power_state(int id, int *s)
00196 {
00197 CHECK_JOINT_ID(id);
00198 *s = power[id];
00199 return TRUE;
00200 }
00201
00202 int write_power_command(int id, int com)
00203 {
00204 CHECK_JOINT_ID(id);
00205 power[id] = com;
00206 return TRUE;
00207 }
00208
00209 int read_power_command(int id, int *com)
00210 {
00211 CHECK_JOINT_ID(id);
00212 *com = power[id];
00213 return TRUE;
00214 }
00215
00216 int read_servo_state(int id, int *s)
00217 {
00218 CHECK_JOINT_ID(id);
00219 *s = servo[id];
00220 return TRUE;
00221 }
00222
00223 int read_servo_alarm(int id, int *a)
00224 {
00225 CHECK_JOINT_ID(id);
00226 *a = 0;
00227 return TRUE;
00228 }
00229
00230 int read_control_mode(int id, joint_control_mode *s)
00231 {
00232 CHECK_JOINT_ID(id);
00233 *s = JCM_POSITION;
00234 return TRUE;
00235 }
00236
00237 int write_control_mode(int id, joint_control_mode s)
00238 {
00239 CHECK_JOINT_ID(id);
00240 return TRUE;
00241 }
00242
00243 int read_actual_angle(int id, double *angle)
00244 {
00245 CHECK_JOINT_ID(id);
00246
00247
00248 if(init_sub_flag){
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 if (JOINT_ID_MODEL2REAL(id) < 0) {
00338 *angle = command[id];
00339 }else{
00340 *angle = js.position[JOINT_ID_MODEL2REAL(id)];
00341 }
00342 }else{
00343 *angle = command[id];
00344 }
00345 return TRUE;
00346 }
00347
00348 int read_actual_angles(double *angles)
00349 {
00350 for (int i=0; i<number_of_joints(); i++){
00351 read_actual_angle(i, &angles[i]);
00352 }
00353 return TRUE;
00354 }
00355
00356 int read_actual_torques(double *torques)
00357 {
00358
00359
00360 if(init_sub_flag) {
00361 for(int i=0; i<number_of_joints(); i++){
00362 if(JOINT_ID_MODEL2REAL(i) < 0) {
00363 *(torques+i) = -1;
00364 }else{
00365 *(torques+i) = js.effort[JOINT_ID_MODEL2REAL(i)];
00366 }
00367 }
00368 }
00369
00370 return TRUE;
00371 }
00372
00373 int read_command_torque(int id, double *torque)
00374 {
00375 return FALSE;
00376 }
00377
00378 int write_command_torque(int id, double torque)
00379 {
00380 return FALSE;
00381 }
00382
00383 int read_command_torques(double *torques)
00384 {
00385 return FALSE;
00386 }
00387
00388 int read_command_angle(int id, double *angle)
00389 {
00390 CHECK_JOINT_ID(id);
00391 *angle = command[id];
00392 return TRUE;
00393 }
00394
00395 int write_command_angle(int id, double angle)
00396 {
00397 CHECK_JOINT_ID(id);
00398 command[id] = angle;
00399 return TRUE;
00400 }
00401
00402 int read_command_angles(double *angles)
00403 {
00404 for (int i=0; i<number_of_joints(); i++){
00405 angles[i] = command[i];
00406 }
00407 return TRUE;
00408 }
00409
00410 int write_command_angles(const double *angles)
00411 {
00412 for (int i=0; i<number_of_joints(); i++){
00413 prev_command[i] = command[i];
00414 command[i] = angles[i];
00415 }
00416
00417 jointcommands.header.stamp = ros::Time::now();
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448 for (int i=0; i<NUM_OF_REAL_JOINT; i++){
00449 jointcommands.position[i] = command[JOINT_ID_REAL2MODEL(i)];
00450 jointcommands.velocity[i] = (command[JOINT_ID_REAL2MODEL(i)] - prev_command[JOINT_ID_REAL2MODEL(i)]) / (g_period_ns * 1e-9);
00451 jointcommands.kp_velocity[i] = 100;
00452 }
00453
00454 pub_joint_commands_.publish(jointcommands);
00455
00456 ros::spinOnce();
00457
00458 return TRUE;
00459 }
00460
00461 int read_pgain(int id, double *gain)
00462 {
00463 if(JOINT_ID_MODEL2REAL(id) < 0) {
00464
00465 std::cerr << ";;; read gain: " << id << " failed." << std::endl;
00466 }else{
00467 int iid = JOINT_ID_MODEL2REAL(id);
00468 *(gain) = jointcommands.kp_position[iid] / initial_jointcommands.kp_position[iid];
00469
00470 }
00471 return TRUE;
00472 }
00473
00474 int write_pgain(int id, double gain)
00475 {
00476
00477 if(JOINT_ID_MODEL2REAL(id) < 0) {
00478
00479 }else{
00480 int iid = JOINT_ID_MODEL2REAL(id);
00481 jointcommands.kp_position[iid] =
00482 gain * initial_jointcommands.kp_position[iid];
00483 }
00484 return TRUE;
00485 }
00486
00487 int read_dgain(int id, double *gain)
00488 {
00489
00490 if(JOINT_ID_MODEL2REAL(id) < 0) {
00491
00492 }else{
00493 int iid = JOINT_ID_MODEL2REAL(id);
00494 *(gain) = jointcommands.kd_position[iid] / initial_jointcommands.kd_position[iid];
00495 }
00496 return TRUE;
00497 }
00498
00499 int write_dgain(int id, double gain)
00500 {
00501
00502 if(JOINT_ID_MODEL2REAL(id) < 0) {
00503
00504 }else{
00505 int iid = JOINT_ID_MODEL2REAL(id);
00506 jointcommands.kd_position[iid] =
00507 gain * initial_jointcommands.kd_position[iid];
00508 }
00509 return TRUE;
00510 }
00511
00512 int read_force_sensor(int id, double *forces)
00513 {
00514 CHECK_FORCE_SENSOR_ID(id);
00515
00516
00517
00518
00519 std::vector<geometry_msgs::Wrench*> fsensors;
00520 fsensors.push_back(&(js.l_hand));
00521 fsensors.push_back(&(js.r_hand));
00522 fsensors.push_back(&(js.l_foot));
00523 fsensors.push_back(&(js.r_foot));
00524 if(init_sub_flag){
00525 forces[0] = fsensors[id]->force.x + force_offset[id][0];
00526 forces[1] = fsensors[id]->force.y + force_offset[id][1];
00527 forces[2] = fsensors[id]->force.z + force_offset[id][2];
00528 forces[3] = fsensors[id]->torque.x + force_offset[id][3];
00529 forces[4] = fsensors[id]->torque.y + force_offset[id][4];
00530 forces[5] = fsensors[id]->torque.z + force_offset[id][5];
00531 }
00532
00533 return TRUE;
00534 }
00535
00536 int read_gyro_sensor(int id, double *rates)
00537 {
00538 CHECK_GYRO_SENSOR_ID(id);
00539
00540
00541
00542
00543 if(init_sub_flag){
00544
00545
00546 Eigen::Quaternion<double> q(js.orientation.w,
00547 js.orientation.x,
00548 js.orientation.y,
00549 js.orientation.z);
00550 hrp::Vector3 rpy = hrp::rpyFromRot(q.toRotationMatrix());
00551 rates[0] = rpy[0];
00552 rates[1] = rpy[1];
00553 rates[2] = rpy[2];
00554
00555
00556
00557
00558
00559
00560
00561 } else {
00562
00563 rates[0] = rates[1] = rates[2] = 0.0;
00564 }
00565
00566 return TRUE;
00567 }
00568
00569 int read_accelerometer(int id, double *accels)
00570 {
00571 CHECK_ACCELEROMETER_ID(id);
00572
00573
00574
00575
00576
00577 if(init_sub_flag){
00578 accels[0] = js.linear_acceleration.x
00579 + 0.01 + accel_offset[id][0];
00580 accels[1] = js.linear_acceleration.y
00581 + 0.01 + accel_offset[id][1];
00582 accels[2] = js.linear_acceleration.z
00583 + 0.01 + accel_offset[id][2];
00584 } else {
00585
00586 accels[0] = accels[1] = 0.0;
00587 accels[2] = 9.8;
00588 }
00589
00590 return TRUE;
00591 }
00592
00593 int read_touch_sensors(unsigned short *onoff)
00594 {
00595 return FALSE;
00596 }
00597
00598 int read_attitude_sensor(int id, double *att)
00599 {
00600 return FALSE;
00601 }
00602
00603 int read_current(int id, double *mcurrent)
00604 {
00605 return FALSE;
00606 }
00607
00608 int read_current_limit(int id, double *v)
00609 {
00610 return FALSE;
00611 }
00612
00613 int read_currents(double *currents)
00614 {
00615 return FALSE;
00616 }
00617
00618 int read_gauges(double *gauges)
00619 {
00620 return FALSE;
00621 }
00622
00623 int read_command_velocity(int id, double *vel)
00624 {
00625 return FALSE;
00626 }
00627
00628 int write_command_velocity(int id, double vel)
00629 {
00630 return FALSE;
00631 }
00632
00633 int read_command_velocities(double *vels)
00634 {
00635 return FALSE;
00636 }
00637
00638 int write_command_velocities(double *vels)
00639 {
00640 return FALSE;
00641 }
00642
00643 int read_temperature(int id, double *v)
00644 {
00645 return FALSE;
00646 }
00647
00648 int write_servo(int id, int com)
00649 {
00650 servo[id] = com;
00651 return TRUE;
00652 }
00653
00654 int write_dio(unsigned short buf)
00655 {
00656 return FALSE;
00657 }
00658
00659
00660 static void setJointStates(const atlas_msgs::AtlasState::ConstPtr &_js) {
00661 ROS_DEBUG(";; subscribe JointState");
00662 js = *_js;
00663 init_sub_flag = TRUE;
00664 }
00665
00666 int open_iob(void)
00667 {
00668 static bool isInitialized = false;
00669 if ( isInitialized ) return TRUE;
00670
00671 std::map<std::string, std::string> arg;
00672 ros::init(arg, "hrpsys_gazebo", ros::init_options::NoSigintHandler);
00673 rosnode = new ros::NodeHandle();
00674
00675
00676
00677
00678 std::vector<std::string> names;
00679 names.push_back("atlas::back_lbz");
00680 names.push_back("atlas::back_mby");
00681 names.push_back("atlas::back_ubx");
00682 names.push_back("atlas::neck_ay");
00683 names.push_back("atlas::l_leg_uhz");
00684 names.push_back("atlas::l_leg_mhx");
00685 names.push_back("atlas::l_leg_lhy");
00686 names.push_back("atlas::l_leg_kny");
00687 names.push_back("atlas::l_leg_uay");
00688 names.push_back("atlas::l_leg_lax");
00689 names.push_back("atlas::r_leg_uhz");
00690 names.push_back("atlas::r_leg_mhx");
00691 names.push_back("atlas::r_leg_lhy");
00692 names.push_back("atlas::r_leg_kny");
00693 names.push_back("atlas::r_leg_uay");
00694 names.push_back("atlas::r_leg_lax");
00695 names.push_back("atlas::l_arm_usy");
00696 names.push_back("atlas::l_arm_shx");
00697 names.push_back("atlas::l_arm_ely");
00698 names.push_back("atlas::l_arm_elx");
00699 names.push_back("atlas::l_arm_uwy");
00700 names.push_back("atlas::l_arm_mwx");
00701 names.push_back("atlas::r_arm_usy");
00702 names.push_back("atlas::r_arm_shx");
00703 names.push_back("atlas::r_arm_ely");
00704 names.push_back("atlas::r_arm_elx");
00705 names.push_back("atlas::r_arm_uwy");
00706 names.push_back("atlas::r_arm_mwx");
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720 unsigned int n = names.size();
00721
00722 jointcommands.position.resize(n);
00723 jointcommands.velocity.resize(n);
00724 jointcommands.effort.resize(n);
00725 jointcommands.kp_position.resize(n);
00726 jointcommands.ki_position.resize(n);
00727 jointcommands.kd_position.resize(n);
00728 jointcommands.kp_velocity.resize(n);
00729 jointcommands.i_effort_min.resize(n);
00730 jointcommands.i_effort_max.resize(n);
00731
00732 for (unsigned int i = 0; i < n; i++) {
00733 std::vector<std::string> pieces;
00734 boost::split(pieces, names[i], boost::is_any_of(":"));
00735 double kp;
00736 rosnode->getParam("atlas_controller/gains/" + pieces[2] + "/p", kp);
00737 jointcommands.kp_position[i] = kp;
00738
00739 double ki;
00740 rosnode->getParam("atlas_controller/gains/" + pieces[2] + "/i", ki);
00741 jointcommands.ki_position[i] = ki;
00742
00743 double kd;
00744 rosnode->getParam("atlas_controller/gains/" + pieces[2] + "/d", kd);
00745 jointcommands.kd_position[i] = kd;
00746
00747 double emin;
00748 rosnode->getParam("atlas_controller/gains/" + pieces[2] + "/i_clamp", emin);
00749 jointcommands.i_effort_min[i] = -emin;
00750
00751 double emax;
00752 rosnode->getParam("atlas_controller/gains/" + pieces[2] + "/i_clamp", emax);
00753 jointcommands.i_effort_max[i] = emax;
00754
00755 jointcommands.velocity[i] = 0;
00756 jointcommands.effort[i] = 0;
00757 jointcommands.kp_velocity[i] = 0;
00758 }
00759 jointcommands.desired_controller_period_ms = static_cast<unsigned int>(g_period_ns * 1e-6);
00760
00761
00762 pub_joint_commands_ = rosnode->advertise <atlas_msgs::AtlasCommand> ("/atlas/atlas_command", 1, true);
00763
00764
00765
00766 ros::SubscribeOptions jointStatesSo =
00767 ros::SubscribeOptions::create<atlas_msgs::AtlasState>("/atlas/atlas_state", 1, setJointStates,
00768 ros::VoidPtr(), rosnode->getCallbackQueue());
00769
00770
00771
00772
00773
00774
00775 jointStatesSo.transport_hints =
00776 ros::TransportHints().unreliable().reliable().tcpNoDelay(true);
00777
00778 sub_atlas_state = rosnode->subscribe(jointStatesSo);
00779
00780
00781 std::cout << "JointState IOB is opened" << std::endl;
00782 for (int i=0; i<number_of_joints(); i++){
00783 command[i] = 0.0;
00784 power[i] = OFF;
00785 servo[i] = OFF;
00786 }
00787 clock_gettime(CLOCK_MONOTONIC, &g_ts);
00788 rg_ts = ros::Time::now();
00789
00790 initial_jointcommands = jointcommands;
00791 isInitialized = true;
00792 return TRUE;
00793 }
00794
00795 int close_iob(void)
00796 {
00797 std::cout << "JointState IOB is closed" << std::endl;
00798 return TRUE;
00799 }
00800
00801 int reset_body(void)
00802 {
00803 for (int i=0; i<number_of_joints(); i++){
00804 power[i] = servo[i] = OFF;
00805 }
00806 return TRUE;
00807 }
00808
00809 int joint_calibration(int id, double angle)
00810 {
00811 return FALSE;
00812 }
00813
00814 int read_gyro_sensor_offset(int id, double *offset)
00815 {
00816 for (int i=0; i<3; i++){
00817 offset[i] = gyro_offset[id][i];
00818 }
00819 return TRUE;
00820 }
00821
00822 int write_gyro_sensor_offset(int id, double *offset)
00823 {
00824 for (int i=0; i<3; i++){
00825 gyro_offset[id][i] = offset[i];
00826 }
00827 return TRUE;
00828 }
00829
00830 int read_accelerometer_offset(int id, double *offset)
00831 {
00832 for (int i=0; i<3; i++){
00833 offset[i] = accel_offset[id][i];
00834 }
00835 return TRUE;
00836 }
00837
00838 int write_accelerometer_offset(int id, double *offset)
00839 {
00840 for (int i=0; i<3; i++){
00841 accel_offset[id][i] = offset[i];
00842 }
00843 return TRUE;
00844 }
00845
00846 int read_force_offset(int id, double *offsets)
00847 {
00848 for (int i=0; i<6; i++){
00849 offsets[i] = force_offset[id][i];
00850 }
00851 return TRUE;
00852 }
00853
00854 int write_force_offset(int id, double *offsets)
00855 {
00856 for (int i=0; i<6; i++){
00857 force_offset[id][i] = offsets[i];
00858 }
00859 return TRUE;
00860 }
00861
00862 int write_attitude_sensor_offset(int id, double *offset)
00863 {
00864 return FALSE;
00865 }
00866
00867 int read_calib_state(int id, int *s)
00868 {
00869 CHECK_JOINT_ID(id);
00870 int v = id/2;
00871 *s = v%2==0 ? ON : OFF;
00872 return TRUE;
00873 }
00874
00875 int lock_iob()
00876 {
00877 if (isLocked) return FALSE;
00878
00879
00880 return TRUE;
00881 }
00882 int unlock_iob()
00883 {
00884 isLocked = false;
00885 return TRUE;
00886 }
00887
00888 int read_lock_owner(pid_t *pid)
00889 {
00890 return FALSE;
00891 }
00892
00893 int read_limit_angle(int id, double *angle)
00894 {
00895 return FALSE;
00896 }
00897
00898 int read_angle_offset(int id, double *angle)
00899 {
00900 return FALSE;
00901 }
00902
00903 int write_angle_offset(int id, double angle)
00904 {
00905 return FALSE;
00906 }
00907
00908 int read_ulimit_angle(int id, double *angle)
00909 {
00910 return FALSE;
00911 }
00912 int read_llimit_angle(int id, double *angle)
00913 {
00914 return FALSE;
00915 }
00916 int read_encoder_pulse(int id, double *ec)
00917 {
00918 return FALSE;
00919 }
00920 int read_gear_ratio(int id, double *gr)
00921 {
00922 return FALSE;
00923 }
00924 int read_torque_const(int id, double *tc)
00925 {
00926 return FALSE;
00927 }
00928 int read_torque_limit(int id, double *limit)
00929 {
00930 return FALSE;
00931 }
00932
00933 unsigned long long read_iob_frame()
00934 {
00935 ++frame;
00936
00937 return frame;
00938 }
00939
00940 int number_of_substeps()
00941 {
00942 return 1;
00943 }
00944
00945 int read_power(double *voltage, double *current)
00946 {
00947 *voltage = ((double)random()-RAND_MAX/2)/(RAND_MAX/2)*1+48;
00948 *current = ((double)random()-RAND_MAX/2)/(RAND_MAX/2)*0.5+1;
00949 return TRUE;
00950 }
00951
00952 int read_driver_temperature(int id, unsigned char *v)
00953 {
00954 *v = id * 2;
00955 return TRUE;
00956 }
00957
00958 void timespec_add_ns(timespec *ts, long ns)
00959 {
00960 ts->tv_nsec += ns;
00961 while (ts->tv_nsec > 1e9){
00962 ts->tv_sec += 1;
00963 ts->tv_nsec -= 1e9;
00964 }
00965 }
00966
00967 double timespec_compare(timespec *ts1, timespec *ts2)
00968 {
00969 double dts = ts1->tv_sec - ts2->tv_sec;
00970 double dtn = ts1->tv_nsec - ts2->tv_nsec;
00971 return dts*1e9+dtn;
00972 }
00973
00974 int wait_for_iob_signal()
00975 {
00976 #if 0
00977
00978 clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &g_ts, 0);
00979 timespec_add_ns(&g_ts, g_period_ns);
00980 timespec now;
00981 clock_gettime(CLOCK_MONOTONIC, &now);
00982 double dt = timespec_compare(&g_ts, &now);
00983
00984 if (dt <= 0){
00985 fprintf(stderr, "iob::overrun (%d[ms])\n", -dt*1e6);
00986 do {
00987 timespec_add_ns(&g_ts, g_period_ns);
00988 }while(timespec_compare(&g_ts, &now)<=0);
00989 }
00990 #endif
00991 #if 1
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004 ros::Time rnow;
01005 ros::Duration tm = ros::Duration(0, g_period_ns);
01006 ros::WallDuration wtm = ros::WallDuration(0, 100000);
01007 while ((rnow = ros::Time::now()) < rg_ts) {
01008 wtm.sleep();
01009 }
01010
01011 rg_ts += tm;
01012 if ((rg_ts - rnow).toSec() <= 0) {
01013 fprintf(stderr, "iob::overrun (%f[ms]), w:%f -> %f\n",
01014 (rnow - rg_ts).toSec()*1000, rnow.toSec(), rg_ts.toSec());
01015 do {
01016 rg_ts += tm;
01017 } while ((rg_ts - rnow).toSec() <= 0);
01018 }
01019 #endif
01020 return 0;
01021 }
01022
01023 size_t length_of_extra_servo_state(int id)
01024 {
01025 return 0;
01026 }
01027
01028 int read_extra_servo_state(int id, int *state)
01029 {
01030 return TRUE;
01031 }
01032
01033 int set_signal_period(long period_ns)
01034 {
01035 g_period_ns = period_ns;
01036 return TRUE;
01037 }
01038
01039 long get_signal_period()
01040 {
01041 return g_period_ns;
01042 }
01043
01044 int initializeJointAngle(const char *name, const char *option)
01045 {
01046 sleep(3);
01047 return TRUE;
01048 }
01049
01050 int read_digital_input(char *dinput)
01051 {
01052 return 0;
01053 }
01054
01055 int write_digital_output(const char *doutput)
01056 {
01057 return 0;
01058 }
01059
01060 int length_digital_input(void)
01061 {
01062 return 0;
01063 }
01064
01065 int length_digital_output(void)
01066 {
01067 return 0;
01068 }