Catalog PyPI
PACKAGE EXPLORERView in registry

7dof-pendant

PyPI

Teach pendant GUI for the 7-DOF robotic arm (ROS 2 Humble)

Versions collected1
Direct dependencies1From release 0.1.4
Last observed20 Oct, 16:09 UTC

README

Version 0.1.4 documentation

7dof-pendant

A pip-installable teach pendant GUI for the 7-DOF robotic arm.

The app opens a PyQt6 pendant (joint jog, Cartesian jog, presets, drawing, live status, E-stop) and drives the ROS 2 backend (Gazebo + ros2_control + the custom IK/FK and drawing nodes).

Install

ROS 2 Humble must already be installed (see Requirements), then install the pendant one of two ways:

From PyPI (recommended for users):

pip install --user 7dof-pendant
7dof-pendant            # ensure ~/.local/bin is on PATH

The published package is self-contained (GUI + bundled robot source). Project page: https://pypi.org/project/7dof-pendant/.

From source (for development):

cd teach_pendant
pip install .
7dof-pendant

The wheel ships only the GUI + robot source — it does not contain ROS. Install the system ROS dependencies first with ./install.sh (see below).

Uninstall

pip uninstall 7dof-pendant

This removes the package and the 7dof-pendant command, but not two things:

  • Colcon build artifacts. On first launch the pendant runs colcon build inside its bundled workspace, creating build/, install/, and log/ directories that pip never recorded — so pip uninstall leaves them behind. Remove them too:

    WS=$(python3 -c "import pendant7dof, os; print(os.path.join(os.path.dirname(pendant7dof.__file__), 'workspace'))")
    pip uninstall -y 7dof-pendant
    rm -rf "$WS"
    

    (Run the WS=… line before uninstalling — once the package is gone the import fails. If you already uninstalled, the leftovers live under ~/.local/lib/python*/site-packages/pendant7dof/.)

  • Dependencies. PyQt6 is left installed. Remove it only if nothing else uses it: pip uninstall -y PyQt6 PyQt6-Qt6 PyQt6-sip.

ROS 2 itself (/opt/ros/...) was installed via apt/install.sh, not pip, so it is unaffected.

Requirements

ROS 2 Humble must be installed on the machine. The pendant cannot bring ROS along inside the wheel — rclpy, MoveIt and ros2_control come from the system install. The pendant does bundle the robot's ROS 2 source and builds it for you on first launch.

One-shot setup (install.sh)

./install.sh (run from teach_pendant/) installs every ROS dependency the pendant needs to build and run via rosdep, plus the undeclared Python deps (numpy, scipy, urdf_parser_py), then installs the pendant editable and builds the workspace. It requires ROS 2 already installed under /opt/ros. Use ./install.sh --no-build to skip the colcon build.

It supports real-hardware control and the moveit (RViz fake-hardware) simulation — RViz and MoveIt are installed. It deliberately skips Gazebo/Ignition, so the gazebo physics-sim backend is not available; use moveit mode (Settings → mode) for RViz-based testing.

How it works

  1. 7dof-pendant checks whether the ROS 2 environment is sourced. If not, it re-execs itself under a shell with /opt/ros/<distro>/setup.bash and the workspace's install/setup.bash sourced — so you can launch from a plain terminal.
  2. It locates the colcon workspace ($PENDANT7DOF_WS, a bundled copy, or your ~/7dof_ws). On first run it colcon builds it once.
  3. It opens the GUI. Use the Settings tab's Launch Gazebo Simulation button to bring up the backend (ros2 launch arm_bot pendant_backend.launch.py) as a managed child process — this is how you test the pendant end to end. Untick "Also open RViz" to skip RViz. The simulation is torn down when you close the app.

Commands

7dof-pendant                 # launch the pendant (default)
7dof-pendant launch --no-backend   # attach to an already-running backend
7dof-pendant build           # colcon-build the workspace and exit
7dof-pendant bundle          # copy the dev workspace source into the package
7dof-pendant release         # build a shippable self-contained wheel
7dof-pendant doctor          # print environment diagnostics

Building a self-contained wheel

By default the package finds your ~/7dof_ws at runtime (no 49 MB of meshes duplicated into git). To ship a wheel that carries the workspace inside it, run:

7dof-pendant release         # bundle + build + clean up, in one step

This bundles the backend source, builds the wheel without pip build isolation (so it uses your vetted setuptools>=61, not an arbitrary cached one), then removes the bundle so your dev launches keep using the live ~/7dof_ws. The wheel lands in dist/7dof_pendant-<version>-py3-none-any.whl.

Do not use python -m build here: pip's build isolation can pull an ancient setuptools that ignores the PEP 621 [project] table and silently produces a broken UNKNOWN-0.0.0 wheel. 7dof-pendant release avoids that trap (and checks your setuptools/wheel versions first).

Flags: --no-bundle builds a GUI-only wheel (bring your own backend); --keep-bundle leaves the bundled workspace in place after building.

Downloads & popularity

3downloads
1-day window · source-reported counts19 Oct 2026
2914.50
2026-07-22: 5 · observed 2026-10-20T18:23:20.0797907Z · period 2026-07-22–2026-07-222026-07-23: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-07-23–2026-07-232026-07-27: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-07-27–2026-07-272026-07-29: 13 · observed 2026-10-20T18:23:20.0797907Z · period 2026-07-29–2026-07-292026-08-01: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-01–2026-08-012026-08-02: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-02–2026-08-022026-08-03: 7 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-03–2026-08-032026-08-04: 4 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-04–2026-08-042026-08-06: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-06–2026-08-062026-08-07: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-07–2026-08-072026-08-13: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-13–2026-08-132026-08-14: 5 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-14–2026-08-142026-08-16: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-16–2026-08-162026-08-17: 5 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-17–2026-08-172026-08-18: 29 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-18–2026-08-182026-08-19: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-19–2026-08-192026-08-20: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-20–2026-08-202026-08-23: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-23–2026-08-232026-08-24: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-24–2026-08-242026-08-28: 4 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-28–2026-08-282026-08-31: 3 · observed 2026-10-20T18:23:20.0797907Z · period 2026-08-31–2026-08-312026-09-03: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-03–2026-09-032026-09-05: 3 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-05–2026-09-052026-09-07: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-07–2026-09-072026-09-08: 3 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-08–2026-09-082026-09-09: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-10–2026-09-102026-09-12: 6 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-12–2026-09-122026-09-16: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-16–2026-09-162026-09-17: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-17–2026-09-172026-09-18: 5 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-18–2026-09-182026-09-23: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-23–2026-09-232026-09-24: 2 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-24–2026-09-242026-09-25: 3 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-25–2026-09-252026-09-27: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-27–2026-09-272026-09-28: 8 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-28–2026-09-282026-09-29: 7 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-29–2026-09-292026-09-30: 9 · observed 2026-10-20T18:23:20.0797907Z · period 2026-09-30–2026-09-302026-10-01: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-01–2026-10-012026-10-02: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-02–2026-10-022026-10-07: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-07–2026-10-072026-10-09: 4 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-09–2026-10-092026-10-10: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-10–2026-10-102026-10-13: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-13–2026-10-132026-10-14: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-14–2026-10-142026-10-15: 1 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-15–2026-10-152026-10-16: 7 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-16–2026-10-162026-10-19: 3 · observed 2026-10-20T18:23:20.0797907Z · period 2026-10-19–2026-10-19
22 Jul19 Oct

pypistats · 48 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-19 – 2026-10-1932026-10-20T18:23:20.0797907Z
2026-10-16 – 2026-10-1672026-10-20T18:23:20.0797907Z
2026-10-15 – 2026-10-1512026-10-20T18:23:20.0797907Z
2026-10-14 – 2026-10-1412026-10-20T18:23:20.0797907Z
2026-10-13 – 2026-10-1312026-10-20T18:23:20.0797907Z
2026-10-10 – 2026-10-1012026-10-20T18:23:20.0797907Z
2026-10-09 – 2026-10-0942026-10-20T18:23:20.0797907Z
2026-10-07 – 2026-10-0712026-10-20T18:23:20.0797907Z
2026-10-02 – 2026-10-0212026-10-20T18:23:20.0797907Z
2026-10-01 – 2026-10-0112026-10-20T18:23:20.0797907Z
2026-09-30 – 2026-09-3092026-10-20T18:23:20.0797907Z
2026-09-29 – 2026-09-2972026-10-20T18:23:20.0797907Z
2026-09-28 – 2026-09-2882026-10-20T18:23:20.0797907Z
2026-09-27 – 2026-09-2712026-10-20T18:23:20.0797907Z
2026-09-25 – 2026-09-2532026-10-20T18:23:20.0797907Z
2026-09-24 – 2026-09-2422026-10-20T18:23:20.0797907Z
2026-09-23 – 2026-09-2322026-10-20T18:23:20.0797907Z
2026-09-18 – 2026-09-1852026-10-20T18:23:20.0797907Z
2026-09-17 – 2026-09-1712026-10-20T18:23:20.0797907Z
2026-09-16 – 2026-09-1612026-10-20T18:23:20.0797907Z
2026-09-12 – 2026-09-1262026-10-20T18:23:20.0797907Z
2026-09-10 – 2026-09-1012026-10-20T18:23:20.0797907Z
2026-09-09 – 2026-09-0922026-10-20T18:23:20.0797907Z
2026-09-08 – 2026-09-0832026-10-20T18:23:20.0797907Z
2026-09-07 – 2026-09-0712026-10-20T18:23:20.0797907Z
2026-09-05 – 2026-09-0532026-10-20T18:23:20.0797907Z
2026-09-03 – 2026-09-0312026-10-20T18:23:20.0797907Z
2026-08-31 – 2026-08-3132026-10-20T18:23:20.0797907Z
2026-08-28 – 2026-08-2842026-10-20T18:23:20.0797907Z
2026-08-24 – 2026-08-2412026-10-20T18:23:20.0797907Z
2026-08-23 – 2026-08-2322026-10-20T18:23:20.0797907Z
2026-08-20 – 2026-08-2012026-10-20T18:23:20.0797907Z
2026-08-19 – 2026-08-1912026-10-20T18:23:20.0797907Z
2026-08-18 – 2026-08-18292026-10-20T18:23:20.0797907Z
2026-08-17 – 2026-08-1752026-10-20T18:23:20.0797907Z
2026-08-16 – 2026-08-1612026-10-20T18:23:20.0797907Z
2026-08-14 – 2026-08-1452026-10-20T18:23:20.0797907Z
2026-08-13 – 2026-08-1322026-10-20T18:23:20.0797907Z
2026-08-07 – 2026-08-0712026-10-20T18:23:20.0797907Z
2026-08-06 – 2026-08-0622026-10-20T18:23:20.0797907Z
2026-08-04 – 2026-08-0442026-10-20T18:23:20.0797907Z
2026-08-03 – 2026-08-0372026-10-20T18:23:20.0797907Z
2026-08-02 – 2026-08-0212026-10-20T18:23:20.0797907Z
2026-08-01 – 2026-08-0112026-10-20T18:23:20.0797907Z
2026-07-29 – 2026-07-29132026-10-20T18:23:20.0797907Z
2026-07-27 – 2026-07-2722026-10-20T18:23:20.0797907Z
2026-07-23 – 2026-07-2312026-10-20T18:23:20.0797907Z
2026-07-22 – 2026-07-2252026-10-20T18:23:20.0797907Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.415 Jun 20261

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 16:09 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:1e5b2ecac056320d64026f073e4e409492862a588bde2e6bd41059aa59ef1314