def add_constraint(self, parent, child, joint_type='fixed', joint_axis=[0, 0, 0], parent_frame_pose=None, child_frame_pose=None, max_force=None, max_linear_velocity=None, max_angular_velocity=None, is_controllable=False, name=None):
    'Add a constraint to the simulation.\n\n        Args:\n            parent: The parent entity as an instance of Entity.\n            child: The child entity as an instance of Entity.\n            joint_type: The type of the joint.\n            joint_axis: The axis of the joint.\n            parent_frame_pose: The pose of the joint in the parent frame.\n            child_frame_pose: The pose of the joint in the child frame.\n            max_force: Max force the constraint can apply.\n            max_linear_velocity: Maximum linear velocity.\n            max_angular_velocity: Max angular velocity.\n            is_controllable: If True, the constraint can apply motor controls.\n\n        Returns:\n            An instance of Constraint.\n        '
    if is_controllable:
        constraint = ControllableConstraint(parent, child, joint_type, joint_axis, parent_frame_pose, child_frame_pose, max_force=max_force, max_linear_velocity=max_linear_velocity, max_angular_velocity=max_angular_velocity, name=name)
    else:
        assert (max_linear_velocity is None)
        assert (max_angular_velocity is None)
        constraint = Constraint(parent, child, joint_type, joint_axis, parent_frame_pose, child_frame_pose, max_force=max_force, name=name)
    self._constraints[constraint.name] = constraint
    return constraint
Add a constraint to the simulation.

Args:
    parent: The parent entity as an instance of Entity.
    child: The child entity as an instance of Entity.
    joint_type: The type of the joint.
    joint_axis: The axis of the joint.
    parent_frame_pose: The pose of the joint in the parent frame.
    child_frame_pose: The pose of the joint in the child frame.
    max_force: Max force the constraint can apply.
    max_linear_velocity: Maximum linear velocity.
    max_angular_velocity: Max angular velocity.
    is_controllable: If True, the constraint can apply motor controls.

Returns:
    An instance of Constraint.
def add_constraint(self, parent, child, joint_type='fixed', joint_axis=[0, 0, 0], parent_frame_pose=None, child_frame_pose=None, max_force=None, max_linear_velocity=None, max_angular_velocity=None, is_controllable=False, name=None):
    'Add a constraint to the simulation.\n\n        Args:\n            parent: The parent entity as an instance of Entity.\n            child: The child entity as an instance of Entity.\n            joint_type: The type of the joint.\n            joint_axis: The axis of the joint.\n            parent_frame_pose: The pose of the joint in the parent frame.\n            child_frame_pose: The pose of the joint in the child frame.\n            max_force: Max force the constraint can apply.\n            max_linear_velocity: Maximum linear velocity.\n            max_angular_velocity: Max angular velocity.\n            is_controllable: If True, the constraint can apply motor controls.\n\n        Returns:\n            An instance of Constraint.\n        '
    if is_controllable:
        constraint = ControllableConstraint(parent, child, joint_type, joint_axis, parent_frame_pose, child_frame_pose, max_force=max_force, max_linear_velocity=max_linear_velocity, max_angular_velocity=max_angular_velocity, name=name)
    else:
        assert (max_linear_velocity is None)
        assert (max_angular_velocity is None)
        constraint = Constraint(parent, child, joint_type, joint_axis, parent_frame_pose, child_frame_pose, max_force=max_force, name=name)
    self._constraints[constraint.name] = constraint
    return constraint