Orbbec legacy camera support for ARCx: obstacle scans, floor-drop detection, depth/color/IR video, measurements, recording, clouds, multi-camera support
How to add the Orbbec Depth Camera V1 robot skill
- Load the most recent release of ARCx on a compatible operating system (Get ARCx).
- Press the + Skills menu from the top menu bar in ARCx.
- Choose any of these category tabs, the robot skill appears in each of them: Camera, Infrared Distance, Navigation.
- Press the Orbbec Depth Camera V1 icon to add the robot skill to your project.
Don't have a robot yet?
Follow the Getting Started Guide to build a robot and use the Orbbec Depth Camera V1 robot skill.
How to use the Orbbec Depth Camera V1 robot skill
Connects the older Orbbec 3D cameras to ARCx: an obstacle scan for the Navigation Messaging System (NMS) with the floor removed and drops found, colour, depth and infrared video for the camera skills, a measured distance for every detection a vision skill makes, the camera's tilt from its inertial sensor, depth presets and post-processing filters, laser control, recording and playback, point clouds, and several cameras at once.
This is the companion to the Orbbec Depth Camera skill, not a replacement for it. That one uses Orbbec SDK v2 and drives Orbbec's current hardware. This one drives everything v2 left behind, through the two libraries those cameras actually need: Orbbec SDK v1.10.37 and OpenNI2 with Orbbec's own driver. Both are included. Put both skills in one project if you have cameras from both generations; each runs its own.
A depth camera sees far more than a lidar. It measures a whole picture of distances, so it finds obstacles at every height the robot could hit: a table top, a chair seat, a shelf, a person's legs and a toy on the floor alike. Knowing how high the camera is mounted, the skill tells the floor from what stands on it and sees where the floor drops away at the top of a staircase. All of that becomes a scan the navigator reads like a lidar's.
Supported cameras
Orbbec's older cameras split into two groups that need different libraries. You do not have to know which: leave the Backend setting on Automatic and the skill opens each camera with whatever it needs. The camera list on the Camera tab says which library found each one.
| Library | Cameras | Notes |
|---|---|---|
| Orbbec SDK v1.10.37 | Astra+, Astra 2, Astra Mini Pro, Astra Mini S Pro, Astra Pro Plus, Gemini, Gemini E, Gemini E Lite, Gemini EW, Gemini UW, Gemini 2, Gemini 2 L, Gemini 2 VL, Gemini 2 XL, the DaBai series (DaBai, Pro, D1, DC1, DCL, DCW, DCW2, DW, DW2, Max, Max Pro), Femto, Femto W, Femto Bolt, Femto Mega | Depth presets, depth work modes, hardware and software depth-to-colour alignment, the SDK's post-processing filters, multi-camera sync, IMU on the models that have one, .bag recording and playback |
| OpenNI2 2.3 + Orbbec's driver | Astra, Astra S, Astra Pro, Astra Mini, Astra Mini S | Depth, infrared, and colour on the models that carry it. Hardware depth-to-colour registration. Laser on and off. .oni recording and playback. No presets, work modes, filters, IMU or temperatures: OpenNI2 has none |
Why the split: the Astra generation puts its depth sensor on a vendor-specific USB interface driven by Orbbec's own kernel driver. Both Orbbec SDKs reach cameras through UVC (Media Foundation on Windows, V4L2 on Linux), and neither can see a vendor-specific interface at all - SDK v1 enumerates such a camera and drops it with "found a usb port without interface url". OpenNI2 talks to that driver directly, which is how those cameras have always been used. This is a property of the camera, not a preference, which is why the skill chooses for you.
Orbbec's current cameras - the Gemini 330 series, Gemini 345/435/305 - are not here. They need SDK v2: use the Orbbec Depth Camera skill.
A built-in simulator imitates a Gemini 335 and a Femto Bolt in a simulated room, so a project, its navigation and its scripts can be built and tried before the camera arrives.
What you need
Every computer. The camera's own cable, in a port that can supply it. The Astra family carry the depth sensor and the colour camera as two separate USB devices behind a hub inside the camera, and the depth one is the hungrier of the two: through a chain of external hubs or an underpowered port, the colour camera appears and the depth sensor does not. If the depth half is missing, plug the camera straight into the computer, or use its own power supply where it has one. On Windows the depth half shows in Device Manager as ORBBEC Depth Sensor; the colour half as a plain camera.
Windows, SDK v1 cameras. Nothing to install: the skill carries the SDK and the Visual C++ runtime it needs (used only when Windows has none of its own). Orbbec's UVC cameras report their hardware timestamps through Windows frame metadata, which Windows only passes on once the camera has been registered for it. Without it the SDK pairs depth and colour by arrival time, which works but is less exact. With the camera plugged in, run Orbbec's registration script once per camera; the Camera tab shows the exact command:
powershell -ExecutionPolicy Bypass -File "<skill folder>\scripts\obsensor_metadata_win10.ps1" -op install_all
Windows, Astra generation (OpenNI2). These need Orbbec's own kernel driver, which is the one piece the skill cannot carry: it is a signed device driver and has to be installed by Windows. Without it the depth sensor sits in Device Manager with a yellow mark and "The drivers for this device are not installed" (problem 28), and no program of any kind can open it. Orbbec ships the installer with its OpenNI SDK for Windows:
- Download the OpenNI SDK for Windows from Orbbec (github.com/orbbec/OpenNI_SDK), or just the
openni-device-windows-driverpackage from the same release. - Run
SensorDriver_Vx.x.x.x.exe, which asks for administrator rights. - Unplug and replug the camera.
The depth sensor then reads ORBBEC Depth Sensor under an Orbbec device class, driven by obdrv4, and the skill can open it. OpenNI2 and Orbbec's driver also need Microsoft's Visual C++ 2013 redistributable (x64), which most computers already have; it is not Orbbec's to redistribute, so the skill does not ship it and says so if the library will not load.
Linux. A camera can only be opened by a normal user once Orbbec's udev rules are installed. The rules cover both generations, the Astra included. The Camera tab shows the command, with the path filled in, while they are missing:
sudo cp "<skill folder>/udev/99-obsensor-libusb.rules" /etc/udev/rules.d/ && sudo udevadm control --reload-rules && sudo udevadm trigger
Unplug and replug the camera afterwards. For several cameras on one computer, Orbbec recommends raising the USB buffer memory: echo 128 | sudo tee /sys/module/usbcore/parameters/usbfs_memory_mb.
What ships for which platform. Orbbec SDK v1 is included for Windows x64 and Linux x64 and ARM64. OpenNI2 and Orbbec's driver are included for Windows x64 and Linux x64. On Linux ARM64 the Astra generation needs an OpenNI2 installed on the machine; point the skill at it with OpenNI2 library path on the Camera tab, or install one where the skill looks (/usr/local/lib, or the OPENNI2_REDIST environment variable). Orbbec publishes no macOS build of either library for these cameras, so macOS is not supported by this skill.
Bandwidth: depth and colour together
The Astra generation are USB 2 cameras, and depth and colour at full size and rate together ask for more than the bus can carry. What that looks like is not an error message. The streams start, depth frames keep arriving on time at the right frame rate, every pixel in them is empty, and the colour picture never arrives at all. The skill notices this and says so in its log rather than leaving you to guess.
If it happens: turn the colour camera off on the Streams tab, or lower the frame rate. On an Astra Pro the colour camera is a separate ordinary USB webcam anyway - add ARCx's Camera Source (usb) robot skill for that picture and it costs the depth no bandwidth at all.
One more trap worth knowing: the Astra offers a 1280x1024 at 7 fps depth mode, which looks like the best mode on the list and is not. It is interpolated from the same sensor, it fills far less of the picture, and seven frames a second is too slow for a robot to avoid anything. The skill therefore aims at 640x480 at 30 fps when you have not asked for a particular size, which is what these cameras are for.
The window
Top to bottom: the controls, the readouts, the camera's picture, the top down scan, and the log.
- Start / Stop, the camera picker and what the session is doing. The refresh button looks for cameras again, through both libraries.
- Laser on / off, the depth preset (on the models that have presets), and Record.
- The readouts: the camera and its serial, frames per second, how much of the depth picture has a reading, the distance at the centre, the nearest obstacle and its direction, any drop in the floor, the camera's measured tilt, how the depth is aligned, which filters are running, and what is being published to the NMS.
- The picture: colour, depth (coloured near to far) or infrared, switched by the buttons above it.
- The scan: a top down view with the robot at the bottom, range rings, the camera's field of view, the obstacle zone, the outline of what it can see, obstacles as green points and drops as purple ones. The wheel zooms; a click reports what the camera sees in that direction.
- The log: what the camera did, what it refused, and why.
The picture switch chooses which of the camera's own video sources the window shows. Colour:
Infrared, which works in the dark and shows the laser's speckle pattern on every surface - on a stereo camera it is what the depth is calculated from:
And the same window on a real camera: an Astra Pro, opened through OpenNI2, with the room it is looking at in the depth picture and the walls picked out as obstacles in the scan:
The simulator
Choose a simulated camera from the camera list, or set Source to Simulator. It ray-casts a room (or a corridor) from wherever the mounting settings put the camera, and behaves like the family it imitates: a Gemini 335 (active stereo, depth noise growing with the square of the distance, presets, laser off means no depth on bare surfaces) or a Femto Bolt (time of flight, work modes, laser off means no depth at all). Everything above the camera - alignment, the scan, the obstacle zone, the video sources, navigation, the variables, the MCP tools - runs on it unchanged, so a project built against the simulator works against the camera.
The simulated depth is filtered by the skill's own stand-ins for the Orbbec filters rather than by the SDK's. The SDK's filters read a frame's stream profile, and SDK v1 offers no way to give one to a frame that did not come from a camera, so handing it a made-up frame would end the process. The stand-ins do the same jobs closely enough that the settings mean the same thing; a real camera gets Orbbec's own.
How the scan is made
Every depth frame is turned into an obstacle scan the same way lidar skills produce one, so a navigator cannot tell the difference.
- Each sampled pixel is placed in the robot's frame using the mounting settings: how far forward, left and high the camera is, and how it is tilted, turned and rolled.
- Anything below Minimum obstacle height is floor and is dropped. Anything above Maximum obstacle height is ignored, so the robot drives under a table it fits beneath.
- What is left is reduced to the nearest obstacle in each slice of the circle, at the chosen scan resolution.
- With drop detection on, the floor is also checked for where it falls away - the top of a staircase, a ledge - and those are reported separately, as obstacles too when you want a navigator to steer round them.
The mount height is the setting that matters most. Without it there is no floor to measure from, so everything the camera sees is reported as an obstacle, as a lidar would.
Depth quality
SDK v1 cameras get Orbbec's own post-processing, in the SDK's order: decimation, threshold, noise removal, spatial, temporal, hole filling. Decimation is the one to reach for first - halving each side quarters the processing and navigation does not need more. The filters each say what they do in the configuration.
Astra generation cameras get no filter chain: OpenNI2 has none, and the depth is used as the camera sends it. The minimum and maximum depth still apply.
Minimum and maximum depth throw away readings outside a range you trust. An Astra cannot see closer than about 40 cm (an Astra S or Astra Mini about 25 cm); stereo error grows with the square of the distance, so past 5 or 6 metres it is rarely worth having.
Measuring detections
When the depth is aligned to the colour camera, every detection any vision skill makes on this camera's colour video gets its real distance and position attached: how far away it is, how far forward and to the left of the robot, how high off the floor, and at what angle. Face tracking, colour tracking, glyphs and object detection all gain this without knowing the camera exists, and the Object Detection Script skill can then stop the robot at a distance or drive to the thing it found.
Alignment is hardware on the models that can do it (the camera does the work), software in the SDK otherwise, and on the Astra generation it is the driver's own registration, which is hardware. Turn it off and detections are not measured.
Recording and playback
An SDK v1 camera records to Orbbec's .bag format; an Astra through OpenNI2 records to OpenNI's .oni. Both record whatever is streaming, without interrupting it. Play one back by choosing it as the playback file: the skill reads the extension and uses the right library, and everything downstream - the scan, the obstacle zone, the variables, the video sources - behaves as it does with the camera.
Several cameras
Add the skill more than once, one instance per camera, and give each its own serial number on the Camera tab. Each instance publishes its own video sources, its own depth sensor and its own variables, named from its window title, so they never collide. A camera another instance is already streaming from is listed but not opened twice.
Global variables
With Set variables on, the skill keeps these up to date (shown with the default Orbbec prefix; give each camera its own):
| Variable | What it is |
|---|---|
OrbbecIsRunning |
True while the camera is streaming |
OrbbecIsRecording |
True while it is recording |
OrbbecNearestDistance, OrbbecNearestAngle |
The closest obstacle, in metres along the floor and radians counter-clockwise from straight ahead |
OrbbecFrontDistance, OrbbecLeftDistance, OrbbecRightDistance |
The closest obstacle ahead (within 10), ahead-left and ahead-right (10 to 60) |
OrbbecCenterDistance |
Straight-line distance to what the middle of the picture sees |
OrbbecCliff, OrbbecCliffDistance, OrbbecCliffAngle |
Drops in the floor |
OrbbecObstacle, OrbbecObstacleDistance, OrbbecObstacleAngle |
The obstacle zone |
OrbbecCameraTilt, OrbbecCameraRoll |
The camera's own tilt, measured from gravity |
OrbbecRobotPitch, OrbbecRobotRoll, OrbbecYawRate |
The robot's attitude and turn rate, from the camera's inertial sensor and its mounting |
OrbbecFPS, OrbbecValidPercent, OrbbecTemperature |
Frames per second, how much of the picture has a reading, the hottest part of the camera |
Everything a script reads is in metres and radians, counter-clockwise from straight ahead, matching the rest of ARCx.
The obstacle zone
Watches a wedge in front of the robot and reacts the moment something enters it: runs a script, stops the robot, pauses a navigation in progress, or any combination. Set how far and how wide the zone reaches, whether a drop in the floor counts, and how long it must stay clear before the obstacle is over. The scan view draws the zone, red while something is in it.
When the camera stops while the zone is occupied, a navigation it paused stays paused, because carrying on without the camera watching would be the wrong surprise.
Point clouds
Save point cloud writes the next depth frame as a PLY file that MeshLab, CloudCompare, Blender and Open3D open, coloured from the colour camera when the depth is aligned to it. Points are in the robot's frame, so a cloud lines up with the scan and the map.
AI assistants (MCP)
The skill offers these tools to an AI assistant connected to ARCx:
| Tool | What it does |
|---|---|
get_status |
Everything about the camera's state |
get_depth_scan |
What it sees in front of the robot, by sector, in centimetres |
get_depth_snapshot |
The depth picture as a false-colour image and a numeric grid, so it can be read either way |
get_distance_at |
How far away the thing at a point of the picture is, and where it is relative to the robot |
capture_point_cloud |
Saves a PLY |
set_depth_settings |
Changes the depth settings while it runs |
Configuration
Seven tabs. Every setting has a help button next to it that says what it does.
Camera
Where the frames come from, which camera, and which library opens it. Library is the one to leave alone: on Automatic the skill opens each camera with whatever it needs, and the camera list says which library found each one. The two library paths at the bottom are for using a build of your own instead of the ones the skill ships; the line underneath says which libraries actually loaded.
Streams
Which streams to run and at what size and rate. 0 lets the camera choose. Read Bandwidth: depth and colour together before turning everything on at once.
Depth
The depth preset and work mode, the laser, how the depth is aligned to the colour camera, the post-processing filters and the range to keep. The filters are the Orbbec SDK's own on an SDK v1 camera; an Astra through OpenNI2 has only the range, because OpenNI2 has no filter chain.
Mounting
Where the camera sits on the robot and which way it points. The height is the setting that matters most: without it there is no floor to remove, so everything the camera sees is reported as an obstacle.
Navigation
How the depth becomes a scan for the navigation messaging system: how often, how finely, how near and far to look, what counts as an obstacle rather than floor or ceiling, and whether to look for drops.
Obstacle zone
The wedge in front of the robot that is watched, and what happens when something enters it: a script, stopping the robot, pausing a navigation, or any combination.
Video and variables
Which video sources to publish, the colours of the depth picture, whether detections are measured, and the global variables with their name prefix.
Custom UI
The skill offers an Orbbec view widget for your own Custom UI screens: the colour, depth or infrared picture, or the top down obstacle scan, with an optional start/stop button, laser button and distance readout. Drop several on one screen to show more than one view at once, and put the skill's variables beside them in gauges, indicators and labels.
Troubleshooting
No camera found. Check the depth sensor is enumerated, not just the colour camera: on Windows, Device Manager should show ORBBEC Depth Sensor. If it is missing entirely, it is a power or cable problem - plug the camera directly into the computer. If it is there with a yellow mark, install Orbbec's driver (see What you need). On Linux, install the udev rules.
The camera is found but will not open. Another program may have it. Only one program at a time can open these cameras, and that includes a second instance of this skill.
Depth frames arrive but are empty. Most often bandwidth - see Bandwidth: depth and colour together. Otherwise: the laser may be off, something may be closer than the camera's minimum range, or it may be pointed at a window, a mirror, or a surface in bright sunlight. Infrared depth cameras see none of those.
The infrared picture costs me the depth. On the Astra generation the infrared camera is the depth camera, so only one of them can run. The skill says so and keeps the depth.
The colour camera is missing on an Astra Pro. It is a separate USB webcam, not part of the depth device, so OpenNI2 knows nothing about it. Add ARCx's Camera Source (usb) robot skill for that picture.
Everything is reported as an obstacle. Set the mount height on the Mounting tab. Without it there is no floor to remove.
The scan is in the wrong place. Check the mounting: height, forward and left offsets, and especially the tilt. A camera tilted down and told it is level puts the floor in front of the robot as a wall.
Control Commands for the Orbbec Depth Camera V1 robot skill
There are Control Commands available for this robot skill which allows the skill to be controlled programmatically from scripts or other robot skills. These commands enable you to automate actions, respond to sensor inputs, and integrate the robot skill with other systems or custom interfaces. If you're new to the concept of Control Commands, we have a comprehensive manual available here that explains how to use them, provides examples to get you started and make the most of this powerful feature.
Control Command ManualThis robot skill has 31 control commands, listed below. Send them from a JavaScript or Python script, from Blockly, or from another robot skill.
The first value is always the window title, which is the name in the title bar of the robot skill on your workspace. It starts out as Orbbec Depth Camera V1, which is what every example below uses. If you rename the robot skill, or add a second copy of it to the project, use the title as it appears on that window instead.
ControlCommand() can be shortened to CC(), and both spellings work in JavaScript and in Python. The examples are JavaScript; Python is the same call, except that true and false are written True and False.
GetCameraTilt
The camera's tilt measured from gravity by its inertial sensor, as [tilt down, roll] in radians (positive looking down, positive right side lower). [0, 0] for a camera without an inertial sensor.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetCameraTilt")
Returns: Array of Float
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetCameraTilt");
GetCenterDistance
The straight-line distance in metres from the camera to whatever the middle of its picture sees. 0 when there is no reading there.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetCenterDistance")
Returns: Float [1.5e45 to 3.4e38]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetCenterDistance");
GetDepthPresets
The depth presets and depth work modes the running camera offers, presets first, each as "preset: name" or "work mode: name".
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetDepthPresets")
Returns: Array of String
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetDepthPresets");
GetDeviceInfo
The camera's model, serial number, firmware and connection, the streams running, the alignment, the filters, the preset or work mode, the laser, the sync mode and the Orbbec SDK version.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetDeviceInfo")
Returns: String
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetDeviceInfo");
GetDistance
The distance in metres along the floor from the robot's centre to the nearest obstacle in a direction, from the latest depth scan. angle is in radians counter-clockwise from straight ahead (0 ahead, PI/2 left, -PI/2 right). 0 when nothing is seen there or the direction is outside the camera's view.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetDistance", (Number)angle)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | angle | Number | A number, without quotes |
Returns: Float [1.5e45 to 3.4e38]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetDistance", 0);
GetDistanceAtPixel
The straight-line distance in metres from the camera to what a point of the picture sees. x and y are fractions of the picture's width and height from the top left (0.5, 0.5 is the middle), the same for the colour and depth pictures when depth is aligned to colour. 0 when there is no reading there.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetDistanceAtPixel", (Number)x, (Number)y)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | x | Number | A number, without quotes |
| 2 | y | Number | A number, without quotes |
Returns: Float [1.5e45 to 3.4e38]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetDistanceAtPixel", 0, 0);
GetNearest
The nearest obstacle the camera sees as [distance in metres along the floor, direction in radians counter-clockwise from straight ahead]. [0, 0] when nothing is seen.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetNearest")
Returns: Array of Float
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetNearest");
GetPointAtPixel
Where the thing a point of the picture sees is, as [forward, left, height] in metres from the robot's centre on the floor (+forward ahead, +left to the robot's left, height off the floor). x and y are fractions of the picture from the top left. [0, 0, 0] when there is no reading there.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetPointAtPixel", (Number)x, (Number)y)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | x | Number | A number, without quotes |
| 2 | y | Number | A number, without quotes |
Returns: Array of Float
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetPointAtPixel", 0, 0);
GetSectorDistance
The distance in metres to the nearest obstacle between two directions, going counter-clockwise from startAngle to endAngle, in radians from straight ahead (-0.35 to 0.35 is the 40 degrees around straight ahead). 0 when nothing is seen there.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetSectorDistance", (Number)startAngle, (Number)endAngle)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | startAngle | Number | A number, without quotes |
| 2 | endAngle | Number | A number, without quotes |
Returns: Float [1.5e45 to 3.4e38]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetSectorDistance", 0, 0);
GetTemperature
The hottest temperature the camera reports, in degrees Celsius. 0 when it reports none.
Syntax
ControlCommand("Orbbec Depth Camera V1", "GetTemperature")
Returns: Float [1.5e45 to 3.4e38]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "GetTemperature");
IsCliffDetected
Whether the camera sees a drop in the floor (stairs, a ledge) right now. Needs drop detection turned on and the mount height set.
Syntax
ControlCommand("Orbbec Depth Camera V1", "IsCliffDetected")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "IsCliffDetected");
IsObstacleDetected
Whether something is inside the obstacle zone right now. Always false when the obstacle zone is turned off.
Syntax
ControlCommand("Orbbec Depth Camera V1", "IsObstacleDetected")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "IsObstacleDetected");
IsRecording
Whether the camera is recording to a .bag file.
Syntax
ControlCommand("Orbbec Depth Camera V1", "IsRecording")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "IsRecording");
IsRunning
Whether the skill is running (connecting, streaming or waiting to reconnect).
Syntax
ControlCommand("Orbbec Depth Camera V1", "IsRunning")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "IsRunning");
ListCameras
The Orbbec cameras connected to this computer, then the simulator's two, one "model (serial number)" per item.
Syntax
ControlCommand("Orbbec Depth Camera V1", "ListCameras")
Returns: Array of String
Example
var result = ControlCommand("Orbbec Depth Camera V1", "ListCameras");
MeasureTilt
Measure the camera's tilt and roll now with its inertial sensor and save them as the mounting tilt and roll. Stand the robot on level floor first. Returns the tilt down in degrees.
Syntax
ControlCommand("Orbbec Depth Camera V1", "MeasureTilt")
Returns: Float [1.5e45 to 3.4e38]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "MeasureTilt");
Reboot
Restart the camera, for one that has stopped answering. Streaming carries on once it is back when reconnecting is on. Returns false when not running.
Syntax
ControlCommand("Orbbec Depth Camera V1", "Reboot")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "Reboot");
SavePointCloud
Save the next depth frame as a 3D point cloud (.ply, opens in MeshLab, CloudCompare, Blender), in metres in the robot's frame, coloured when depth is aligned to colour. filename is optional: empty saves a dated file in the save folder. Returns the file's full path.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SavePointCloud", (String)filename)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | filename | Text | Your text, in quotes |
Returns: String
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SavePointCloud", "filename");
SelectCamera
Use the camera with this serial number (from ListCameras), restarting a running session on it. A simulator serial (SIM-G335-0001, SIM-FB-0002) switches to the simulator. Returns true.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SelectCamera", (String)serial)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | serial | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SelectCamera", "serial");
SetDepthPreset
Load a depth preset by name while streaming (Gemini 330 series: "Default", "High Accuracy", "High Density", "Medium Density", "Hand"). GetDepthPresets lists what the camera has. Returns true when loaded.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetDepthPreset", (String)preset)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | preset | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetDepthPreset", "preset");
SetDepthWorkMode
Switch the depth work mode by name (Femto and Gemini 2 cameras, e.g. "Binned Narrow FoV"). The camera restarts on the new mode. Returns true.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetDepthWorkMode", (String)mode)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | mode | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetDepthWorkMode", "mode");
SetFilter
Turn one of Orbbec's depth post-processing filters on or off while streaming: "spatial", "temporal", "noise" (noise removal) or "holefill" (hole filling, nearest). Returns the new setting.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetFilter", (String)filter, (Bool)on)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | filter | Text | Your text, in quotes |
| 2 | on | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetFilter", "filter", true);
SetLaser
Set the laser projector while streaming: "on", "off" or "auto" (auto on the Gemini 330 series). Off gives a clean infrared picture but no depth on blank surfaces, and no depth at all on a Femto. Returns false when the camera has no laser setting or is not running.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetLaser", (String)mode)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | mode | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetLaser", "mode");
SetLaserPower
Set the laser power level while streaming, on the camera's own scale (1 to 6 on a Gemini 330). Returns false when the camera has no laser power setting or is not running.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetLaserPower", (Number)level)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | level | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetLaserPower", 0);
SetLaserProtection
Turn laser distance protection (LDP, which dims the laser when something is very close) on or off while streaming. Returns false when the camera has none or is not running.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetLaserProtection", (Bool)on)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | on | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetLaserProtection", true);
SetPublishToNMS
Turn sending the depth scan to the Navigation Messaging System on or off. Returns the new setting.
Syntax
ControlCommand("Orbbec Depth Camera V1", "SetPublishToNMS", (Bool)publish)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | publish | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "SetPublishToNMS", true);
Start
Open the Orbbec camera (or play the recording, or start the simulator) and start streaming. Returns false if it was already running.
Syntax
ControlCommand("Orbbec Depth Camera V1", "Start")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "Start");
StartRecording
Record everything the live camera streams to an Orbbec .bag file until StopRecording, without interrupting the stream. filename is optional: empty saves a dated file in the save folder. Returns the file's full path. Recordings grow by tens of megabytes a minute.
Syntax
ControlCommand("Orbbec Depth Camera V1", "StartRecording", (String)filename)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | filename | Text | Your text, in quotes |
Returns: String
Example
var result = ControlCommand("Orbbec Depth Camera V1", "StartRecording", "filename");
Stop
Stop streaming and close the camera. Returns false if it was not running.
Syntax
ControlCommand("Orbbec Depth Camera V1", "Stop")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "Stop");
StopRecording
Finish the recording and carry on streaming. Returns the recorded file's path, or empty when nothing was being recorded.
Syntax
ControlCommand("Orbbec Depth Camera V1", "StopRecording")
Returns: String
Example
var result = ControlCommand("Orbbec Depth Camera V1", "StopRecording");
TriggerCapture
Take one picture in the SoftwareTriggering sync mode. Returns false when the camera cannot.
Syntax
ControlCommand("Orbbec Depth Camera V1", "TriggerCapture")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Orbbec Depth Camera V1", "TriggerCapture");
This list is read out of the robot skill itself each time its package is uploaded, so it matches the published version (v1).













This robot skill has been updated to v1.
What has changed
First release.
Drives the older Orbbec depth cameras that the Orbbec Depth Camera skill (SDK v2) does not, through whichever of two libraries each camera actually needs. The skill chooses for you; leave Library on Automatic.
Orbbec SDK v1.10.37 - Astra+, Astra 2, Astra Mini Pro, Astra Mini S Pro, Astra Pro Plus, Gemini, Gemini E and EW, Gemini 2 / 2 L / 2 VL / 2 XL, the DaBai series, Femto, Femto W, Femto Bolt and Femto Mega. OpenNI2 2.3 + - the original Astra, Astra S and Astra Pro, whose depth sensor is a Orbbec's driver vendor-specific USB interface that no Orbbec SDK can see at all.
Both libraries ship with the skill: SDK v1 for Windows x64 and Linux x64/ARM64, OpenNI2 and Orbbec's driver for Windows x64 and Linux x64. On Windows the Astra generation also needs Orbbec's own kernel driver (SensorDriver, from Orbbec's OpenNI SDK); the manual says how, and the skill says so when it is missing.
What it gives the rest of ARCx:
Tested against a real Astra Pro through OpenNI2 and against the simulator. Windows and Linux; Orbbec publishes no macOS build of either library for these cameras.