**************
RPyC on ev3dev
**************
`RPyC_ `_ (pronounced as are-pie-see) can be used to:
* run a python program on an ev3dev device that controls another ev3dev device.
This is more commonly known as daisy chaining.
* run a python program on your laptop that controls an ev3dev device. This can be
useful if your robot requires CPU intensive code that would be slow to run on the
EV3. A good example of this is a Rubik's cube solver, calculating the solution to
solve a Rubik's cube can be slow on an EV3.
For both of these scenarios you can use RPyC to control multiple remote ev3dev devices.
Networking
==========
You will need IP connectivity between the device where your python code runs
(laptop, an ev3dev device, etc) and the remote ev3dev devices. Some common scenarios
might be:
* Multiple EV3s on the same WiFi network
* A laptop and an EV3 on the same WiFi network
* A bluetooth connection between two EV3s
The `ev3dev networking documentation `_ should get
you up and running in terms of networking connectivity.
Install
=======
1. RPyC is installed on ev3dev but we need to create a service that launches
``rpyc_classic.py`` at bootup. `SSH `_ to your remote ev3dev devices and
cut-n-paste the following commands at the bash prompt.
.. code-block:: shell
echo "[Unit]
Description=RPyC Classic Service
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/rpyc_classic.py
[Install]
WantedBy=multi-user.target" > rpyc-classic.service
sudo cp rpyc-classic.service /lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable rpyc-classic.service
sudo systemctl start rpyc-classic.service
2. If you will be using an ev3dev device to control another ev3dev device you
can skip this step. If you will be using your desktop PC to control an ev3dev
device you must install RPyC on your desktop PC. How you install RPyC depends
on your operating system. For Linux you should be able to do:
.. code-block:: shell
sudo apt-get install python3-rpyc
For Windows there is a win32 installer on the project's `sourceforge page`_.
Also, have a look at the `Download and Install`_ page on their site.
Example
=======
We will run code on our laptop to control the remote ev3dev device with IP
address X.X.X.X. The goal is to have the LargeMotor connected to ``OUTPUT_A``
run when the TouchSensor on ``INPUT_1`` is pressed.
.. code-block:: py
import rpyc
# Create a RPyC connection to the remote ev3dev device.
# Use the hostname or IP address of the ev3dev device.
# If this fails, verify your IP connectivty via ``ping X.X.X.X``
conn = rpyc.classic.connect('X.X.X.X')
# import ev3dev2 on the remote ev3dev device
ev3dev2_motor = conn.modules['ev3dev2.motor']
ev3dev2_sensor = conn.modules['ev3dev2.sensor']
ev3dev2_sensor_lego = conn.modules['ev3dev2.sensor.lego']
# Use the LargeMotor and TouchSensor on the remote ev3dev device
motor = ev3dev2_motor.LargeMotor(ev3dev2_motor.OUTPUT_A)
ts = ev3dev2_sensor_lego.TouchSensor(ev3dev2_sensor.INPUT_1)
# If the TouchSensor is pressed, run the motor
while True:
ts.wait_for_pressed()
motor.run_forever(speed_sp=200)
ts.wait_for_released()
motor.stop()
Pros
====
* RPyC is lightweight and only requires an IP connection (no ssh required).
* Some robots may need much more computational power than an EV3 can give
you. A notable example is the Rubik's cube solver.
Cons
====
* Latency will be introduced by the network connection. This may be a show stopper for robots where reaction speed is essential.
* RPyC is only supported by python, it is *NOT* supported by micropython
References
==========
* `RPyC `_
* `sourceforge page `_
* `Download and Install `_
* `connect with SSH `_