Integrated application resource: Kinematics ISO 10303-105:2019(E)
© ISO

Cover page
Table of contents
Copyright
Foreword
Introduction
1 Scope
2 Normative references
3 Terms, definitions and abbreviated terms
    3.1 Terms and definitions
    3.2 Abbreviated terms
4 Kinematic property
   4.1 General
   4.2 Fundamental concepts and assumptions
   4.3 Kinematic property entity definitions
   4.4 Kinematic property subtype constraint definition

5 Kinematic topology
   5.1 General
   5.2 Fundamental concepts and assumptions
   5.3 Kinematic topology type definition
   5.4 Kinematic topology entity definitions
   5.5 Kinematic topology subtype constraint definition
   5.6 Kinematic topology function definitions
6 Kinematic structure
   6.1 General
   6.2 Fundamental concepts and assumptions
   6.3 Kinematic structure type definitions
   6.4 Kinematic structure entity definitions
   6.5 Kinematic structure subtype constraint definition
   6.6 Kinematic structure function definitions

7 Kinematic state
   7.1 General
   7.2 Fundamental concepts and assumptions
   7.3 Kinematic state type definitions
   7.4 Kinematic state entity definitions
   7.5 Kinematic state subtype constraint definition
   7.6 Kinematic state function definitions
8 Kinematic motion representation
   8.1 General
   8.2 Fundamental concepts and assumptions
   8.3 Kinematic motion representation type definitions
   8.4 Kinematic motion representation entity definitions
   8.5 Kinematic motion representation subtype constraint definitions
9 Kinematic analysis control and result
   9.1 General
   9.2 Fundamental concepts and assumptions
   9.3 Kinematic analysis control and result type definitions
   9.4 Kinematic analysis control and result entity definitions
   9.5 Kinematic analysis control and result subtype constraint definition
A Short names of entities
B Information object registration
C Computer interpretable listings
D EXPRESS-G diagrams
E Technical discussion
F Change history
Bibliography
Index

(*
ISO/TC 184/SC 4/WG 12 N8482 - ISO 10303-105 Kinematics - EXPRESS
Supersedes ISO/TC 184/SC 4/WG 12 N7301
*)



SCHEMA kinematic_structure_schema;

REFERENCE FROM kinematic_topology_schema;    -- ISO 10303-105

REFERENCE FROM geometry_schema   -- ISO 10303-42
  (axis2_placement_3d,
   cartesian_transformation_operator_3d,
   curve,
   direction,
   geometric_representation_context,
   geometric_representation_item,
   normalise,
   point,
   point_on_curve,
   point_on_surface,
   surface,
   rectangular_trimmed_surface,
   trimmed_curve);

REFERENCE FROM measure_schema   -- ISO 10303-41
  (conversion_based_unit,
   global_unit_assigned_context,
   length_measure,
   plane_angle_measure,
   si_prefix,
   si_unit,
   si_unit_name,
   unit);

REFERENCE FROM product_property_definition_schema   -- ISO 10303-41
  (characterized_definition,
   property_definition);

REFERENCE FROM product_property_representation_schema   -- ISO 10303-41
  (property_definition_representation,
   shape_representation);

REFERENCE FROM representation_schema   -- ISO 10303-43
  (definitional_representation_relationship,
   functionally_defined_transformation,
   item_defined_transformation,
   representation,
   representation_context,
   representation_item,
   representation_relationship,
   representation_relationship_with_transformation,
   using_representations);

REFERENCE FROM support_resource_schema   -- ISO 10303-41
  (bag_to_set,
   label);


TYPE actuated_direction = ENUMERATION OF
   (bidirectional,
    positive_only,
    negative_only,
    not_actuated);
END_TYPE;

TYPE kinematic_link_representation_items = SELECT
   (curve,
    point,
    rigid_placement,
    surface);
END_TYPE;

TYPE rigid_placement = SELECT
   (axis2_placement_3d,
    su_parameters);
END_TYPE;

ENTITY actuated_kinematic_pair
  SUBTYPE OF (kinematic_pair);
  t_x : OPTIONAL actuated_direction;
  t_y : OPTIONAL actuated_direction;
  t_z : OPTIONAL actuated_direction;
  r_x : OPTIONAL actuated_direction;
  r_y : OPTIONAL actuated_direction;
  r_z : OPTIONAL actuated_direction;
END_ENTITY;

ENTITY cylindrical_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
END_ENTITY;

ENTITY cylindrical_pair_with_range
  SUBTYPE OF (cylindrical_pair);
  lower_limit_actual_translation : OPTIONAL length_measure;
  upper_limit_actual_translation : OPTIONAL length_measure;
  lower_limit_actual_rotation : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_actual_translation) OR NOT EXISTS(upper_limit_actual_translation)) XOR (lower_limit_actual_translation < upper_limit_actual_translation);
  WR2: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation);
END_ENTITY;

ENTITY fully_constrained_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := FALSE;
END_ENTITY;

ENTITY gear_pair
  SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling);
  radius_first_link : length_measure;
  radius_second_link : length_measure;
  bevel : plane_angle_measure;
  helical_angle : plane_angle_measure;
  gear_ratio : REAL;
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY gear_pair_with_range
  SUBTYPE OF (gear_pair);
  lower_limit_actual_rotation_1 : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation_1 : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_actual_rotation_1) OR NOT EXISTS(upper_limit_actual_rotation_1)) XOR (lower_limit_actual_rotation_1 < upper_limit_actual_rotation_1);
END_ENTITY;

ENTITY high_order_kinematic_pair
  ABSTRACT SUPERTYPE OF (ONEOF (linear_flexible_and_planar_curve_pair,
                                point_on_surface_pair,
                                point_on_planar_curve_pair,
                                planar_curve_pair,
                                surface_pair))
  SUBTYPE OF (kinematic_pair);
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_2 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY homokinetic_pair
  SUBTYPE OF (universal_pair);
WHERE
  WR1: NOT EXISTS(SELF.input_skew_angle);
END_ENTITY;

ENTITY kinematic_link_representation
  ABSTRACT SUPERTYPE OF (ONEOF (linear_flexible_link_representation,
                                rigid_link_representation))
  SUBTYPE OF (representation);
  SELF\representation.context_of_items : geometric_representation_context;
  SELF\representation.items : SET[1:?] OF kinematic_link_representation_items;
  represented_link : kinematic_link;
INVERSE
  associated_shape_representation : SET[0:1] OF kinematic_link_representation_association FOR rep_1;
END_ENTITY;

ENTITY kinematic_link_representation_association
  SUBTYPE OF (representation_relationship);
  SELF\representation_relationship.rep_1 : kinematic_link_representation;
  SELF\representation_relationship.rep_2 : shape_representation;
WHERE
  WR1: (SELF\representation_relationship.rep_2.context_of_items :=: SELF\representation_relationship.rep_1.context_of_items) OR ('REPRESENTATION_SCHEMA.REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION' IN TYPEOF(SELF));
END_ENTITY;

ENTITY kinematic_pair
  ABSTRACT SUPERTYPE OF (ONEOF (high_order_kinematic_pair,
                                low_order_kinematic_pair_with_motion_coupling,
                                low_order_kinematic_pair)
                        ANDOR actuated_kinematic_pair)
  SUBTYPE OF (geometric_representation_item, item_defined_transformation);
  joint : kinematic_joint;
  SELF\item_defined_transformation.transform_item_1 : rigid_placement;
  SELF\item_defined_transformation.transform_item_2 : rigid_placement;
DERIVE
  associated_link_representations_1 : SET[1:?] OF kinematic_link_representation := sort_link_associations(link_representation_associations, TRUE);
  associated_link_representations_2 : SET[1:?] OF kinematic_link_representation := sort_link_associations(link_representation_associations, FALSE);
  SELF\item_defined_transformation.name : label := SELF\representation_item.name;
INVERSE
  link_representation_associations : SET[1:?] OF pair_representation_relationship FOR transformation_operator;
END_ENTITY;

ENTITY linear_flexible_and_pinion_pair
  SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling);
  pinion_radius : length_measure;
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.LINEAR_FLEXIBLE_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY linear_flexible_and_planar_curve_pair
  SUBTYPE OF (high_order_kinematic_pair);
  pair_curve : curve;
  orientation : BOOLEAN;
WHERE
  WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(pair_curve IN r.items))) = 0;
  WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.LINEAR_FLEXIBLE_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY linear_flexible_link_representation
  SUBTYPE OF (kinematic_link_representation);
END_ENTITY;

ENTITY low_order_kinematic_pair
  SUPERTYPE OF (ONEOF (revolute_pair,
                       cylindrical_pair,
                       spherical_pair,
                       spherical_pair_with_pin,
                       planar_pair,
                       unconstrained_pair,
                       fully_constrained_pair,
                       prismatic_pair,
                       universal_pair,
                       low_order_kinematic_pair_with_range))
  SUBTYPE OF (kinematic_pair);
  t_x : BOOLEAN;
  t_y : BOOLEAN;
  t_z : BOOLEAN;
  r_x : BOOLEAN;
  r_y : BOOLEAN;
  r_z : BOOLEAN;
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
  WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_2 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY low_order_kinematic_pair_with_motion_coupling
  ABSTRACT SUPERTYPE OF (ONEOF (gear_pair,
                                linear_flexible_and_pinion_pair,
                                rack_and_pinion_pair,
                                screw_pair))
  SUBTYPE OF (kinematic_pair);
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_2 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY low_order_kinematic_pair_with_range
  SUBTYPE OF (low_order_kinematic_pair);
  lower_limit_actual_rotation_x : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation_x : OPTIONAL plane_angle_measure;
  lower_limit_actual_rotation_y : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation_y : OPTIONAL plane_angle_measure;
  lower_limit_actual_rotation_z : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation_z : OPTIONAL plane_angle_measure;
  lower_limit_actual_translation_x : OPTIONAL length_measure;
  upper_limit_actual_translation_x : OPTIONAL length_measure;
  lower_limit_actual_translation_y : OPTIONAL length_measure;
  upper_limit_actual_translation_y : OPTIONAL length_measure;
  lower_limit_actual_translation_z : OPTIONAL length_measure;
  upper_limit_actual_translation_z : OPTIONAL length_measure;
END_ENTITY;

ENTITY mechanism_representation
  SUBTYPE OF (representation);
  SELF\representation.context_of_items : geometric_representation_context;
  SELF\representation.items : SET[1:?] OF pair_representation_relationship;
  represented_topology : kinematic_topology_representation_select;
DERIVE
  represented_joints : SET[1:?] OF kinematic_joint := collect_joints(items);
WHERE
  WR1: (('KINEMATIC_TOPOLOGY_SCHEMA.KINEMATIC_TOPOLOGY_STRUCTURE' IN TYPEOF(represented_topology)) AND (represented_joints :=: represented_topology.items)) OR (('KINEMATIC_TOPOLOGY_SCHEMA.KINEMATIC_TOPOLOGY_DIRECTED_STRUCTURE' IN TYPEOF(represented_topology)) AND (represented_joints :=: get_kinematic_joints_from_oriented_joints(represented_topology.items))) OR (('KINEMATIC_TOPOLOGY_SCHEMA.KINEMATIC_TOPOLOGY_NETWORK_STRUCTURE' IN TYPEOF(represented_topology)) AND (represented_joints :=: get_kinematic_joints_from_kinematic_loops(represented_topology.items)));
END_ENTITY;

ENTITY pair_representation_relationship
  SUBTYPE OF (geometric_representation_item, representation_relationship_with_transformation);
  SELF\representation_relationship.rep_1 : kinematic_link_representation;
  SELF\representation_relationship.rep_2 : kinematic_link_representation;
  SELF\representation_relationship_with_transformation.transformation_operator : kinematic_pair;
WHERE
  WR1: transformation_operator\item_defined_transformation.transform_item_1 IN rep_1.items;
  WR2: transformation_operator\item_defined_transformation.transform_item_2 IN rep_2.items;
  WR3: rep_1\kinematic_link_representation.represented_link = transformation_operator\kinematic_pair.joint.edge_start;
  WR4: rep_2\kinematic_link_representation.represented_link = transformation_operator\kinematic_pair.joint.edge_end;
END_ENTITY;

ENTITY planar_curve_pair
  SUPERTYPE OF (ONEOF (sliding_curve_pair,
                       rolling_curve_pair)
               ANDOR planar_curve_pair_range)
  SUBTYPE OF (high_order_kinematic_pair);
  curve_1 : curve;
  curve_2 : curve;
  orientation : BOOLEAN;
WHERE
  WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(curve_1 IN r.items))) = 0;
  WR2: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(curve_2 IN r.items))) = 0;
  WR3: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY planar_curve_pair_range
  SUBTYPE OF (planar_curve_pair);
  range_on_curve_1 : trimmed_curve;
  range_on_curve_2 : trimmed_curve;
WHERE
  WR1: SELF\planar_curve_pair.curve_1 :=: range_on_curve_1.basis_curve;
  WR2: SELF\planar_curve_pair.curve_2 :=: range_on_curve_2.basis_curve;
  WR3: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_curve_1 IN r.items))) = 0;
  WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(range_on_curve_2 IN r.items))) = 0;
END_ENTITY;

ENTITY planar_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
END_ENTITY;

ENTITY planar_pair_with_range
  SUBTYPE OF (planar_pair);
  lower_limit_actual_rotation : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation : OPTIONAL plane_angle_measure;
  lower_limit_actual_translation_x : OPTIONAL length_measure;
  upper_limit_actual_translation_x : OPTIONAL length_measure;
  lower_limit_actual_translation_y : OPTIONAL length_measure;
  upper_limit_actual_translation_y : OPTIONAL length_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation);
  WR2: (NOT EXISTS(lower_limit_actual_translation_x) OR NOT EXISTS(upper_limit_actual_translation_x)) XOR (lower_limit_actual_translation_x < upper_limit_actual_translation_x);
  WR3: (NOT EXISTS(lower_limit_actual_translation_y) OR NOT EXISTS(upper_limit_actual_translation_y)) XOR (lower_limit_actual_translation_y < upper_limit_actual_translation_y);
END_ENTITY;

ENTITY point_on_planar_curve_pair
  SUBTYPE OF (high_order_kinematic_pair);
  pair_curve : curve;
  orientation : BOOLEAN;
WHERE
  WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(pair_curve IN r.items))) = 0;
  WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY point_on_planar_curve_pair_with_range
  SUBTYPE OF (point_on_planar_curve_pair);
  range_on_pair_curve : trimmed_curve;
  lower_limit_yaw : OPTIONAL plane_angle_measure;
  upper_limit_yaw : OPTIONAL plane_angle_measure;
  lower_limit_pitch : OPTIONAL plane_angle_measure;
  upper_limit_pitch : OPTIONAL plane_angle_measure;
  lower_limit_roll : OPTIONAL plane_angle_measure;
  upper_limit_roll : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_pitch) OR NOT EXISTS(upper_limit_pitch)) XOR (lower_limit_pitch < upper_limit_pitch);
  WR2: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw);
  WR3: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll);
  WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_pair_curve IN r.items))) = 0;
END_ENTITY;

ENTITY point_on_surface_pair
  SUBTYPE OF (high_order_kinematic_pair);
  pair_surface : surface;
WHERE
  WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(pair_surface IN r.items))) = 0;
  WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY point_on_surface_pair_with_range
  SUBTYPE OF (point_on_surface_pair);
  range_on_pair_surface : rectangular_trimmed_surface;
  lower_limit_yaw : OPTIONAL plane_angle_measure;
  upper_limit_yaw : OPTIONAL plane_angle_measure;
  lower_limit_pitch : OPTIONAL plane_angle_measure;
  upper_limit_pitch : OPTIONAL plane_angle_measure;
  lower_limit_roll : OPTIONAL plane_angle_measure;
  upper_limit_roll : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_pitch) OR NOT EXISTS(upper_limit_pitch)) XOR (lower_limit_pitch < upper_limit_pitch);
  WR2: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw);
  WR3: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll);
  WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_pair_surface IN r.items))) = 0;
END_ENTITY;

ENTITY prismatic_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := FALSE;
END_ENTITY;

ENTITY prismatic_pair_with_range
  SUBTYPE OF (prismatic_pair);
  lower_limit_actual_translation : OPTIONAL length_measure;
  upper_limit_actual_translation : OPTIONAL length_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_actual_translation) OR NOT EXISTS(upper_limit_actual_translation)) XOR (lower_limit_actual_translation < upper_limit_actual_translation);
END_ENTITY;

ENTITY rack_and_pinion_pair
  SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling);
  pinion_radius : length_measure;
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY rack_and_pinion_pair_with_range
  SUBTYPE OF (rack_and_pinion_pair);
  lower_limit_rack_displacement : OPTIONAL length_measure;
  upper_limit_rack_displacement : OPTIONAL length_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_rack_displacement) OR NOT EXISTS(upper_limit_rack_displacement)) XOR (lower_limit_rack_displacement < upper_limit_rack_displacement);
END_ENTITY;

ENTITY revolute_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
END_ENTITY;

ENTITY revolute_pair_with_range
  SUBTYPE OF (revolute_pair);
  lower_limit_actual_rotation : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation);
END_ENTITY;

ENTITY rigid_link_representation
  SUBTYPE OF (kinematic_link_representation);
END_ENTITY;

ENTITY rolling_curve_pair
  SUBTYPE OF (planar_curve_pair);
END_ENTITY;

ENTITY rolling_surface_pair
  SUBTYPE OF (surface_pair);
END_ENTITY;

ENTITY screw_pair
  SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling);
  pitch : length_measure;
WHERE
  WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY screw_pair_with_range
  SUBTYPE OF (screw_pair);
  lower_limit_actual_rotation : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation);
END_ENTITY;

ENTITY sliding_curve_pair
  SUBTYPE OF (planar_curve_pair);
END_ENTITY;

ENTITY sliding_surface_pair
  SUBTYPE OF (surface_pair);
END_ENTITY;

ENTITY spherical_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
END_ENTITY;

ENTITY spherical_pair_with_pin
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
END_ENTITY;

ENTITY spherical_pair_with_pin_and_range
  SUBTYPE OF (spherical_pair_with_pin);
  lower_limit_yaw : OPTIONAL plane_angle_measure;
  upper_limit_yaw : OPTIONAL plane_angle_measure;
  lower_limit_roll : OPTIONAL plane_angle_measure;
  upper_limit_roll : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw);
  WR2: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll);
END_ENTITY;

ENTITY spherical_pair_with_range
  SUBTYPE OF (spherical_pair);
  lower_limit_yaw : OPTIONAL plane_angle_measure;
  upper_limit_yaw : OPTIONAL plane_angle_measure;
  lower_limit_pitch : OPTIONAL plane_angle_measure;
  upper_limit_pitch : OPTIONAL plane_angle_measure;
  lower_limit_roll : OPTIONAL plane_angle_measure;
  upper_limit_roll : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw);
  WR2: (NOT EXISTS(lower_limit_pitch) OR NOT EXISTS(upper_limit_pitch)) XOR (lower_limit_pitch < upper_limit_pitch);
  WR3: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll);
END_ENTITY;

ENTITY su_parameters
  SUBTYPE OF (geometric_representation_item);
  a : length_measure;
  alpha : plane_angle_measure;
  b : length_measure;
  beta : plane_angle_measure;
  c : length_measure;
  gamma : plane_angle_measure;
WHERE
  WR1: SELF\geometric_representation_item.dim=3;
END_ENTITY;

ENTITY surface_pair
  ABSTRACT SUPERTYPE OF (ONEOF (sliding_surface_pair,
                                rolling_surface_pair)
                        ANDOR surface_pair_with_range)
  SUBTYPE OF (high_order_kinematic_pair);
  surface_1 : surface;
  surface_2 : surface;
  orientation : BOOLEAN;
WHERE
  WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(surface_1 IN r.items))) = 0;
  WR2: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(surface_2 IN r.items))) = 0;
  WR3: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0;
END_ENTITY;

ENTITY surface_pair_with_range
  SUBTYPE OF (surface_pair);
  range_on_surface_1 : rectangular_trimmed_surface;
  range_on_surface_2 : rectangular_trimmed_surface;
  lower_limit_actual_rotation : OPTIONAL plane_angle_measure;
  upper_limit_actual_rotation : OPTIONAL plane_angle_measure;
WHERE
  WR1: SELF\surface_pair.surface_1 :=: range_on_surface_1.basis_surface;
  WR2: SELF\surface_pair.surface_2 :=: range_on_surface_2.basis_surface;
  WR3: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation);
  WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_surface_1 IN r.items))) = 0;
  WR5: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(range_on_surface_2 IN r.items))) = 0;
END_ENTITY;

ENTITY unconstrained_pair
  SUBTYPE OF (low_order_kinematic_pair);
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
END_ENTITY;

ENTITY universal_pair
  SUBTYPE OF (low_order_kinematic_pair);
  input_skew_angle : OPTIONAL plane_angle_measure;
DERIVE
  SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_x : BOOLEAN := TRUE;
  SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE;
  SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE;
  skew_angle : plane_angle_measure := NVL (input_skew_angle, 0.0);
WHERE
  WR1: COS (plane_angle_for_pair_in_radian (SELF, skew_angle)) > 0.0;
END_ENTITY;

ENTITY universal_pair_with_range
  SUBTYPE OF (universal_pair);
  lower_limit_first_rotation : OPTIONAL plane_angle_measure;
  upper_limit_first_rotation : OPTIONAL plane_angle_measure;
  lower_limit_second_rotation : OPTIONAL plane_angle_measure;
  upper_limit_second_rotation : OPTIONAL plane_angle_measure;
WHERE
  WR1: (NOT EXISTS(lower_limit_first_rotation) OR NOT EXISTS(upper_limit_first_rotation)) XOR (lower_limit_first_rotation < upper_limit_first_rotation);
  WR2: (NOT EXISTS(lower_limit_second_rotation) OR NOT EXISTS(upper_limit_second_rotation)) XOR (lower_limit_second_rotation < upper_limit_second_rotation);
END_ENTITY;

SUBTYPE_CONSTRAINT kss_representation_subtypes FOR representation;
  ONEOF (kinematic_link_representation,
         kinematic_topology_structure,
         kinematic_topology_directed_structure,
         kinematic_topology_network_structure,
         mechanism_representation,
         shape_representation);
END_SUBTYPE_CONSTRAINT;

FUNCTION collect_joints
 (items : SET[1:?] OF pair_representation_relationship) : SET[0:?] OF kinematic_joint;
LOCAL
  result : SET OF kinematic_joint := [];
END_LOCAL;
  REPEAT i := 1 TO HIINDEX(items);
    result := result + items[i].transformation_operator.joint;
  END_REPEAT;
  RETURN(result);
END_FUNCTION;

FUNCTION plane_angle_for_pair_in_radian
 (pair : kinematic_pair; angle : plane_angle_measure) : plane_angle_measure;
LOCAL
    converted_angle : plane_angle_measure := angle;
    link_rep        : kinematic_link_representation
                    := representation_of_link (pair.joint.edge_start);
    link_cntxt      : representation_context;
    pa_units        : SET OF unit := [];
    pau             : unit;
  END_LOCAL;

  link_cntxt := link_rep\representation.context_of_items;

  IF NOT ('MEASURE_SCHEMA.GLOBAL_UNIT_ASSIGNED_CONTEXT'
          IN TYPEOF (link_cntxt)) THEN
    RETURN (?);
  END_IF;

  pa_units := QUERY (unit <* link_cntxt\global_unit_assigned_context.units |
                     'MEASURE_SCHEMA.PLANE_ANGLE_UNIT' IN TYPEOF (unit));

  IF SIZEOF (pa_units) <> 1 THEN
    RETURN (?);
  END_IF;

  pau := pa_units[1];

  IF (NOT ('MEASURE_SCHEMA.SI_UNIT' IN TYPEOF (pau)) AND
      NOT ('MEASURE_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF (pau))) THEN
    RETURN (?);
  END_IF;

  REPEAT WHILE ('MEASURE_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF (pau));
    converted_angle := converted_angle *
                       pau\conversion_based_unit.conversion_factor.
                       value_component;
    pau := pau\conversion_based_unit.conversion_factor.unit_component;

    IF ((NOT ('MEASURE_SCHEMA.SI_UNIT' IN TYPEOF (pau)) AND
         NOT ('MEASURE_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF (pau))) OR
        (NOT ('MEASURE_SCHEMA.PLANE_ANGLE_UNIT' IN TYPEOF (pau)))) THEN
      RETURN (?);
    END_IF;
  END_REPEAT;

  IF (pau\si_unit.name <> si_unit_name.radian) THEN
    RETURN (?);
  END_IF;

  CASE pau\si_unit.prefix OF
    si_prefix.exa     : RETURN (1.E18 * converted_angle);
    si_prefix.peta    : RETURN (1.E15 * converted_angle);
    si_prefix.tera    : RETURN (1.E12 * converted_angle);
    si_prefix.giga    : RETURN (1.E9 * converted_angle);
    si_prefix.mega    : RETURN (1.E6 * converted_angle);
    si_prefix.kilo    : RETURN (1.E3 * converted_angle);
    si_prefix.hecto   : RETURN (1.E2 * converted_angle);
    si_prefix.deca    : RETURN (1.E1 * converted_angle);
    si_prefix.deci    : RETURN (1.E-1 * converted_angle);
    si_prefix.centi   : RETURN (1.E-2 * converted_angle);
    si_prefix.milli   : RETURN (1.E-3 * converted_angle);
    si_prefix.micro   : RETURN (1.E-6 * converted_angle);
    si_prefix.nano    : RETURN (1.E-9 * converted_angle);
    si_prefix.pico    : RETURN (1.E-12 * converted_angle);
    si_prefix.femto   : RETURN (1.E-15 * converted_angle);
    si_prefix.atto    : RETURN (1.E-18 * converted_angle);
  OTHERWISE           : RETURN (converted_angle);
  END_CASE;
END_FUNCTION;

FUNCTION representation_of_link
 (link : kinematic_link) : kinematic_link_representation;
RETURN (?);
END_FUNCTION;

FUNCTION sort_link_associations
 (aprr : SET[1:?] OF pair_representation_relationship; one_not_two : BOOLEAN) : SET[0:?] OF kinematic_link_representation;
LOCAL
  result : SET OF kinematic_link_representation := [];
END_LOCAL;
  IF one_not_two THEN
    REPEAT i := 1 TO HIINDEX(aprr);
      result := result + aprr[i].rep_1;
    END_REPEAT;
  ELSE  
    REPEAT i := 1 TO HIINDEX(aprr);
      result := result + aprr[i].rep_2;
    END_REPEAT;
  END_IF;
  RETURN(result);
END_FUNCTION;

END_SCHEMA;  -- kinematic_structure_schema


© ISO 2019 — All rights reserved