|
FUNCTION convert_spatial_to_ypr_rotation (pair : kinematic_pair, rotation : spatial_rotation) : ypr_rotation; LOCAL axis : direction ; angle : plane_angle_measure ; conv_angle : plane_angle_measure ; ya , pa , ra : plane_angle_measure ; ucf : REAL ; dx , dy , dz : REAL ; s_a , c_a : REAL ; rotmat : ARRAY [ 1 : 3 ] OF ARRAY [ 1 : 3 ] OF REAL ; cm1 : REAL ; s_y , c_y : REAL ; s_r , c_r : REAL ; END_LOCAL ; IF 'kinematic_structure_schema.ypr_rotation' IN TYPEOF ( rotation ) THEN RETURN ( rotation ) ; END_IF ; axis := normalise ( rotation \ rotation_about_direction . direction_of_axis ) ; angle := rotation \ rotation_about_direction . rotation_angle ; IF ( angle = 0.0 ) THEN RETURN ( [ 0.0 , 0.0 , 0.0 ] ) ; END_IF ; dx := axis . direction_ratios [ 1 ] ; dy := axis . direction_ratios [ 2 ] ; dz := axis . direction_ratios [ 3 ] ; conv_angle := plane_angle_for_pair_in_radian ( pair , angle ) ; IF ( conv_angle = ? ) THEN RETURN ( ? ) ; END_IF ; ucf := angle / conv_angle ; s_a := SIN ( conv_angle ) ; c_a := COS ( conv_angle ) ; IF ( dy = 0.0 ) AND ( dx * dz = 0.0 ) THEN REPEAT WHILE ( conv_angle <= - PI ) ; conv_angle := conv_angle + 2.0 * PI ; END_REPEAT ; REPEAT WHILE ( conv_angle > PI ) ; conv_angle := conv_angle - 2.0 * PI ; END_REPEAT ; ya := ucf * conv_angle ; IF ( conv_angle <> PI ) THEN ra := - ya ; ELSE ra := ya ; END_IF ; IF ( dx <> 0.0 ) THEN IF ( dx > 0.0 ) THEN RETURN ( [ 0.0 , 0.0 , ya ] ) ; ELSE RETURN ( [ 0.0 , 0.0 , ra ] ) ; END_IF ; ELSE IF ( dz > 0.0 ) THEN RETURN ( [ ya , 0.0 , 0.0 ] ) ; ELSE RETURN ( [ ra , 0.0 , 0.0 ] ) ; END_IF ; END_IF ; END_IF ; IF ( ( dy <> 0.0 ) AND ( dx = 0.0 ) AND ( dz = 0.0 ) ) THEN IF ( c_a >= 0.0 ) THEN ya := 0.0 ; ra := 0.0 ; ELSE ya := ucf * PI ; ra := ya ; END_IF ; pa := ucf * ATAN ( s_a , ABS ( c_a ) ) ; IF ( dy < 0.0 ) THEN pa := - pa ; END_IF ; RETURN ( [ ya , pa , ra ] ) ; END_IF ; cm1 := 1.0 - c_a ; rotmat := [ [ dx * dx * cm1 + c_a , dx * dy * cm1 - dz * s_a , dx * dz * cm1 + dy * s_a ] , [ dx * dy * cm1 + dz * s_a , dy * dy * cm1 + c_a , dy * dz * cm1 - dx * s_a ] , [ dx * dz * cm1 - dy * s_a , dy * dz * cm1 + dx * s_a , dz * dz * cm1 + c_a ] ] ; IF ( ABS ( rotmat [ 1 ] [ 3 ] ) = 1.0 ) THEN BEGIN IF ( rotmat [ 1 ] [ 3 ] = 1.0 ) THEN pa := 0.5 * PI ; ELSE pa := - 0.5 * PI ; END_IF ; ra := 0.0 ; ya := ATAN ( rotmat [ 2 ] [ 1 ] , rotmat [ 2 ] [ 2 ] ) ; IF ( rotmat [ 2 ] [ 2 ] < 0.0 ) THEN IF ya <= 0.0 THEN ya := ya + PI ; ELSE ya := ya - PI ; END_IF ; END_IF ; END ; ELSE BEGIN ya := ATAN ( - rotmat [ 1 ] [ 2 ] , rotmat [ 1 ] [ 1 ] ) ; IF ( rotmat [ 1 ] [ 1 ] < 0.0 ) THEN IF ( ya <= 0.0 ) THEN ya := ya + PI ; ELSE ya := ya - PI ; END_IF ; END_IF ; ra := ATAN ( - rotmat [ 2 ] [ 3 ] , rotmat [ 3 ] [ 3 ] ) ; IF ( rotmat [ 3 ] [ 3 ] < 0.0 ) THEN IF ( ra <= 0.0 ) THEN ra := ra + PI ; ELSE ra := ra - PI ; END_IF ; END_IF ; s_y := SIN ( ya ) ; c_y := COS ( ya ) ; s_r := SIN ( ra ) ; c_r := COS ( ra ) ; IF ( ( ABS ( s_y ) > ABS ( c_y ) ) AND ( ABS ( s_y ) > ABS ( s_r ) ) AND ( ABS ( s_y ) > ABS ( c_r ) ) ) THEN cm1 := - rotmat [ 1 ] [ 2 ] / s_y ; ELSE IF ( ( ABS ( c_y ) > ABS ( s_r ) ) AND ( ABS ( c_y ) > ABS ( c_r ) ) ) THEN cm1 := rotmat [ 1 ] [ 1 ] / c_y ; ELSE IF ( ABS ( s_r ) > ABS ( c_r ) ) THEN cm1 := - rotmat [ 2 ] [ 3 ] / s_r ; ELSE cm1 := rotmat [ 3 ] [ 3 ] / c_r ; END_IF ; END_IF ; END_IF ; pa := ATAN ( rotmat [ 1 ] [ 3 ] , cm1 ) ; END ; END_IF ; ya := ya * ucf ; pa := pa * ucf ; ra := ra * ucf ; RETURN ( [ ya , pa , ra ] ) ; END_FUNCTION; -- convert_spatial_to_ypr_rotation |
|
public class FConvert_spatial_to_ypr_rotation public static Value run(SdaiContext _context, Value pair, Value rotation) |