fix(gamepad): Gamepad on macos often does not need fallback (#4125)

* gamepad does often work on macos

* review comments

* fix(gamepad): expose hidapi fallback in config

---------

Co-authored-by: Maxim Bonnaerens <maxim@bonnaerens.be>
This commit is contained in:
Steven Palma
2026-07-23 18:21:48 +02:00
committed by GitHub
parent 679faeaafc
commit 19dcbc19f1
2 changed files with 13 additions and 3 deletions
@@ -23,3 +23,5 @@ from ..config import TeleoperatorConfig
@dataclass @dataclass
class GamepadTeleopConfig(TeleoperatorConfig): class GamepadTeleopConfig(TeleoperatorConfig):
use_gripper: bool = True use_gripper: bool = True
# Use hidapi instead of pygame for controllers that pygame cannot detect reliably.
hidapi_fallback: bool = False
@@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging
import sys import sys
from enum import IntEnum from enum import IntEnum
from typing import Any from typing import Any
@@ -27,6 +28,8 @@ from ..teleoperator import Teleoperator
from ..utils import TeleopEvents from ..utils import TeleopEvents
from .configuration_gamepad import GamepadTeleopConfig from .configuration_gamepad import GamepadTeleopConfig
logger = logging.getLogger(__name__)
class GripperAction(IntEnum): class GripperAction(IntEnum):
CLOSE = 0 CLOSE = 0
@@ -56,6 +59,13 @@ class GamepadTeleop(Teleoperator):
self.gamepad = None self.gamepad = None
self.hidapi_fallback = config.hidapi_fallback
if sys.platform == "darwin" and not self.hidapi_fallback:
logger.warning(
"On macOS, pygame may not reliably detect input from some controllers. "
"If you experience issues, set `hidapi_fallback=true`."
)
@property @property
def action_features(self) -> dict: def action_features(self) -> dict:
if self.config.use_gripper: if self.config.use_gripper:
@@ -76,9 +86,7 @@ class GamepadTeleop(Teleoperator):
return {} return {}
def connect(self) -> None: def connect(self) -> None:
# use HidApi for macos if self.hidapi_fallback:
if sys.platform == "darwin":
# NOTE: On macOS, pygame doesnt reliably detect input from some controllers so we fall back to hidapi
from .gamepad_utils import GamepadControllerHID as Gamepad from .gamepad_utils import GamepadControllerHID as Gamepad
else: else:
from .gamepad_utils import GamepadController as Gamepad from .gamepad_utils import GamepadController as Gamepad