From ca27b7883517279e4266113e5e9f2a5b846ce1e9 Mon Sep 17 00:00:00 2001 From: Chris Iverach-Brereton Date: Mon, 4 Nov 2024 12:21:05 -0500 Subject: [PATCH] Add initial support for flagging unsupported accessories (e.g. Kinova arms, whose binary drivers don't exist in Jazzy yet) --- clearpath_config/common/types/accessory.py | 41 +++++++++++++- clearpath_config/common/types/exception.py | 63 +++++++++++++++++++++ clearpath_config/manipulators/types/arms.py | 13 +++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 clearpath_config/common/types/exception.py diff --git a/clearpath_config/common/types/accessory.py b/clearpath_config/common/types/accessory.py index 0f42aed..bf88a9b 100644 --- a/clearpath_config/common/types/accessory.py +++ b/clearpath_config/common/types/accessory.py @@ -30,7 +30,7 @@ class Accessory(): # Defaults - PARENT = "default_mount" + PARENT = 'default_mount' XYZ = [0.0, 0.0, 0.0] RPY = [0.0, 0.0, 0.0] @@ -41,6 +41,11 @@ def __init__( xyz: List[float] = XYZ, rpy: List[float] = RPY ) -> None: + + self.assert_is_supported() + if self.is_deprecated: + print(f'{type(self)} is deprecated') + self.name = str() self.parent = str() self.xyz = list() @@ -126,6 +131,40 @@ def assert_valid_triplet(tri: List[float], msg: str = None) -> None: # Triplet must be all floats assert all([isinstance(i, float) for i in tri]) + @staticmethod + def assert_is_supported(): + """ + Override this method to temporarily disable accessories that are not currently supported. + + When disabling an accessory, raise a + clearpath_config.common.types.exception.UnsupportedAccessoryException + with a suitable mesage (e.g. "SpamEggs driver is not yet released for ROS 2 Jazzy") + + @return None + + @exception Raises a clearpath_config.common.types.exception.UnsupportedAccessoryException + if the accessory is not supported + """ + pass + + @property + def is_suppported(self): + try: + self.assert_is_supported() + return True + except: + return False + + @property + def is_deprecated(self): + """ + Override this method to indicate that this accessory has been deprecated and may be + removed at a future date. + + When flagging an accessory for deprecation, simply override it to return True + """ + return False + class IndexedAccessory(Accessory): diff --git a/clearpath_config/common/types/exception.py b/clearpath_config/common/types/exception.py new file mode 100644 index 0000000..2d9b354 --- /dev/null +++ b/clearpath_config/common/types/exception.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +""" +Various exceptions specific to the clearpath_config system + +See specific classes below for details +""" +# Software License Agreement (BSD) +# +# @author Chris Iverach-Brereton +# @copyright (c) 2024, Clearpath Robotics, Inc., All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of Clearpath Robotics nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + + +class UnsupportedAccessoryException(AssertionError): + """ + Indicates that an accessory is not supported in the current release + + The accessory may become available in the future. + """ + def __init__(self, message): + """ + Create a new exception + + @param message A message indicating why this accessory is not yet supported + """ + super().__init__(message) + + +class UnsupportedPlatformException(AssertionError): + """ + Indicates that a platform is not supported in the current release + + The platform may become available in the future. + """ + def __init__(self, message): + """ + Create a new exception + + @param message A message indicating why this platform is not yet supported + """ + super().__init__(message) \ No newline at end of file diff --git a/clearpath_config/manipulators/types/arms.py b/clearpath_config/manipulators/types/arms.py index 5135b76..fd7ca61 100644 --- a/clearpath_config/manipulators/types/arms.py +++ b/clearpath_config/manipulators/types/arms.py @@ -27,6 +27,7 @@ # POSSIBILITY OF SUCH DAMAGE. from typing import List from clearpath_config.common.types.accessory import Accessory +from clearpath_config.common.types.exception import UnsupportedAccessoryException from clearpath_config.common.types.ip import IP from clearpath_config.common.types.port import Port from clearpath_config.manipulators.types.grippers import Gripper @@ -120,14 +121,26 @@ def from_dict(self, d: dict) -> None: class KinovaGen3Dof6(BaseArm): MANIPULATOR_MODEL = "kinova_gen3_6dof" + @classmethod + def assert_is_supported(self): + raise UnsupportedAccessoryException("Kinova Gen3 is not yet supported for Jazzy") + class KinovaGen3Dof7(BaseArm): MANIPULATOR_MODEL = "kinova_gen3_7dof" + @classmethod + def assert_is_supported(self): + raise UnsupportedAccessoryException("Kinova Gen3 is not yet supported for Jazzy") + class KinovaGen3Lite(BaseArm): MANIPULATOR_MODEL = "kinova_gen3_lite" + @classmethod + def assert_is_supported(self): + raise UnsupportedAccessoryException("Kinova Gen3 Lite is not yet supported for Jazzy") + class Arm(): KINOVA_GEN3_6DOF = KinovaGen3Dof6.MANIPULATOR_MODEL