The controller¶
parol6-server is the process that owns the robot. Start it on the PC the control board is plugged into, and
leave it running; clients connect and disconnect as they like.
Starting it¶
parol6-server --serial COM5 # Windows
parol6-server --serial /dev/ttyACM0 # Linux
parol6-server --serial /dev/cu.usbmodem1 # macOS: ls /dev/cu.usbmodem* gives the name
parol6-server # no serial port: simulator mode
parol6-server --serial COM5 --log-level INFO
The options, from the source:
| Option | Default | Meaning |
|---|---|---|
--host |
0.0.0.0 |
UDP host address |
--port |
5001 |
UDP port |
--serial |
— | Serial port (e.g., /dev/ttyUSB0 or COM3) |
--baudrate |
3000000 |
Serial baudrate |
-v, --verbose |
0 |
Increase verbosity; -v=INFO, -vv=DEBUG, -vvv=TRACE |
-q, --quiet |
flag | Enable quiet logging (WARNING level) |
--log-level |
— | Set specific log level (one of TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL) |
The serial port can also come from the environment (PAROL6_COM_PORT) or from the file the controller saves
the last port to, so that a second start needs no option. Once running, connect_hardware("COM5") from a client
connects or re-connects the port, and simulator(True) switches to the virtual arm.
From Python¶
The Robot class starts and stops the controller as a subprocess, for scripts that should be self-contained:
from parol6 import Robot, RobotClient
with Robot(host="127.0.0.1", port=5001) as robot: # starts parol6-server, waits until it answers
with RobotClient() as rbt:
rbt.wait_ready(timeout=5)
rbt.simulator(True)
rbt.home(wait=True)
Robot also carries the robot model (kinematics, limits, tools) that the clients use for previews.
Simulator mode¶
Without a serial port, or after simulator(True), the controller runs the same planner against a virtual arm
and broadcasts its state. Everything works except the hardware: homing is instant, teleport() sets the pose,
collisions are checked. Develop in the simulator and switch to the hardware with connect_hardware() or a
restart with --serial.
The loop¶
The controller sends a packet to the board every 10 ms (100 Hz) and broadcasts status at 50 Hz. If the PC cannot
keep up it logs loop overbudget by +N%, as a warning when it happens more than three times a minute (at DEBUG
level otherwise); loop_stats() shows the figures. Lower
PAROL6_CONTROL_RATE_HZ, close other programs, and keep logging at INFO or above: TRACE and DEBUG cost time.
Environment variables¶
Everything configurable without code, read at start-up:
| Variable | Default |
|---|---|
PAROL6_BLEND_HOLD_S |
0.1 |
PAROL6_BUSY_THRESHOLD_MS |
1.0 |
PAROL6_COLLISION_CHECK |
1 |
PAROL6_COLLISION_CLEARANCE_M |
0.005 |
PAROL6_COLLISION_JOG_LOOKAHEAD_S |
0.15 |
PAROL6_COLLISION_PATH_SAMPLES |
16 |
PAROL6_COLLISION_SRDF |
computed |
PAROL6_COM_FILE |
computed |
PAROL6_COM_PORT |
— |
PAROL6_CONTROL_RATE_HZ |
100 |
PAROL6_EXECUTION_OVERRIDE_TRANSITION_S |
1.0 |
PAROL6_MAX_BACKLOG_COUNT |
500 |
PAROL6_MAX_BLEND_LOOKAHEAD |
100 |
PAROL6_MCAST_GROUP |
239.255.0.101 |
PAROL6_MCAST_IF |
127.0.0.1 |
PAROL6_MCAST_PORT |
50510 |
PAROL6_MCAST_TTL |
1 |
PAROL6_PATH_SAMPLES |
200 |
PAROL6_SERIAL |
— |
PAROL6_SETTLE_MAX_TICKS |
20 |
PAROL6_STATUS_RATE_HZ |
50 |
PAROL6_STATUS_STALE_S |
0.5 |
PAROL6_STATUS_TRANSPORT |
MULTICAST |
PAROL6_STATUS_UNICAST_HOST |
127.0.0.1 |
PAROL_TRACE |
0 |
The ones you are most likely to touch: PAROL6_COM_PORT (the serial port), PAROL6_CONTROL_RATE_HZ and
PAROL6_STATUS_RATE_HZ (the loop and broadcast rates), PAROL6_MCAST_GROUP and PAROL6_MCAST_PORT (where the
status goes; PAROL6_STATUS_TRANSPORT=UNICAST with PAROL6_STATUS_UNICAST_HOST for networks without multicast),
and PAROL6_COLLISION_CHECK (0 disables collision checking). A path or an expression as the default is marked
computed: see config.py.
Security¶
The controller accepts any well-formed command on its UDP port from anyone who can reach it. That is by design,
so that a GUI and a script can share it, and it means: run it on a trusted network, or bind --host 127.0.0.1.
Comments
Found a mistake on this page? Edit it on GitHub · Report it · Get help · This page as Markdown · llms.txt · The whole manual as PDF