A P I
- APPLICATION
PROGRAM
INTERFACE
API 9 Application Program Interface The Application Program Interface (API) provides the user the ability to develop own functions written in C programming language for user defined • • •
inverse kinematics (API-INV) motion planning (API-IPO) and dynamics (API-DYN)
The below text will give a basic overview about the topics • • • •
Kinematics Forward Kinematics Inverse Kinematics Trajectory Generation
Kinematics is the science of motion, which treats motion without regard to the forces, which cause it. Within the science of kinematics one studies the position, velocity, acceleration, and all higher order derivatives of the position variables. Hence, the study of the kinematics of robots refers to all geometrical and time-based properties of the motion. A very basic problem to be solved is: How to relate the robot’s configuration or pose to the position and orientation of its end effector. A configuration of an ndegree of freedom robot is an n-vector (q1 , q 2 ,..., q n ) , where each qi is either a rotational joint angle or a prismatic joint translation. This is known as the forward kinematics of the robot. This is the static geometrical problem of computing the position and orientation of the end-effector of the robot. Specifically, given a
IX-1
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
set of joint angles, the forward kinematic problem is to compute the position and orientation of the TCP relative to the base frame. Sometimes we think of this as changing the representation of robot position from joint space description into a Cartesian space description. The following problem is considered the inverse kinematics: Given the position and orientation of the end-effector of the robot, calculate all possible sets of joint angles which could be used to attain the this given position and orientation. The inverse kinematics is not as simple as the forward kinematics. Because the kinematic equations are nonlinear, their solution is not always easy or even possible in a closed form. The existence of a kinematic solution defines the workspace of a given robot. The lack of a solution means that the robot cannot attain the desired position and orientation because it lies outside the robot’s workspace. In addition to dealing with static positioning problems, we may wish to analyse robots in motion. Often in performing velocity analysis of a mechanism it is convenient to define a matrix quantity called the jacobian of the robot. The jacobian specifies a mapping from velocities in joint space to velocities in cartesian space. The nature of these mapping changes as the configuration of the robot varies. At certain points, called singularities, this mapping is not invertible. An understanding of this phenomenon is important to designers and users of robots. A common way of causing a robot to move from A to B in a smooth, controlled fashion is to cause each joint to move as specified by a smooth function of time. Commonly, each joint starts and ends its motion at the same time, so that the robot motion appears coordinated. Exactly how to compute these motion functions is the problem of trajectory generation.
IX-2
A P I
-
APPLICATION
PROGRAM
INTERFACE
API-INV - Inverse Kinematics The API for inverse kinematics is used when a robot kinematics is created based on universal coordinates or Denavit Hartenberg (DH) parameter and the inverse kinematics problem has to be solved. Many exported functions from the EASYROB™ data base give full access to all needed robot data, i.e. kinematic robots lengths, software travel ranges, joint directions, tool frame, TCP location, etc. Mathematical routines to handle homogeneous transformation matrices are available as well as trigonometrical functions for angle, triangle and trapezoid calculations.
Cartesian location Robot Basis to Tip *inq_T()
Prototypes: Library:
er_dvlp.h c-header file easyrobw.lib
Folder: VC++ project C file: Functions:
.\easy_rob\er_dvlp\ er_kin.dsw inv_user.cpp inv_kin_user_1(frame *T)inv_kin_user_12(frame *T) Cartesian location, Robot Base to Tip frame *inq_T() Set of joints/axis values float *inq_q(int soln) int soln = inq_config() is the current robot configuration Warning vector int *inq_warnings() [WARN_OK, -SINGULAR, -UNREACH, -CNFG, -NO_INVKIN, -SWE_EXCEED] Standard Robot RRR:RRR type, modelled in universal coordinates with 6 DOF and 8 configurations int inv_kin_user_2(frame *bTt) Dynamic Link Library Dll er_kin.dll in folder .\easy_rob\
Variable Input: Variable Output: EASY-ROB Data Base Library: easyrobw.lib
Example
Kinematic lengths & attributes
Result
Result:
Joint solution vector float *inq_q_solut() Dimension = DOF int inq_num_dofs()
er_kin.dll
Figure API -01: Interfaces for inverse kinematics The inverse kinematics routine is called during TCP jogging using the mouse and during program execution in CP mode after every interpolation step *inq_ipo_data_dt_ipo().
IX-3
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
Using the function call •
rob_kin_inv(frame *base_to_tip)
forces the calculation for the inverse kinematics solution. This function can be called from everywhere within the API.
Kinematic Robot Chain Output: Robot Joints *inq_q_solut()
Input: Robot Base to Tip *inq_T() = bTt *inq_bTt() Robot Base to first Joint *inq_bT0()
World Origin
Word to Robot Base *inq_iTb()
Figure API-02: Transformation Chain
Figure API-02: Transformation Chain
IX-4
TOOL: Tip to TCP *inq_tTw() = tTw TCP Tip Robot Base to TCP *inq_bTw() = bTt * tTw
A P I
-
APPLICATION
PROGRAM
INTERFACE
API-IPO - Motion Planner In a similar way as for the inverse kinematics solution, an Application Program Interface (API) for the motion planning respectively the interpolator exist. The build-in motion planning routines inside the EASY-ROB BASIC module implemented for the point to point (PTP) and continuous path (CP) motion type. The continuous path motion type covers linear (LIN) and circular (CIRC) motion. The API for the motion planning allows it to develop user defined functions written in C for the motion types PTP, LIN and CIRC. Before the robot starts to move to its new target location, the preparation routine, which returns the required motion time for that move, is called. Afterwards, supposed the preparation was successful, the execution routine is called in every interpolation step to calculate intermediate locations for the robots TCP. Many exported functions give full access to the current motion planning values such as programmed speeds and accelerations.
IX-5
9
A P I
-
Joint & cartesian target locations
APPLICATION
PROGRAM
INTERFACE
Prototypes: Library:
er_dvlp.h c-header file easyrobw.lib
Folder: VC++ project C file: Functions:
.\easy_rob\er_dvlp\ er_ipo.dsw ipo_user.cpp Preparation: int ipo_jnt_prep_user_1..12 int ipo_lin_prep_user_1..12 int ipo_circ_prep_user_1..12 (void **ipo_usr_ptr) Execution: ipo_jnt_exec_user_1..12 ipo_lin_exec_user_1..12 ipo_circ_exec_user_1..12 (float ctime, void **ipo_usr_ptr) Preparation: Pointer for user defined data structure, Start and Target locations Return values IPO_OK: Preparation successful IPO_IN_POSITION: Target already reached IPO_ERROR: Preparation fails, no execution user defined data structure **ipo_usr_ptr required time for this move float *inq_ipo_prep_t_bahn() Execution: current time ctime user defined data structure **ipo_usr_ptr Intermediate locations and speeds Return values: 1: execution is called until return valus is 0 0: execution is called until ctime <= ..t_end see ipo_user.cpp Dynamic Link Library Dll er_ipo.dll in folder .\easy_rob\
EASY-ROB Data Base Library: easyrobw.lib
Variable Input:
Interpolation control data
Variable Output:
Variable Input:
Variable Output:
Example Result
Result:
er_ipo.dll
Figure API-03: Interfaces for motion planner
IX-6
Joint & cartesian intermediate locations
A P I
-
APPLICATION
PROGRAM
INTERFACE
API-DYN - Dynamics The dynamics option allows to consider the dynamic model of the robot and the position controller during simulation. The build-in dynamics routine for the dynamic robot model uses a simple uncoupled 1st order model in the discrete z-space defined by the inertia, the viscous friction and the gear ratio for each joint. Based on the system step, the discrete model is calculated. The build-in position controller is represented by the well known PPI Cascade Controller with pseudo analog PI velocity controller. During the robots motion a green trace shows the desired TCP location (generated by the motion planner) and a red trace the actual location of the robots TCP. An output window shows the errors in joint and cartesian space at any time. The Application Program Interface (API) for Dynamics allows to develop user defined functions written in C for the dynamic robot model and the position controller. Herein it will be possible to consider the real non linear coupled model of the robot and use an integration algorithm such as Runge Kutta to solve the inverse dynamic modell. Furthermore, a special position controller such as an adaptive or a robot modell based controller can be implemented.
user defined data structure **dyn_cntrl_usr_ptr()
desired joint values q = *inq_q_solut()
actual joint values q_dyn = *inq_q_dyn()
user defined data structure **dyn_model_usr_ptr()
PPI - Position Controller Control Signal joint error dq = *inq_dq() uc = dq = q - q_dyn *inq_uc() v = kpp * dq dv = v - v_dyn + aux1 * v_solut dt = inq_dt_cntrl() Integration value uc_kiv += kpv * kiv *dv * dt Output: Control signal, uc = kpv * dv + uc_kiv
Robot Model v_dyn uc v_dyn = f(uc,data) dt_sys = inq_dt_sys() q_dyn += v_dyn * dt_sys Output: q_dyn: actual joint v_dyn: actual speed
actual joint speed v_dyn = *inq_v_dyn()
Figure API-04: Interfaces for dynamics, position controller and dynamic robot model
IX-7
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
The above general structure shows the main important data flow between position controller and the dynamic robot model. The algorithm for position controller and robot model could be very complex, depending on the users requirements. The position controller with following I/O data.
Desired and actual locations and speeds
Prototypes: Library:
er_dvlp.h c-header file easyrobw.lib
Folder: VC++ project C file: Functions:
.\easy_rob\er_dvlp\ er_dyn.dsw dyn_user.cpp int dyn_cntrl_user_1..12 (void **dyn_cntrl_usr_ptr) Pointer for user defined data structure, Current desired and actual locations, Control parameter: Example: PPI-Cascade *inq_cntrl_kpp(): superimposed PosCntrl *inq_cntrl_kpv(): P - underlying VelCntrl *inq_cntrl_kiv(): I - underlying VelCntrl *inq_cntrl_aux1..3(): auxiliary values gear ratio, robot attributes, etc. Error, actual joint error, control signal float *inq_uc() see file dyn_user.cpp dyn_cntrl_user_1(void **usrptr) Dynamic Link Library Dll er_dyn.dll in folder .\easy_rob\
Input:
EASY-ROB Data Base Library: easyrobw.lib Control parameter, sample time
Variable Output: Example Result
Result:
Control signals for each joint: float *inq_uc()
er_dyn.dll
Figure API-05: Interfaces for dynamics, position controller The user defined structure allows the user to store all needed data for this specific controller (adaptive-, state variable feedback-, force controller, etc.), such as parameter or status data, which are needed for the next sampling step. When the routine dyn_cntrl_user_x() is called for the first time, this user pointer is NULL and allows the user to allocate memory and to defined all initial data settings. In the next step, EASY-ROB™ will return this pointer, thus all data are available for further calculations.
IX-8
A P I
-
APPLICATION
PROGRAM
INTERFACE
Structure of the dynamic robot model
Control signals for each joint *inq_uc()
Prototypes: Library:
er_dvlp.h c-header file easyrobw.lib
Folder: VC++ project C file: Functions:
.\easy_rob\er_dvlp\ er_dyn.dsw dyn_user.cpp int dyn_model_user_1..12 (void **dyn_model_usr_ptr) Pointer for user defined data structure, Control signal from position controller Model parameter: gear ratio, robot attributes, etc. Error, actual joint values: float *inq_q_dyn() float *inq_v_dyn() see file dyn_user.cpp dyn_model_user_1(void **usrptr) Dynamic Link Library Dll er_dyn.dll in folder .\easy_rob\
Input:
EASY-ROB Data Base Library: easyrobw.lib
Variable Output:
Example Result
Robot model parameter, model sample time
Result:
Actual joint position *inq_q_dyn() actual joint speed *inq_v_dyn()
er_dyn.dll
Figure API-06: Interfaces for dynamics, robot dynamic model The user defined structure allows the user to store all needed data for this specific dynamic robot model. This pointer works in the same manner as for the position controller. Inside the API for the robot model, it is possible to integrate high sophisticated calculations to solve the inverse dynamic robot model with consideration of nonlinearities for frictions, coriolis and gravity forces, inertias and maybe elasticities in the gear boxes. The solution for the complete model can be solved using Runge Kutta for example.
IX-9
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
Example for API-INV Load the robot, "univ_inv.rob" from the .\proj folder.
Figure API-07: univ-inv.rob
Figure API-08: Selection Dialog
Figure API-09: Input Dialog:
IX-10
This robot with 6 rotational joints is modeled in universal coordinates. The yellow colored coorsys show the active joints. The robot base position is in the world origin (green color). The TCP coorsys is visualized in blue color. The Tip coorsys is in white color. Menu: Robotics -> Robot Motion + Kinematics
-> Kinematic Data will open this Selection Dialog box. The user is prompted to make a choice. The transformation from the robot base to the first st (1 ) joint of this robot is translated by 0.5m in Y Direction. Procedure: frame T=*inq_bT0(void) returns the pointer, to read or modify the values.
A P I
-
APPLICATION
Figure API-10: Selection Dialog for inverse kinematics
PROGRAM
INTERFACE
A selection of "4 - Inverse Kinematic No" in the Dialog in Figure API-08 allows the user to choose the function for the inverse kinematics solution defined in er_kin.dll. "3 - DLL inv. kin #2" will select function "inv_kin_user_2(frame *)"
Example for API-IPO
Figure API-11: Input Dialog for Motion Planner ipo data
Menu: Robotics -> Robot Motion Planner -> Ipo Data will open the Input Dialog to set the control data for the motion planner, such as ipo step size, vq = joint speed, vx = cartesian speed, joint acceleration, ov = override, etc. Inside the API, you can read and write all ipo data, using the functions: vq = *inq_ipo_path_vq() vx = *inq_ipo_path_vx() ov = *inq_ipo_path_ov_pro()
IX-11
9
A P I
-
APPLICATION
PROGRAM
Figure API-12: Selection Dialog for joint motion planner code
IX-12
INTERFACE
Menu: Robotics -> Robot Motion Planner -> Ipo Joint Code will open the Selection Dialog to prompt the user to choose the function for the user defined motion planner for the "Joint" motion type. This selection will enable the 2 functions, ipo_jnt_prep_user_1() and ipo_jnt_exec_user_1().
A P I
-
APPLICATION
PROGRAM
INTERFACE
C- Program Examples Inverse Kinematics The below C Code Example code solve the inverse kinematic solution for a RRR:RRR robot type with 6 revolute joints. The robot is modeled in universal coordinates. Load the robot, "univ_inv.rob" from the .\proj folder. You will find the source code in file inv_user.cpp in directory .\er_dvlp\. Please open the VC++ 6.0 Project file er_kin.dsw. The RED colored Text is comment for explaination. /* EASY-ROB Development V3.0 12 user defined inverse kinamatic routines are suported. int inv_kin_user_1..12 (FRAME *) 12 user defined functions for mathematical joint dependencies are supported. float md_f1..12 (void) The EASY-ROB base program "easyrobw.exe" provides more than 100 functions, see header file "..\er_dvlp\er_dvlp.h" Stefan Anton Copyright (c) 1996,1997,1998,1999,2000,2001 modul: inv_user.cpp To build a new er_kin.dll, please start the project file "er_kin.dsw" with the Microsoft Visual C++ Compiler. */ #include <stdio.h> #include <string.h> #include <math.h> #include "..\er_dvlp\er_dvlp.h" #define NUM_DOFS_2 6 #define NUM_CONFIGS_2 8
IX-13
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
EXPORT_C int inv_kin_user_2(frame *bTt) // frame *bTt points to the transformation from the robot base to the tip of the // robot. The transformation from the tip to the tcp is substracted before. { double *achs_length,*achs_offsets1,*achs_offsets2, *sing_tol,*joint_offset; float *q; int *warnings,*verpolt; int num_dofs,num_configs; frame *T,b0Tt; int i,ii, jj, kk, soln, warning; double nx,ny,nz,ox,oy,oz,ax, ay, az,px, py, pz; float l1x, l1y, l1z, l2x, l2y, l2z, l2, l3x, l3y, l3z, l3, l6, ly, rx, rxy, rxm, rr; double c1, s1, c2, c3, c23, s23,s6,c6,s4,c4, cabs; double theta[KIN_DOFS]; double delta_theta1, delta_theta2, delta_theta3; float sig1, sig2, sig3, sing_tolx, sing_tol_q5; num_dofs = inq_num_dofs();// number DOF, should be 6 num_configs = inq_num_configs(); // number of configurations, should be 8 // Check if the loaded robot fits to this solution if (num_dofs!=NUM_DOFS_2 || num_configs!=NUM_CONFIGS_2) { char b[80]; rob_kin_user_msg("ERROR inv_kin_user_2()"); sprintf(b,"dofs %2d != %2d",num_dofs,NUM_DOFS_2); rob_kin_user_msg(b); sprintf(b,"configs %2d != %2d",num_configs,NUM_CONFIGS_2); rob_kin_user_msg(b); } // Set the pointer to the axis_length of this robot achs_length = inq_achs_length(); // length in z - direction achs_offsets1 = inq_achs_offsets1();// length in x - direction achs_offsets2 = inq_achs_offsets2();// length in y - direction joint_offset = inq_joint_offset(); sing_tol = inq_sing_tol(); warnings = inq_warnings(); verpolt = inq_verpolt(); // sign of the robot joint [-1 or +1] // lenghts l1z = 0.5 l2z = 0.6 l3z = 0.4 l4z = 0 l5z = 0 l6 = 0.15 l1z = achs_length[0]; // see also length "lz,lx,ly" in ’univ_inv.rob’ file l1x = achs_offsets1[0]; l1y = achs_offsets2[0]; l2z = achs_length[1]; l2x = achs_offsets1[1]; l2y = achs_offsets2[1];
IX-14
A P I
-
APPLICATION
PROGRAM
INTERFACE
delta_theta2 = atan(l2x/l2z); l2 = sqrt( l2x*l2x + l2z*l2z ); l3z = achs_length[2]; l3x = achs_offsets1[2]; l3y = achs_offsets2[2]; delta_theta3 = atan(l3x/l3z); l3 = sqrt( l3x*l3x + l3z*l3z ); ly = l1y + l2y + l3y; l6 = achs_length[5]; sing_tolx = sing_tol[0]; /* [mm] */ sing_tol_q5 = (float)sin(sing_tol[4]); /* [rad] */ T = &b0Tt; // substract the transformation from the robot base to the first joint ’bT0()’, // see also Figure API-02 Transformation Chain // see also in ’univ_inv.rob’ file: => ! base to Joint 1 "bT0" mul_invT_T(T,inq_bT0(),bTt); px = T->p[0]-T->a[0]*l6; py = T->p[1]-T->a[1]*l6; pz = T->p[2]-T->a[2]*l6-l1z; rxy = sqrt(px*px+py*py); if( rxy < ly ) { rob_kin_set_warnings(WARN_UNREACH); return( WARN_UNREACH ); // TCP pose is not reachable } else if( rxy < sing_tolx ) { rob_kin_set_warnings(WARN_SINGULAR); // singular pose } if (fabs(ly)>0.0) { rx = rxy*rxy - ly*ly; if (rx<0.0) rx=0.0; else rx = sqrt( rx ); delta_theta1 = rob_kin_atan2(ly,rx); } else { rx = rxy; delta_theta1 = 0.0; } sig1 = -1.0; sig2 = -1.0; soln = 0; // soln counts the nunmber of solutions
IX-15
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
for( kk = 0; kk < 2; kk++ ) // kk - loop for sig1 { warning=WARN_OK; sig1 *= -1.0; rxm = rx - sig1*l1x; rr = sqrt( rxm*rxm + pz*pz ); if (rr 1.0 ) { if (cabs >1.0+KIN_EPSI) { warning = WARN_UNREACH; } if (c2>1.0) c2 = 1.0; else c2 = -1.0; } c3 = (l3*l3 + l2*l2 - rr*rr) / (2.0*l2*l3); if( (cabs=fabs(c3)) > 1.0 ) { if (cabs >1.0+KIN_EPSI) { warning = WARN_UNREACH; } if (c3>1.0) c3 = 1.0; else c3 = -1.0; } if (warning==WARN_OK) { theta[0] = -sig1*delta_theta1 + rob_kin_atan2(sig1*py,sig1*px); } else { for (i=kk*4;i<(kk+1)*4;i++) warnings[i] = WARN_UNREACH; soln = (kk+1)*4; }
IX-16
A P I
-
APPLICATION
PROGRAM
INTERFACE
for( jj = 0; jj < 2 && warning==WARN_OK; jj++ ) { // jj - loop for sig2 sig2 *= -1.0; theta[1] = sig1*(PI/2.0-rob_kin_atan2(pz,rxm)-sig2*acos(c2)) - delta_theta2; if (theta[1] < -PI) theta[1] += 2*PI; else if (theta[1] > PI) theta[1] -= 2*PI; theta[2] = -sig1*sig2*acos( c3 ) - delta_theta3 + delta_theta2; if( theta[2] < 0.0 ) theta[2] += PI; else theta[2] -= PI; c1 = cos( theta[0] ); s1 = sin( theta[0] ); c23 = cos( theta[2] + theta[1] ); s23 = sin( theta[2] + theta[1] ); nx = (T->n[0]*c1+T->n[1]*s1)*c23-T->n[2]*s23; ny = -T->n[0]*s1+T->n[1]*c1; nz = (T->n[0]*c1+T->n[1]*s1)*s23+T->n[2]*c23; ox = (T->o[0]*c1+T->o[1]*s1)*c23-T->o[2]*s23; oy = -T->o[0]*s1+T->o[1]*c1; oz = (T->o[0]*c1+T->o[1]*s1)*s23+T->o[2]*c23; ax = (T->a[0]*c1+T->a[1]*s1)*c23-T->a[2]*s23; ay = -T->a[0]*s1+T->a[1]*c1; az = (T->a[0]*c1+T->a[1]*s1)*s23+T->a[2]*c23; sig3 = -1.0; for( ii = 0; ii < 2 ; ii++ ) { sig3 *= -1.0;
// ii - loop for sig3
theta[5] = rob_kin_atan2( sig3*oz,-sig3*nz); c6 = cos(theta[5]); s6 = sin(theta[5]); theta[3] = rob_kin_atan2(-ox*c6-nx*s6,oy*c6+ny*s6); c4 = cos(theta[3]); s4 = sin(theta[3]); theta[4] = rob_kin_atan2(ax*c4+ay*s4,az); if( fabs( sin(theta[4]) ) < sing_tol_q5 ) { rob_kin_user_msg("inv_kin_user_2 WARN_SINGULAR"); warnings[soln] = WARN_SINGULAR; } else warnings[soln] = WARN_OK;
IX-17
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
for( i = 0; i < NUM_DOFS_2; i++ ) { q = inq_q(soln); // q is solution vector // consider joint sign and joint offsets q[i] = verpolt[i]*(theta[i] + joint_offset[i]); if (q[i] < -PI) q[i] += 2*PI; // solution within +/- PI else if (q[i] > PI) q[i] -= 2*PI; } soln++; // increase the solution number } /* for ii */ } /* for jj */ } /* for kk */ return(WARN_OK); } /* End of inv_kin_user_2*/
Motion Planning To be defined, see example file Ipo_user.cpp
Dynamics To be defined, see example file Dyn_user.cpp
IX-18
A P I
-
APPLICATION
PROGRAM
INTERFACE
API - Tables of Contents The tables bellow show the all-available API functions and short descriptions. Table 1. User Vector for Testing Nr.
Name of the
Function
Description
Table 2. Kinematics Nr.
Name of the Function
1
! " # $ % & ' ! & ( ) * + $ , ( -! * ' . / 0 ( ) * + $ . 1 2
2
! " # ( ) * + $ & ' ! & $ % , ( -! * ' . / 0 ( ) * + $ . 1 2
3
" 8 ' $ % & ' ! & ( ) * + $ & " # 9 , ( -! * ' . 0 ( ) * + $ . 1 0 " 8 ' ) ! ' & " # 9 2
Description
3 $ % '! ) '! 4 )* + $ 0 % * -% 5 - * ' $ 6 * 7 # " $ + 8 6 " ! 8 * 3 $ % ' ! ) , 9 0: 0; 0< 0 = 0 > 2 ' ! * @4 ) ) * " $ + 8 $ ' * ? ' " ! 8 A < 0 = 0 > " 6 B ! ' , 9 0 < 2 . B ! ',: 0= 2. B ! ',; 0> 2 4 )* + $ '! 3 $ % '! ) % * -% 5 - * ' $ 6 * ( ) * + $ " 8 ' ! * 7 # " + $ 8 6 "! 8 * - 3 $ % ' ! ) , 9 0: 0; 0< 0 = 0 > 2 3 $ % ' ! ) ' ! ( ) * + $ "8 # $ 9 % * -% 5 - * ' $ 6 * 7 # " $ + 8 6 " ! 8 * 3 $ % ' ! ) , 9 0: 0; 0C ) ! ' & "# 9 C 2 ' ! * 4 )* + $ ? 1 D $ ! ) "$ 8 ' * ' "! 8 # $ E $ 8 # 6 ! 8 ) ! @' & " # 9 A B 1 & F G H I J B ! ' F . B !@ ' G . B ! ' H < K G IB = B @ 1 & H G FI L B M ! L ' H . B ! ' G . B ! ' F L < 0 B $ "6 0 @B 1 & G F H I B ! ! N ' $ G - %. !B ! ' H . B ! ' H =@K>O B @ 1 & H G H I B ! 'H . B ! 'G . B ! 'H K ' * $ 5 N -" B @@ 1 & F G FI ' N # B 1 & B P GI B ! - - P " ' % D G * Q 0 B ! 'F . B ! 'G . B ! 'H 0 @B 1 & R M < 1 8 !I ' R ) 5$ * - * ' '$ " ) 8 $ " ! 8
IX-19
9
A P I
4
-
APPLICATION
PROGRAM
INTERFACE
" 8 ' ( ) * + $ & ' ! & $ % & " # 9 , ( -! * ' . 0 ( ) * + $ . 1 0 " 8 ' ) ! ' & " # 9 2 1 & + * -& 1 , 4 B < J . 1 ! 0 4 B < J . 1 " 0 4 B < J B & + * -& B , 4 B < J . 1 ! 0 4 B < J . 1 " 0 4 B < J "8 & 1 , 4 B < J . 1 ! 0 4 B < J . 1 "2 + 5 -& " 8 1 & 1 , 4 B < J . 1 ! 0 4 B < J . 1 " 0 4 B < + 5 -& 1 & " 8 1 , 4 B < J . 1 ! 0 4 B < J . 1 " 0 4 B < "8 % ) & 1 , 4 B < J . 1 "! 0 4 B < J . 1 "! 0 "8 ' "# 9 2
10
! "# ! "# ! "# ! "# ! "# ! "#
11
! "# "8 % ) & B , 4 B < J B "! 0 4 B < J . B "! 0 "8 ' "# 9 2
5 6 7 8 9
12 13 14 15 16 17
! "# ! "# ! "# ! "# ! "# ! "#
. 1 " 2 . 1 " 2 J . 1 " 2 J . 1 " 2
% E : & B , 4 B < J . B ! 0 4 B < JJ . B "2 + 5 -& 1 & E ! 6 , ( - ! * ' . E ! 0 4 B < . 1 0 ( -! * ' . E " 2 ) ! N & " 8 & 1 & + * -& 1 , ( ) * + $ . 1 " 8 0 ( ) * + $ . 1 " 8 2 ) ! N & " 8 & B & + * -& B , ( ) * + $ . 1 " 8 0 ( ) * + $ . 1 " 8 2 ) ! N & "8 & ( ) * + $ & "# $ 8 ' , ( ) * + $ . 1 2 ) ! N & " 8 & ) ! ' , " 8 ' ) ! ' & " # 9 0 # ! 5 N -$ / 0 ( ) * + $ . 1 2
20
! " # ) ! N & " 8 & ' ) * 8 6 , ( ) * + $ . 1 0 # ! 5 N -$ 9 0 # ! 5 N - $ : 0 # ! 5 N -$ ; 2 ! "# # D & ' ! & ( ) * + $ , B @ = & O . ) # D 0 ( ) * + $ . 1 2 "8 ' ) ! N & "8 & ! "8 ' & ' ) * 8 6 , "8 ' ! "8 ' & # ! ( 2
21
"8 ' ) ! N & "8 & ! "8 ' & ) ! ' , "8 ' ! "8 ' & # ! ( 2
22
( -! * ' ) ! N & " 8 & ' ! & J , " 8 ' ! " 8 ' & # ! ( 2 ( -! * ' ) ! N & " 8 & ' ! & B < , " 8 ' ! " 8 ' & # ! ( 2
18 19
23
IX-20
<== 4 ) * + $ ' ! $ % ' ! ) "8 # $ 9 0 % * -% 5 - * ' $ 6 * ( ) * + $ " 8 ' ! * 7 # " + $ 8 6 "! 8 * - 3 $ % ' ! ) , 9 0: 0; 0C ) ! ' & "# 9 C 2 6 $ $ $ % & ' ! & ( ) * + $ & "# 9 , 2 4 ) * + $ 5 -' " E - " % * ' " ! 8 1 ! 1 @" . 1 " 4 ) * + $ ) " $ 8 ' * ' " ! 8 5 -' " E - " % * ' " ! 8 1 ! 1 " . 1 " 8 $ ) 6 $ + * ' ) "9 1 ! "8 , 1 "2 4 ) * + $ 5 -' " E - " % * ' " ! 8 1 ! "8 , 1 " 2 . 1 " 4 ) * + $ 5 -' " E - " % * ' " ! 8 1 ! 1 " . "8 , 1 " 2 8 % ) $ + $ 8 ' 1 ) * 8 6 + * ' ) "9 "# 9 A 1 "! 1 "! . 1 "! "# 9 A 1 "! 1 "! . 1 "! 8 % ) $ + $ 8 ' B ! ' + * ' ) "9 "# 9 A B "! B "! . B "! "# 9 A B "! B "! . B "! > ! E : "8 * ' ) "9 B ! B " 1 )* 8 6 (! )+ $ 6 * $ % '! ) E! 1 . E" 4 ) * + $ 5 -' " E - " % * ' " ! 8 1 "8 1@ "8 . 1 "8 4 ) * + $ ) " $ 8 ' * ' " ! 8 5 -' " E - " % * ' " ! 8 1 "8 1 "8 . 1 "8 K $ ' 6 4 ) * + $ 1 # $ 8 ' + * ' ) "9 > * -% 5 - * ' $ 6 4 ) * + $ 1 / I * 8 -$ " 8 ) * # ) ! @' & " # 9 " 6 @ B 1&F 0B 1&G !)B @ 1&H > * -% 5 - * ' $ 6 4 ) * + $ 1 1 , "# $ 8 ' 9 0: 0 ; 2 > * -% 5 - * ' $ 6 4 ) * + $ 1 ( ) ! + O E * )* + $ '$ )0 6 $ $ > D * E '$ ) > D $ % 6 Q $ ' D $ ) ' D $ ! "8 ' "6 ) ! ' * ' "! 8 * - ! ) ' ) * 8 6 -* ' "! 8 * -?
! "8 ' & # ! ( "6 8 5 + N $ ) ! ( ! "8 ' B $ ' 5 ) 8 " ( ! " 8 ' " 6 ' ) * 8 6 -* ' " ! 8 * > D $ % 6 Q $ ' D $ ) ' D $ ! "8 ' "6 ) ! ' * ' "! 8 * - ! ) ' ) * 8 6 -* ' "! 8 * -?
! "8 ' & # ! ( "6 8 5 + N $ ) ! ( ! "8 ' B $ ' 5 ) 8 "( ! "8 ' "6 ) ! ' * ' "! 8 * B $ ' 5 ) 8 6 P ? "( ! "8 ' "6 ) ! ' * ' " ! 8 * - 0 $ -6 $ B $ ' 5 ) 8 6 P ? "( ! "8 ' " 6 ) ! ' * ' " ! 8 * - 0 $ -6 $
A P I
24
-
APPLICATION
( -! * ' * 6 6 6 , ( -! * ' N $ ' * 0 ( - ! * ' 6 0 ( -! * ' 6 2
PROGRAM
1 ) " * 8 -$ > * -% 5 - * ' " ! 8 A 8 A N $ ' * 0 < 0 = B $ '5 )8 A >
alfa
B
INTERFACE
C
beta
gamma A
25
( -! * ' * 6 6 * , ( -! * ' N $ ' * 0 ( -! * ' 6 0 ( - ! * ' 6 2
26
( -! * ' * 6 6 * , ( - ! * ' N $ ' * 0 ( -! * ' 6 0 ( -! * ' 6 2
27
( -! * ' 6 6 6 * , ( -! * ' 6 0 ( - ! * ' 6 0 ( -! * ' 6 2
28
( -! * ' 6 * 6 6 6 * , ( -! * ' 6 0 ( -! * ' # $ -' * 0 ( -! * ' 6 0 ( -! * ' 6 0 ( -! * ' 6 2 C
1 ) " * 8 -$ > * -% 5 - * ' " ! 8 A 8 A N $ ' * 0 < 0 = B $ '5 )8 A * + + * 1 ) " * 8 -$ > * -% 5 - * ' " ! 8 A 8 A N $ ' * 0 < 0 = B $ ' 5 ) 8 A * -( * 1 ) " * 8 -$ > * -% 5 - * ' " ! 8 A 8 A < 0 = 0 > B $ ' 5 ) 8 A * -( * 1 ) " * 8 -$ > * -% 5 - * ' " ! 8 A 8 A < 0 # $ -' * 0 = 0 > 0
B $ ' 5 ) 8 A * -( * 0 ! E E ! 6 " ' $ * 8 - $ ()! + < J 9 * + E -$ A < 0 # $ -' * 0 = 0 > 0
? * -( * 6 * 6 6 6 * , < 0 # $ -' * . B < 0 = 0 > 0 2 ?7 . B <
beta
alfa
D
B
gamma
delta
A
29 30 31 32 33 34 35 36 37 38
( ) * + $ ." 8 / & 1 , ! " # 2 ( ) * + $ ." 8 / & N 1 ' , ! " # 2 ( ) * + $ ." 8 / & N 1 , ! " # 2 ( ) * + $ ." 8 / & ' 1 Q , ! " # 2 ( - ! * ' ." 8 / & / & 6 ! - 5 ' , ! " # 2 ( - ! * ' ." 8 / & & 6 ! - 5 ' , ! " # 2 ( - ! * ' ." 8 / & * & 6 ! - 5 ' , ! " # 2 ( ) * + $ ." 8 / & N 1 Q , ! " # 2 ( ) * + $ ." 8 / & " 1 N , ! " # 2 ( ) * + $ ." 8 / & " 1 N & 6 ' ) ' , ! " # 2
B ! N ! ' = * 6 $ ' ! 1 "E K * + $ * 6 . "8 / & 1 , 2 B ? = * 6 $ ' ! 8 ' ! ( "8 ? % D * "8 1 ! ! - ( ) * + $ A B ! N ! ' 1 "E ' ! 1 > P , Q "6 Q ) "6 ' 2
$ 6 ") $ # 8 ' * 9 "6 * -5 $ 6
$ 6 " ) $ # ! " 8 ' 6 E $ $ # * -5 $ 6
$ 6 ") $ # ! "8 ' * % % $ - * -5 $ 6 B ! N ! ' = * 6 $ '! 1 > P ! ) -# ' ! ) ! N ! ' N * 6 $ K ' * ) ' ( ) * + $ A Q ! ) -# ' ! ) ! N ! ' N * 6 $ ! ' $ A D $ 8 B 5 8 * 6 " + 5 -* ' "! 8 0 ' D $ ) ! N ! ' Q " -- 5 + E ' ! "6 ' 6 ' * ) ' -! % * ' " ! 8 0 6 5 % D * 6 ' D $ ' ) * 8 6 ( ! ) + ' * ' "! 8 . "8 / & "1 N , 2 * ' D ( 5 8 % ' "! 8 * ' * 8 K $ ' * ) 8 "8 ( ! ) * -- ) ! N ! ' % ! 8 ( " 5 ) * ' "! 8 6 Q * ) 8 & "# 9@ A L
39 40
# ! 5 N -$ ) ! N & " 8 & * ' * 8 , # ! 5 N - $ 0 # ! 5 N -$ 2 ! "# ) ! N & "8 & 6 $ ' & Q * ) 8 "8 6 , "8 ' Q * ) 8 & "# 9 2
IX-21
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
< B & M B J < > O @4 L < B & & J J3 J J
K * $ 6 * + $ 6 6 * $ "8 ' D $ + ! 8 " ' ! ) " 8 ( " -$ moni_msg.dat > * -% 5 - * ' $ ( ! ) Q * ) # " 8 $ + * ' " % 1 "6 ) ! N ! ' N * 6 $ ' ! 1 "E ? , ) ! N ! ' N * 6 $ ' ! 1 > P " 6 * -6 ! % * -% 5 - * ' $ # 0 . " 8 / & N 1 Q , 2 2 ( ' D $ ) ! N ! ' ! "8 ' "6 ) ! ' * ' "! 8 * -0 ' D "6 ) ! 5 ' "8 $ + * $ 6 6 5 ) $ ' D * ' . / * ) $ Q "' D "8 I P 0 P > * -% 5 - * ' $ 6 ' D $ " 8 $ ) 6 $ "8 $ + * ' "% 6 ! -5 ' "! 8 ( ! ) % 5 ) ) $ 8 ' -! * # $ # ) ! N ! ' ? N 1 ' A ) ! N ! ' N * 6 $ ' ! 1 "E B $ 6 5 -' A . " 8 / & / & 6 ! - 5 ' , 2 ! '$ A 1 D $ 5 6 $ ) # $ ( "8 $ # "8 $ ) 6 $ "8 $ + * ' "% 6 ! -5 ' "! 8 , < P I 3 2 "6 %M * - -$ # " 6 6 E $ % " ( " $ # ? 8 " $ ) 6 * - > ! ! ) # "8 * ' $ 6 A $ 8 ' D "8 H I # ") $ % ' "! 8 6 $ $ $ 9 * + E - $ ( " -$ inv_user.cpp "M 8 ' " 8 & " 8 & 5 6 $ ) & , ( ) * + $ . N 1 ' 2 @ 8( ( " 6 $ $ ' ) 6 * 0 - - $ > 8 ! ! ' )D # " " 8 8 * F ' $ I # 6 " A ) $ % ' " ! 8 M 8 " $ ) 6 * - > ! ! ) # "8 * ' $ 6 A @ ( ( 6 $ ' 0 -$ 8 ' D " 8 G I # " ) $ % ' " ! 8 M 8 " $ ) 6 * - > ! ! ) # "8 * ' $ 6 A BM ! ' * ' " ! 8 * N ! 5 ' F* 9 " 6 8 " $ ) 6 * - > ! ! ) # "8 * ' $ 6 A MB !8 '" * $ ' " )! 6 8 * *- >N !! 5! ' ) # G" 8 * * 9 ' $ " 6 6 A MB !8 '" * $ ' " )! 6 8 * *- >N !! !5 ' ) # H " 8 * * 9 ' $" 6 6 * 8 # O A 1 ) * 8 6 ( ! ) + * ' "! 8 ( ) ! + ! "8 ' 8 ' !
J! " 8 ' 8 A 9 * + E -$ A ( ) * + $ . 1 "8 / & * % D 6 & 1 , 2 "6 ' ) * 8 6 ( ! ) + * ' "! 8 ( ) ! + ! "8 ' ' !
! "8 ' 7 K "8 5 -* ) "' : ' ! ! ! "8 ' ! ( ( 6 $ ' P ! "8 ' $ ) ' ! ! 8 $ 6 $ ' ! ( 6 ! -5 ' "! 8 * 8 - $ 6 % * -% 5 - * ' $ 6 N : ' D $ "8 $ ) 6 $ "8 $ + * ' "% 6 6J ! - 8 A % ! 8 ( " 5 ) * ' " ! 8 8 5 + N $ ) 9 * + E -$ A ( -! * ' . / " 8 / & / , 2 6 ! -5 ' " ! 8 * - 5 $ 6 ( ! ) ' D $ ! " 8 ' % ! 8 ( " 5 ) * ' "! 8 * ) 8 "8 "8 ' . Q * ) 8 "8 6 "8 / & Q * ) 8 "8 6 , 2 6 $ $ ! "# ) ! N & "8 & 6 $ ' & Q * ) 8 "8 6
41
! "# ) ! N & "8 & 5 6 $ ) & + 6 , % D * ) . 6 2
42
"8 ' ) ! N & "8 & ! ) ' ) * 8 6 , ( ) * + $ . 1 2
43
" 8 ' ) ! N & " 8 & / & " 8 & ' ) * $ - & ) * 8 $ , ( -! * ' . / 2
44
"8 ' ) ! N & "8 & "8 , ( ) * + $ . N 1 ' 2
45
46 47 48 49 50 51
# ! 5 N - $ ." 8 / & * % D 6 & - $ 8 ' D , ! " # 2 # ! 5 N - $ ." 8 / & * % D 6 & ! ( ( 6 $ ' 6 , ! " # 2 # ! 5 N - $ ." 8 / & * % D 6 & ! ( ( 6 $ ' 6 , ! " # 2 # ! 5 N - $ ." 8 / & * % D 6 & ) ! ' 9 , ! " # 2 # ! 5 N - $ ." 8 / & * % D 6 & ) ! ' : , ! " # 2 # ! 5 N - $ ." 8 / & * % D 6 & ) ! ' ; , ! " # 2 ( ) * + $ ." 8 / & * % D 6 & 1 , ! " # 2
52 53 54
# ! 5 N - $ ." 8 / & 6 " 8 & ' ! - , ! " # 2 # ! 5 N - $ ." 8 / & ! " 8 ' & ! ( ( 6 $ ' , ! " # 2 ( - ! * ' ." 8 / & / , " 8 ' 6 ! - 8 2
55
IX-22
" 8 ' ." 8 / & Q * ) 8 " 8 6 , ! " # 2
A P I
56 57 58 59 60
" 8 ' ." 8 / & $ ) E ! - ' , ! " # 2 "8 ' "8 / & 8 5 + & # ! ( 6 , ! "# 2 "8 ' "8 / & 8 5 + & E * 6 6 " & 8 ' 6 , ! "# 2 "8 ' "8 / & 8 5 + & % ! 8 ( " 6 , ! "# 2 "8 ' "8 / & % ! 8 ( " , ! "# 2
-
APPLICATION
PROGRAM
INTERFACE
! "8 ' 6 " 8 " 8 ' . 6 " 8 " 8 / @ & $ ) E ! -' , 2 5+ N$)!( 4 5 + N $ ) ! ( E * 6 6 " $ 8 '? 5 + N $ ) ! ( % ! 8 ( " 5 ) * ' "! 8 > 5 ) ) $ 8 ' B ! N ! ' > ! 8 ( " 5 ) * ' "! 8 5+ N$) ! '$ A % ! 8 ( " 5 ) * ' "! 8 ) $ ' 5 ) 8
@O L " 8 $ + * ' " % 6 B =& O .J # D " 8 / & ) ! N & # D & * % ' " , 2 9 * + E -$ A < % % $ 6 6 '! O E * )* + $ '$ ) ! ( 'D $ ( ") 6 ' ' * % ' " $ ! "8 ' A
D ?' D $ ' * 0 D ?#
D ? * 0 D ? * -( *
O L "8 $ + * ' "% 6 * % % $ 6 6 '! 'D $ O E * )* + $ '$ ) ( ) ! + ' D $ E * 6 6 " $ ! "8 ' ? 1 ) * 8 6 ( ! ) + * ' "! 8 ( ) ! + ' D $
! @" 8 ' ' D $ ? B = & O .)# D , "8 / & ) ! N & # D & E * 6 6 " , 2 E * 6 6 " $J & ! " 8 ' & 8 ! 2 9 * + E -$ A )# D I 'D $ '* 0 )# D I # ) # D L I * 0 ) # D I * -( *
O "8 $ + * ' "% 6 * % % $ 6 6 '! 'D $ O E * )* + $ '$ ) ( ) ! + ' D $ E * 6 6 " $ ! "8 ' ? 1 ) * 8 6 ( ! ) + * ' "! 8 ( ) ! + ' D $ 'D $
! "8 ' ? B @ = & O .)# D , "8 / & ) ! N & # D & E * 6 6 " , 2 E * 6 6 " $ &J ! " 8 ' & 8 ! 2 9 * + E -$ A )# D I 'D $ '* 0 )# D I # ) # D I * 0 ) # D I * -( * B ! N ! ' < ' ' ) "N 5 ' $ 6 A O ! + $ E ! 6 "' "! 8 B ! N ! ' < ' ' ) " N 5 ' $J 6 A * 9 ! "8 ' K K ! ( ' Q * ) $ J 8 # 6 Q "' % D B ! N ! ' < ' ' ) " N 5 'J $ 6 A "8 ! "8 ' K K ! ( ' Q * ) $ J 8 # 6 Q "' % D B ! N ! ' < ' ' ) "N 5 ' $ 6 A * 9 ! " 8 ' 3 $ -! % " ' : B ! N ! ' < ' ' ) "N 5 ' $ 6 A * 9 ! " 8 ' < % % $ -$ ) * ' " ! 8 B ! N ! ' < ' ' ) "N 5 ' $ 6 A * 9 ! "8 ' 1 ! ) / 5 $ 6 B ! N ! ' < ' ' ) "N 5 ' $ 6 A B!N!'8*+ $
J " ) $ % ' " ! 8 ! ( * % ' " $ 8 ' ? 9 * + E -$ A H H H H F B ! N ! ' D * 6 ! "8 ' 0 ! "8 ' I "8 H I
61
B @ = & O ." 8 / & ) ! N & # D & * % ' " , ! " # 2
62
B @ = & O ." 8 / & ) ! N & # D & E * 6 6 " , ! " # 2
63
B @ = & O ." 8 / & ) ! N & # D & E * 6 6 " , ! " # 2
64 65
( - ! * ' ." 8 / & D ! + $ E ! 6 , ! " # 2 ( - ! * ' ." 8 / & 6 Q $ & + * 9 , ! " # 2
66
( -! * ' . " 8 / & 6 Q $ & + " 8 , ! " # 2
67 68 69 70 71
( -! * ' . " 8 / & & + * 9 , ! " # 2 ( -! * ' . " 8 / & * & + * 9 , ! " # 2 ( -! * ' . " 8 / & ' & + * 9 , ! " # 2 % D * ) ." 8 / & ) ! N ! ' 8 * + $ , ! " # 2 % D * ) ." 8 / & " 8 & # " ) $ % ' " ! 8 & * % ' " , ! " # 2
IX-23
9
A P I
72
-
APPLICATION
PROGRAM
INTERFACE
% D * ) ." 8 / & " 8 & ' : E $ & * % ' " , ! " # 2
# ") $ % ' "! 8 0 ! "8 ' "6 "8 F I # ") $ % ' "! 8 6L $ $ " 8 / & " 8 & ' : E $ & * % ' " , ! " # 2 J 9" 8 * $ + + E * - $' " % A 6 1 ' : 1 E 1 $ B ! B ( * % ' " $ 8 ' ? B ! N ! ' D * 6 ! "8 ' 0 ! "8 ' I * ) $ 1 ) * 8 6 -* ' "! 8 * -0 ! "8 ' * 8 # * ) $ B ! ' * ' "! 8 * 6$$ A "L 8 / & " 8 & # " ) $ % ' " ! 8 & * % ' " , ! " # 2 "8 $ + * ' "% 6 "# $ 8 ' "( "% * ' "! 8 ? > * ) ' $ 6 "* 8 E ! 6 "' "! 8 $ ) ) ! ) 0 1 > P Q ?) ?' ? ) ! N ! ' N * 6 $
! "8 ' E ! 6 "' "! 8 $ ) ) ! )
") $ % ' "! 8 ! ( P * 6 6 " $ ! "8 ' 6*+ $ *6 "8 / & "8 & # ") $ % ' "! 8 & * % ' " , ! "# 2 0 N 5 ' ( ! ) E * 6 6 " $ ! "8 ' 6 6*+ $ *6 "8 / & "8 & ' : E $ & * % ' " , ! "# 2 0 N 5 ' ( ! ) EL * 6 6 " $ ! " 8 ' 6 J 9" 8 * $ + + E * - $' " % A 6 > > & DI * " 8 1 : E $ B ! N ! ' D * 6 E * 6 6 " $ ! "8 ' 6 8 ' ? "6 "8 ' D $ "8 $ + * ' "% % D * "8 8 ' ? "6 @ 1 "8 ' D $ "8 ? % @D * "8 8 ' ? "6 6 $ E * ) * ' $ # * 8 # 1 "8 ' D $ "8 ? % D * "8 K ' ) "8 ( ! ) + * ' D ? $ E $ 8 # $ 8 % : ( 5 8 % ' "! 8 < ''* % D + $ 8 ' 8 5 + N $ ) (! ) E * 6 6 " $
! "8 ' ? "8 ' . "8 & * ' ' & # ! ( "8 / & "8 & * ' ' * % D & # ! ( , 2 "8 & * ' ' & # ! ( "6 ' D $ * ' ' * % D + $ 8 ' 8M 5 + N $ ) ! ( ' D $ ( " ) 6 ' E * 6 6 " $ ! " 8 ' 8 " $ ) 6 * - > ! ! ) # "8 * ' $ 6 * % % $ 6 6 ' ! ' D $ 1 ) * 8 6 ( ! ) + * ' "! 8 ( ) ! + ' D $ ! "8 ' ' D $ ? KM $ $ " 8 / & ) ! N & # D & E * 6 6 " , 2 8 " $ ) 6 * - > ! ! ) # "8 * ' $ 6 * % % $ 6 6 ' ! ' D $ 1 ) * 8 6 ( ! ) + * ' "! 8 ()! + 'D $ 'D $
! "8 ' ? K $ $ "8 / & ) ! N & # D & E * 6 6 " , 2 1 $ + E ! )* ): ()* + $ 5 6 $ # '! % * -% 5 - * ' $ ' D $ " 8 $ + * ' " % % D * " 8 K * $ 6 * + $ 6 6 * $ "8 ' ! ' D $ + ! 8 " ' ! ) " 8 ( " -$ moni_msg.dat J 9 * + E -$ A + ! 8 "& + 6 , C + 6 # 6 C 0 8 & + 6 0 C % * -- + : ( 5 8 % ' "! 8 C 2 K * $ 6 * 4 ) * + $ "8 ' ! ' D $ + ! 8 " ' ! ) " 8 ( " -$ moni_msg.dat K * $ 6 * ( -! * ' $ % ' ! ) " 8 ' ! ' D $ + ! 8 " ' ! ) " 8 ( " -$
75 76
"8 ' . "8 / & "8 & "# , ! "# 2 ( - ! * ' ." 8 / & N # 9 Q , ! " # 2 ( - ! * ' ." 8 / & # / , ! " # 2 % D * ) ." 8 / & " 8 & # " ) $ % ' " ! 8 & E * 6 6 " , ! " # 2
77
% D * ) ." 8 / & " 8 & ' : E $ & E * 6 6 " , ! " # 2
78
% D * ) ." 8 / & " 8 & % D * " 8 & ' : E $ , ! " # 2
73 74
80
% D * ) ." 8 / & " 8 & % * - % , " 8 ' E * 6 6 " & 8 ' & 8 ! 2 " 8 ' ." 8 / & " 8 & * ' ' * % D & # ! ( , ! " # 2
81
( ) * + $ ." 8 / & " 8 & * % D 6 & 1 & E * 6 6 " , " 8 ' E * 6 6 " & 8 ' & 8 ! 2
79
82
( ) * + $ ." 8 / & " 8 & * % D 6 & 1 & E * 6 6 " , " 8 ' E * 6 6 " & 8 ' & 8 ! 2
83 84
( ) * + $ ." 8 / & " 8 & 1 & E * 6 6 " , " 8 ' E * 6 6 " & 8 ' & 8 ! 2 "8 ' + ! 8 "& + 6 , % D * ) . ( + ' 0 ? ? ? 2
! "# + ! 8 "& 1 , % D * ) . 6 0( ) * + $ . 1 2
86
! " # + ! 8 " & , % D * ) . 6 0 ( - ! * ' . 0 " 8 ' 8 0 ( -! * ' 6 % * - 2
IX-24
85
A P I
-
APPLICATION
PROGRAM
INTERFACE
J 9 * + E -$ + ! 8 "& , C ' 9 ' C 0 0 8 0 J 2 K * $ 6 * # ! 5 N -$ $ % ' ! ) " 8 ' ! ' D $ + ! 8 " ' ! ) " 8 ( " -$ moni_msg.dat J 9 * + E -$ + ! 8 "& - , C ' 9 ' C 0 0 8 0 J 2 K * $ 6 * 8 "8 ' $ % ' ! ) "8 ' ! ' D $ + ! 8 " ' ! ) " 8 ( " -$ moni_msg.dat J 9 * + E -$ + ! 8 "& ", C ' 9 ' C 0 " 0 8 2 K * $ 6 * 6 D ! ) ' $ % ' ! ) "8 ' ! ' D $ + ! 8 " ' ! ) " 8 ( " -$ moni_msg.dat J 9 * + E -$ + ! 8 "& 6 , C ' 9 J ' C 0 6 0 8 2 $ 6 6 * $ ) ) ! ) = ! 9 Q " -- % ! + $ 5 E $ 6 6 * $ = ! 9 Q "-- % ! + $ 5 E 8 ( ! ) + * ' "! 8 "8 $ 6 $ $ 8 "8 ' D $ + $ 6 6 * $ Q "8 # ! Q 5 + $ ) " % * - K ! -5 ' " ! 8 A 1 ! -$ ) * 8 % $ ( ! ) B ! ' * ' " ! 8 5 + $ ) " % * - K ! -5 ' " ! 8 A 1 ! -$ ) * 8 % $ ( ! ) 1 ) * 8 6 -* ' " ! 8 5 + $ ) " % * - K ! -5 ' " ! 8 A 5 + N $ ) ! ( ' $ ) * ' "! 8 6 5 + $ ) " % * - K ! -5 ' " ! 8 A * 6 $ % '! ) 5 + $ ) " % * - K ! -5 ' " ! 8 A ! "8 ' Q $ " D ' $ % ' ! ) 5 + $ ) " % * - K ! -5 ' " ! 8 A 1 * ) $ ' -! % * ' " ! 8 0 ) ! N ! ' N * 6 $ ' ! 1 "E
moni_msg.dat
87
! " # + ! 8 " & - , % D * ) . 6 0 # ! 5 N -$ . 0 " 8 ' 8 0 ( -! * ' 6 % * - 2
88
! "# + ! 8 "& " , % D * ) . 6 0 "8 ' . 0 "8 ' 8 2
89
! "# + ! 8 "& 6 , % D * ) . 6 0 6 D ! ) ' . 0 " 8 ' 8 2 ! "# J ) ) ! ) J 9 "' = ! 9 , % D * ) . 6 2 ! "# 6 = ! 9 , % D * ) . 6 2 ! " # & " 8 ( ! & - " 8 $ , " 8 ' % ! -! ) 0 % D * ) . 6 2 # ! 5 N -$ . " 8 / & 5 8 " & ' ) * 8 6 & ' ! -& ) * # , ! " # 2 # ! 5 N -$ . " 8 / & 5 8 " & ' ) * 8 6 & ' ! -& + , ! " # 2 "8 ' . "8 / & 5 8 " & ' ) * 8 6 & " -" + "' , ! "# 2 # ! 5 N -$ . " 8 / & 5 8 " & ' ) * 8 6 & + * 6 , ! " # 2 # ! 5 N -$ . " 8 / & 5 8 " & ' ) * 8 6 & Q $ " D ' , ! " # 2 ( ) * + $ . . "8 / & 5 8 " & ' ) * 8 6 & 1 , ! "# 2
90 91 92 93 94 95 96 97 98
Table 3. Dynamics Nr.
Name of the Function
Description
IX-25
9
A P I
-
APPLICATION
PROGRAM
INTERFACE
Table 4. Motion Planer Nr.
Name of the Function
IX-26
Description
-
APPLICATION
A P I
PROGRAM
INTERFACE
Table 5. Tag Nr.
Name of
the Function
Description
IX-27
9
A P I
-
APPLICATION
PROGRAM
Table 6. Collision Nr.
Name of the Function
Table 6. Stop On Nr.
IX-28
Name of the Function
INTERFACE
Description
Description