- Run without ROS
- No
sudo
requirement (all dependencies are managed under conda environment, thanks to Cheng Chi) - Simple python interface with complete type hints (see
python/arx5_interface.pyi
) - Joint controller runs at 500Hz in the background (motor communication delay ~0.4ms)
- Cartesian space controller with keyboard and SpaceMouse tele-operation and teach-replay (thanks to Cheng Chi)
- Control multiple arms in the same process through C++ multi-threading
We set up a conda environment for all the cmake dependencies, so no system package is required. If you want to run cmake
and make
after modifying the C++ source files, please make sure you are under the created conda environment (arx-py310
etc.).
We recommend mamba for creating conda environments, which takes only about 1min. You can also use conda
, but it takes significantly longer (~10min).
mamba env create -f conda_environments/py310_environment.yaml
# if you do not have mamba, you can also use conda, which takes significantly longer
# Currently available python versions: 3.8, 3.9, 3.10, 3.11
conda activate arx-py310
mkdir build && cd build
cmake ..
make -j
# At this point, you should be able to run test scripts below.
# To install the C++ package your system, run:
make install
sudo apt install can-utils
sudo apt install net-tools
There are 2 popular firmware types of usb-can adapter, SLCAN
and candleLight
. After plugging the adapter, you can find out the correct firmware type by the following rules:
- Run
ls /dev/ttyACM*
. If there is a new/dev/ttyACM*
device (where * is a number), this adapter is usingSLCAN
firmware - Run
ip a
. If there is a newcan*
interface (where * is a number), this adapter is usingcandleLight
firmware.
Get serial number by:
udevadm info -a -n /dev/ttyACM* | grep serial
# Replace the * by the actual number if there are multiple ttyACM devices connected to your computer.
You will get something like:
ATTRS{serial}=="209738924D4D"
ATTRS{serial}=="0000:00:14.0"
Then edit CAN rules file:
sudo vim /etc/udev/rules.d/arx_can.rules
Copy and paste the following, and replace the serial number with yours. If you are registering multiple adapters, you can use other SYMLINK
names (e.g. arxcan1
) and make sure the following commands are updated accordingly.
SUBSYSTEM=="tty", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="117e", ATTRS{serial}=="209738924D4D", SYMLINK+="arxcan0"
Finally, activate CAN connection by:
sudo udevadm control --reload-rules && sudo udevadm trigger
sudo slcand -o -f -s8 /dev/arxcan0 can0 && sudo ifconfig can0 up
After plugging the adapter and running ip a
, you should immediately find a can interface (usually can0
). If you only have one arm, simply run
sudo ip link set up can0 type can bitrate 1000000
and you are good to go. If you have multiple arms and you want to fix the CAN interface name mapping for each arm, you need to register the adapter to the CAN rules:
sudo dmesg # Find the idVendor, idProduct and serial number of your adapter
sudo vim /etc/udev/rules.d/arx_can.rules
and then append the following line to your arx_can.rules
. Make sure you've replaced the serial number of your adapter and your desired CAN name.
SUBSYSTEM=="net", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="606f", ATTRS{serial}=="0040001E3730511620323746", NAME="can0"
Run the following line to update the changes
sudo udevadm control --reload-rules && sudo systemctl restart systemd-udevd && sudo udevadm trigger
Finally, reconnect your adapter and run
sudo ip link set up can0 type can bitrate 1000000
All the configurations are tested using 3Dconnexion spacemouse. You can skip this step and use keyboard to test Cartesian control.
sudo apt install libspnav-dev spacenavd
sudo systemctl enable spacenavd.service
sudo systemctl start spacenavd.service
Arguments for test_joint_control.py
, keyboard_teleop.py
, spacemouse_teleop.py
and teach_replay.py
:
- (required) model:
X5
(silver and black) orL5
(all black with blue or red LED light) - (required) can_interface:
can0
etc. (runip a
to check your can interface name) - (optional) urdf_path
-u
: by default../models/arx5.urdf
cd python
python examples/test_joint_control.py X5 can0 # replace X5 with L5 for the other model
python examples/test_bimanual.py # For two X5 arms using can0 and can1, each arm will act the same as test_joint_control.py
python examples/keyboard_teleop.py X5 can0
python examples/spacemouse_teleop.py X5 can0
python examples/teach_replay.py X5 can0
To use python sdk from other directories, please make sure ./python
is in $PYTHONPATH
and ./lib/x86_64
or ./lib/aarch64
(depend on your computer system) is in $LD_LIBRARY_PATH
.
export PYTHONPATH=$PYTHONPATH:/path/to/your/arx5-sdk/python
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/arx5-sdk/lib/your_arch
After compiling the arx5_interface
pybind dynamic library (usually python/arx5_interface.cpython-version-arch-linux-gnu.so
), you can run it under other python environments (need to be the same python version as the one you built).