40 #define KHI_ROBOT_WD002N "WD002N"
41 #define KHI_ROBOT_RS007L "RS007L"
42 #define KHI_ROBOT_RS007N "RS007N"
43 #define KHI_ROBOT_RS013N "RS013N"
44 #define KHI_ROBOT_RS080N "RS080N"
45 #define KHI_KRNX_BUFFER_SIZE 4
46 #define KHI_KRNX_ACTIVATE_TH 0.02
47 #define KHI_KRNX_M2MM 1000
51 driver_name = __func__;
54 rtc_data[cno].seq_no = 0;
55 sw_dblrefflt[cno] = 0;
85 std::lock_guard<std::mutex> lock(
mutex_state[cont_no] );
88 if ( *as_err_code != 0 )
104 errorPrint(
"%s returned -0x%X", name.c_str(), -ret );
127 for (
int ano = 0; ano <
data.arm_num; ano++ )
138 errorPrint(
"Please change Robot Controller's TEACH/REPEAT to REPEAT" );
143 errorPrint(
"Please change Robot Controller's TEACH LOCK to OFF" );
146 else if ( panel_info.
run_lamp != -1 )
148 errorPrint(
"Please change Robot Controller's RUN/HOLD to RUN" );
153 errorPrint(
"Please change Robot Controller's EMERGENCY to OFF" );
168 char msg[256] = { 0 };
183 char c_ip_address[64] = { 0 };
189 warnPrint(
"Cannot open cont_no:%d because it is already opend...", cont_no );
202 strncpy( c_ip_address, ip_address.c_str(),
sizeof(c_ip_address) );
203 infoPrint(
"Connecting to real controller: %s", c_ip_address );
223 char msg[1024] = { 0 };
237 snprintf( msg,
sizeof(msg),
"SW ZDBLREFFLT_MODSTABLE=ON" );
253 const int to_home_vel = 20;
254 const double timeout_sec_th = 5.0;
257 double timeout_sec_cnt = 0.0;
263 int arm_num =
data.arm_num;
278 bool is_cycle =
true;
279 for (
int ano = 0; ano < arm_num; ano++ )
307 for (
int ano = 0; ano < arm_num; ano++ )
312 std::stringstream program;
313 program <<
"rb_rtc" << ano + 1;
314 if ( strcmp( program_info.
robot[ano].
program_name, program.str().c_str() ) == 0 )
339 for (
int ano = 0; ano < arm_num; ano++ )
344 std::stringstream program;
345 program <<
"rb_rtc" << ano + 1;
352 if ( timeout_sec_cnt > timeout_sec_th )
366 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
368 if (
data.arm[ano].type[jt] == urdf::Joint::PRISMATIC ) { conv =
KHI_KRNX_M2MM; }
371 diff =
data.arm[ano].home[jt]*conv - motion_data.
ang[jt];
413 char msg[1024] = { 0 };
427 for (
int ano = 0; ano <
data.arm_num; ano++ )
451 char robot_name[64] = { 0 };
452 char msg[256] = { 0 };
456 int arm_num =
data.arm_num;
464 for (
int ano = 0; ano < arm_num; ano++ )
468 if ( strncmp( robot_name,
data.robot_name.c_str(), 6 ) != 0 )
470 errorPrint(
"ROS Robot:%s does not match AS:%s",
data.robot_name.c_str(), robot_name );
486 snprintf( msg,
sizeof(msg),
"TYPE SYSDATA(ZROB.NOWAXIS,%d)", ano+1 );
491 if (
data.arm[ano].jt_num != jt_num )
493 warnPrint(
"ROS JT:%d does not match AS:%d",
data.arm[ano].jt_num, jt_num );
507 rtcont_info.
cyc = (int)(
cont_info[cont_no].period/1e+6);
535 static KhiRobotData prev_data =
data;
536 int arm_num =
data.arm_num;
542 for (
int ano = 0; ano < arm_num; ano++ )
544 memcpy(
data.arm[ano].pos,
data.arm[ano].cmd,
sizeof(
data.arm[ano].pos) );
545 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
547 data.arm[ano].vel[jt] =
data.arm[ano].pos[jt] - prev_data.arm[ano].pos[jt];
564 for (
int ano = 0; ano < arm_num; ano++ )
566 if ( !
getCurMotionData( cont_no, ano, &motion_cur[ano] ) ) {
return false; }
570 motion_data[cont_no][ano].erase( motion_data[cont_no][ano].begin() );
572 motion_data[cont_no][ano].push_back( motion_cur[ano] );
575 memcpy( ang[ano], &motion_cur[ano].ang,
sizeof(motion_cur[ano].ang) );
577 if ( motion_data[cont_no][ano].size() > 1 )
579 std::vector<TKrnxCurMotionData>::iterator it = motion_data[cont_no][ano].end();
583 vel[ano][jt] = motion_data[cont_no][ano].back().ang[jt] - it->ang[jt];
587 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
589 data.arm[ano].pos[jt] = (double)ang[ano][jt];
590 data.arm[ano].vel[jt] = (double)vel[ano][jt];
591 data.arm[ano].eff[jt] = (double)0;
594 if (
data.arm[ano].type[jt] == urdf::Joint::PRISMATIC )
617 int arm_num =
data.arm_num;
621 data.arm[0].home[0] = -45.0f*M_PI/180;
622 data.arm[0].home[1] = 45.0f*M_PI/180;
623 data.arm[1].home[0] = 45.0f*M_PI/180;
624 data.arm[1].home[1] = -45.0f*M_PI/180;
626 data.arm[0].home[3] =
data.arm[1].home[3] = 0.0f;
630 for (
int ano = 0; ano < arm_num; ano++ )
632 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
634 data.arm[ano].home[jt] = 0.0f;
639 for (
int ano = 0; ano < arm_num; ano++ )
641 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
643 data.arm[ano].cmd[jt] =
data.arm[ano].pos[jt] =
data.arm[ano].home[jt];
657 char msg[1024] = { 0 };
658 char status[128] = { 0 };
662 bool is_primed =
true;
663 int arm_num =
data.arm_num;
664 KhiRobotKrnxRtcData* p_rtc_data = &
rtc_data[cont_no];
681 for (
int ano = 0; ano < arm_num; ano++ )
683 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
685 p_rtc_data->comp[ano][jt] = (float)(
data.arm[ano].cmd[jt] -
data.arm[ano].home[jt]);
686 if (
data.arm[ano].type[jt] == urdf::Joint::PRISMATIC )
693 for (
int ano = 0; ano < arm_num; ano++ )
701 for (
int ano = 0; ano < arm_num; ano++ )
703 snprintf( msg,
sizeof(msg),
"[krnx_PrimeRtcCompData] ano:%d [jt]pos:vel:status ", ano+1 );
706 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
708 jt_pos = motion_data.
ang_ref[jt];
709 jt_vel = ( p_rtc_data->comp[ano][jt] - p_rtc_data->old_comp[ano][jt] )*(1e+9/
cont_info[cont_no].period);
710 if (
data.arm[ano].type[jt] == urdf::Joint::PRISMATIC )
715 snprintf( status,
sizeof(status),
"[%d]%.4f:%.4f:%d ", jt+1, jt_pos, jt_vel, p_rtc_data->status[ano][jt] );
716 strcat( msg, status );
717 ROS_WARN(
"JT%d:%f,%f,%f,%f,%f,%f", jt+1,
data.arm[ano].cmd[jt],
data.arm[ano].home[jt]+p_rtc_data->comp[ano][jt],p_rtc_data->old_comp[ano][jt], p_rtc_data->comp[ano][jt],
data.arm[ano].home[jt], motion_data.
ang_ref[jt]);
718 ROS_WARN(
"JT%d:%f,%f,%f,%f,%f,%f", jt+1,
data.arm[ano].cmd[jt]*180/M_PI, (
data.arm[ano].home[jt]+p_rtc_data->comp[ano][jt])*180/M_PI, p_rtc_data->old_comp[ano][jt]*180/M_PI, p_rtc_data->comp[ano][jt]*180/M_PI,
data.arm[ano].home[jt]*180/M_PI, motion_data.
ang_ref[jt]*180/M_PI);
726 p_rtc_data->seq_no++;
737 int arm_num =
data.arm_num;
742 if ( state ==
ERROR )
744 for (
int ano = 0; ano < arm_num; ano++ )
758 for (
int ano = 0; ano < arm_num; ano++ )
761 if ( ( state !=
ERROR ) && ( error_lamp != 0 ) )
771 errorPrint(
"RTC SWITCH turned OFF %d: ano:%d", cont_no, ano+1 );
783 static bool buffer_enabled =
false;
785 int buffer_length = 0;
801 if ( buffer_length > 0 )
803 buffer_enabled =
true;
806 if ( buffer_enabled )
821 int last = str.find_first_of(
del );
822 std::vector<std::string> list;
824 if ( first < str.size() )
826 std::string sub_str1( str, first, last - first );
827 list.push_back( sub_str1 );
829 std::string sub_str2( str, first, std::string::npos );
830 list.push_back( sub_str2 );
840 char tmplt[] =
"/tmp/khi_robot-rtc_param-XXXXXX";
841 char fd_path[128] = { 0 };
842 char file_path[128] = { 0 };
847 if ( ( fp = fdopen( fd,
"w" ) ) != NULL)
850 snprintf( fd_path,
sizeof(fd_path),
"/proc/%d/fd/%d", getpid(), fd );
851 rsize = readlink( fd_path, file_path,
sizeof(file_path) );
852 if ( rsize < 0 ) {
return false; }
857 fprintf( fp,
".PROGRAM rb_rtc1()\n" );
858 fprintf( fp,
" HERE #rtchome1\n" );
859 fprintf( fp,
" FOR .i = 1 TO 8\n" );
860 fprintf( fp,
" .acc[.i] = 0\n" );
861 fprintf( fp,
" END\n" );
862 fprintf( fp,
" L3ACCURACY .acc[1] ALWAYS\n" );
863 fprintf( fp,
" RTC_SW 1: ON\n" );
864 fprintf( fp,
"1 JMOVE #rtchome1\n" );
865 fprintf( fp,
" GOTO 1\n" );
866 fprintf( fp,
" RTC_SW 1: OFF\n" );
867 fprintf( fp,
".END\n" );
868 fprintf( fp,
".PROGRAM rb_rtc2()\n" );
869 fprintf( fp,
" HERE #rtchome2\n" );
870 fprintf( fp,
" FOR .i = 1 TO 8\n" );
871 fprintf( fp,
" .acc[.i] = 0\n" );
872 fprintf( fp,
" END\n" );
873 fprintf( fp,
" L3ACCURACY .acc[1] ALWAYS\n" );
874 fprintf( fp,
" RTC_SW 2: ON\n" );
875 fprintf( fp,
"1 JMOVE #rtchome2\n" );
876 fprintf( fp,
" GOTO 1\n" );
877 fprintf( fp,
" RTC_SW 2: OFF\n" );
878 fprintf( fp,
".END\n" );
882 fprintf( fp,
".PROGRAM rb_rtc1()\n" );
883 fprintf( fp,
" HERE #rtchome1\n" );;
884 fprintf( fp,
" ACCURACY 0 ALWAYS\n" );
885 fprintf( fp,
" RTC_SW 1: ON\n" );
886 fprintf( fp,
"1 JMOVE #rtchome1\n" );
887 fprintf( fp,
" GOTO 1\n" );
888 fprintf( fp,
" RTC_SW 1: OFF\n" );
889 fprintf( fp,
".END\n" );
909 for (
int ano = 0; ano <
data.arm_num; ano++ )
913 for (
int jt = 0; jt <
data.arm[ano].jt_num; jt++ )
915 data.arm[ano].home[jt] = (double)motion_data.
ang[jt];
916 if (
data.arm[ano].type[jt] == urdf::Joint::PRISMATIC )
932 std::vector<std::string> vlist;
934 const char del =
' ';
948 if ( req.type ==
"as" )
952 dcode =
execAsMonCmd( cont_no, req.cmd.c_str(), resp,
sizeof(resp), &acode );
953 res.driver_ret = dcode;
955 res.cmd_ret = std::string(resp);
960 res.cmd_ret =
"IS TRANSITION STATE";
963 else if ( req.type ==
"driver" )
966 if ( req.cmd ==
"get_status" )
970 else if ( req.cmd ==
"hold" )
978 res.cmd_ret =
"NOT ACTIVE STATE";
981 else if ( req.cmd ==
"restart" )
989 res.cmd_ret =
"NOT INACTIVE/HOLDED/ERROR STATE";
992 else if ( req.cmd ==
"quit" )
999 if ( vlist.size() == 2 )
1002 if ( api_cmd ==
"get_signal" )
1005 res.driver_ret = dcode;
1006 arg = std::atoi( vlist[1].c_str() );
1010 onoff = io.
io_do[(arg-1)/8] & ( 1 << (arg-1)%8 );
1016 onoff = io.
io_di[(arg-1)/8] & ( 1 << (arg-1)%8 );
1022 onoff = io.
internal[(arg-1)/8] & ( 1 << (arg-1)%8 );
1027 res.cmd_ret =
"INVALID ARGS";
1031 if ( onoff ) { res.cmd_ret =
"-1"; }
1032 else { res.cmd_ret =
"0";}
1035 else if ( api_cmd ==
"set_signal" )
1037 std::string as_cmd = req.cmd;
1038 as_cmd.replace( 0, strlen(
"set_signal"),
"SIGNAL" );
1039 dcode =
execAsMonCmd( cont_no, as_cmd.c_str(), resp,
sizeof(resp), &acode );
1040 res.driver_ret = dcode;
1046 res.cmd_ret =
"INVALID CMD";
1052 res.cmd_ret =
"INVALID ARGS";
1059 res.cmd_ret =
"INVALID TYPE";