Wheelchair ReCamera virtual joy

I am designing a prototype for assisted driving on my wheelchair with reCamera.

My goal is to use reCamera as a virtual joystick. The reCamera is facing me and looks at my face and head.

It must recognise the degree of head tilt.

For example, when I turn my head to the right or left, it outputs a variable proportional to the degree of head movement.

Similarly, raising and lowering my head should produce another proportional variable.

Is this the right product?

1 Like

Hi,

That’s a solid plan! Your idea is definitely feasible: by using the YOLO Pose model on reCamera to extract the 5 facial keypoints (eyes, ears, and nose), you can then apply a Perspective-n-Point (PnP) calculation to estimate head orientation. From there, simply mapping the Yaw and Pitch angles into proportional variables will give you the precise virtual joystick control you need. It’s a very efficient workflow for edge-based assistive driving!

However, keep in mind that this PnP transformation isn’t an β€œout-of-the-box” feature of the YOLO model itself. You’ll need to manually implement the bridge between the 2D keypoints and the 3D world.

John

3 Likes

Thank you, Jhon.

Does Recamera Nodered support the Chessboard Method for Camera Calibration? I need it for (PnP) calculation.

Hi there,

So , NO is the answer (natively) on CheeseBoard :grinning_face_with_smiling_eyes:CAL.
Node-RED itself does NOT provide a built-in chessboard calibration node, and neither does Seeed’s default reCamera Node-RED palette.
However, I found this?
Looks doable.

How to do it on reCamera (recommended flow)

Option A β€” Python + OpenCV (cleanest)

  • Use a Node-RED exec node or python-function node
  • Run a Python script that:
    • Captures frames
    • Detects chessboard
    • Computes calibration
    • Saves results to JSON/YAML

This is the most reliable and traditional approach.

The important part: reCamera can do chessboard calibration

reCamera runs Linux + Node-RED + Python, and that means:

:white_check_mark: OpenCV is available (or installable)
:white_check_mark: cv::findChessboardCorners() + calibrateCamera() work normally
:white_check_mark: PnP (solvePnP, solvePnPRansac) works once calibrated

So the chessboard method is fully supported at the system level, just not wrapped in a pretty Node-RED node.

HTH
GL :slight_smile: PJ :v:

What reCamera does support well for PnP

  • Python execution
  • OpenCV (CPU)
  • ArUco / AprilTag pipelines
  • Stable camera access
  • Node-RED orchestration

This makes it very suitable for robotics, AR, and pose estimation once calibration is done.

2 Likes

you may check out this device too…

1 Like

I received the Recamera.

I am working on it, but I notice that there are some significant limitations.

There is no OpenCV or NumPy, which are very important.

I will try to install them.



β€˜β€™"[recamera@reCamera]~$ python3 -m pip install --user numpy opencv-python

Collecting numpy

Using cached numpy-2.0.2.tar.gz (18.9 MB)

ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on deviceβ€˜β€™"




I’ll try this way

[recamera@reCamera]~$ mkdir -p /userdata/tmp

mkdir: cannot create directory β€œ/userdata/tmp”: Permission denied

[recamera@reCamera]~$ export TMPDIR=/userdata/tmp

[recamera@reCamera]~$ export PIP_CACHE_DIR=/userdata/tmp

[recamera@reCamera]~$ /root 482M 406M 47M 90% /

[recamera@reCamera]~$

[recamera@reCamera]~$ python3 -m pip install --user numpy

WARNING: The directory β€œ/userdata/tmp” or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

Collecting numpy

Downloading numpy-2.0.2.tar.gz (18.9 MB)

|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 18.9 MB 824 kB/sERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device




But it’s really slow and limiting for my application.

I wanted to avoid using raspberry

I need opencv np for calibration and PnP transformation

1 Like

Hi there,

Just curious to know which reCamera model 8G or 64G?
Really cool project :+1:

GL :slight_smile: PJ :v:

8G

but there is space

[root@reCamera]~# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/root 482M 406M 47M 90% /

devtmpfs 91M 0 91M 0% /dev

tmpfs 91M 0 91M 0% /dev/shm

tmpfs 91M 140K 91M 1% /tmp

tmpfs 91M 148K 91M 1% /run

/dev/mmcblk0p6 5.9G 322M 5.3G 6% /userdata

overlay 5.9G 322M 5.3G 6% /bin

overlay 5.9G 322M 5.3G 6% /etc

overlay 5.9G 322M 5.3G 6% /home

overlay 5.9G 322M 5.3G 6% /lib

overlay 5.9G 322M 5.3G 6% /opt

overlay 5.9G 322M 5.3G 6% /root

overlay 5.9G 322M 5.3G 6% /sbin

overlay 5.9G 322M 5.3G 6% /usr

overlay 5.9G 322M 5.3G 6% /var

[root@reCamera]~#


Now I have root access, I changed tmp

[root@reCamera]~#
[root@reCamera]~#
[root@reCamera]~#
[root@reCamera]~#
[root@reCamera]~# mkdir -p /userdata/tmp
[root@reCamera]~# [recamera@reCamera]~$ export TMPDIR=/userdata/tmp
-sh: [recamera@reCamera]~$: not found
[root@reCamera]~# export TMPDIR=/userdata/tmp
[root@reCamera]~# export PIP_CACHE_DIR=/userdata/tmp
[root@reCamera]~# python3 -m pip install --user numpy
Collecting numpy
  Downloading numpy-2.0.2.tar.gz (18.9 MB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 18.9 MB 65 kB/s
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... error
  ERROR: Command errored out with exit status 2:
   command: /usr/bin/python3 /usr/lib/python3.9/site-packages/pip install --ignore-installed --no-user --prefix /userdata/tmp/pip-build-env-fudl5m6v/normal --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'patchelf >= 0.11.0' 'ninja >= 1.8.2'
       cwd: None
  Complete output (35 lines):
  Collecting patchelf>=0.11.0
    Downloading patchelf-0.17.2.4.tar.gz (149 kB)
  ERROR: Exception:
  Traceback (most recent call last):
    File "/usr/lib/python3.9/site-packages/pip/_internal/cli/base_command.py", line 186, in _main
      status = self.run(options, args)
    File "/usr/lib/python3.9/site-packages/pip/_internal/commands/install.py", line 331, in run
      resolver.resolve(requirement_set)
    File "/usr/lib/python3.9/site-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
      discovered_reqs.extend(self._resolve_one(requirement_set, req))
    File "/usr/lib/python3.9/site-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
      abstract_dist = self._get_abstract_dist_for(req_to_install)
    File "/usr/lib/python3.9/site-packages/pip/_internal/legacy_resolve.py", line 282, in _get_abstract_dist_for
      abstract_dist = self.preparer.prepare_linked_requirement(req)
    File "/usr/lib/python3.9/site-packages/pip/_internal/operations/prepare.py", line 515, in prepare_linked_requirement
      abstract_dist = _get_prepared_distribution(
    File "/usr/lib/python3.9/site-packages/pip/_internal/operations/prepare.py", line 95, in _get_prepared_distribution
      abstract_dist.prepare_distribution_metadata(finder, build_isolation)
    File "/usr/lib/python3.9/site-packages/pip/_internal/distributions/sdist.py", line 33, in prepare_distribution_metadata
      self.req.load_pyproject_toml()
    File "/usr/lib/python3.9/site-packages/pip/_internal/req/req_install.py", line 512, in load_pyproject_toml
      pyproject_toml_data = load_pyproject_toml(
    File "/usr/lib/python3.9/site-packages/pip/_internal/pyproject.py", line 75, in load_pyproject_toml
      pp_toml = pytoml.load(f)
    File "/usr/lib/python3.9/site-packages/pip/_vendor/pytoml/parser.py", line 11, in load
      return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin)))
    File "/usr/lib/python3.9/site-packages/pip/_vendor/pytoml/parser.py", line 24, in loads
      ast = _p_toml(src, object_pairs_hook=object_pairs_hook)
    File "/usr/lib/python3.9/site-packages/pip/_vendor/pytoml/parser.py", line 341, in _p_toml
      s.expect_eof()
    File "/usr/lib/python3.9/site-packages/pip/_vendor/pytoml/parser.py", line 123, in expect_eof
      return self._expect(self.consume_eof())
    File "/usr/lib/python3.9/site-packages/pip/_vendor/pytoml/parser.py", line 163, in _expect
      raise TomlError('msg', self._pos[0], self._pos[1], self._filename)
  pip._vendor.pytoml.core.TomlError: /userdata/tmp/pip-install-u8mj9ij0/patchelf/pyproject.toml(49, 1): msg
  ----------------------------------------
ERROR: Command errored out with exit status 2: /usr/bin/python3 /usr/lib/python3.9/site-packages/pip install --ignore-installed --no-user --prefix /userdata/tmp/pip-build-env-fudl5m6v/normal --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'patchelf >= 0.11.0' 'ninja >= 1.8.2' Check the logs for full command output.


1 Like