franky-control 1.1.1__cp313-cp313-manylinux_2_28_x86_64.whl → 1.1.2__cp313-cp313-manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- franky/_franky.cpython-313-x86_64-linux-gnu.so +0 -0
- {franky_control-1.1.1.dist-info → franky_control-1.1.2.dist-info}/METADATA +103 -103
- {franky_control-1.1.1.dist-info → franky_control-1.1.2.dist-info}/RECORD +11 -11
- franky_control.libs/{libPocoFoundation-f89fb772.so.95 → libPocoFoundation-55da614c.so.95} +0 -0
- franky_control.libs/{libPocoNet-a223dcdc.so.95 → libPocoNet-18bb01e7.so.95} +0 -0
- franky_control.libs/libfranka-ef91489b.so.0.15.3 +0 -0
- franky_control.libs/{libpinocchio_default-17c55e05.so.3.1.0 → libpinocchio_default-79007ccc.so.3.1.0} +0 -0
- franky_control.libs/{libpinocchio_parsers-f66a7fc8.so.3.1.0 → libpinocchio_parsers-75953cdd.so.3.1.0} +0 -0
- franky_control.libs/libfranka-92ddaf43.so.0.15.0 +0 -0
- {franky_control-1.1.1.dist-info → franky_control-1.1.2.dist-info}/WHEEL +0 -0
- {franky_control-1.1.1.dist-info → franky_control-1.1.2.dist-info}/licenses/LICENSE +0 -0
- {franky_control-1.1.1.dist-info → franky_control-1.1.2.dist-info}/top_level.txt +0 -0
Binary file
|
@@ -1,12 +1,12 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: franky-control
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.2
|
4
4
|
Summary: High-level control library for Franka robots.
|
5
5
|
Home-page: https://github.com/TimSchneider42/franky
|
6
6
|
Author: Tim Schneider
|
7
7
|
Author-email: tim@robot-learning.de
|
8
8
|
License: LGPL-3.0-or-later
|
9
|
-
Keywords:
|
9
|
+
Keywords: control,robotics,franka,franka-panda,franka-research-3
|
10
10
|
Classifier: Development Status :: 4 - Beta
|
11
11
|
Classifier: Intended Audience :: Science/Research
|
12
12
|
Classifier: Topic :: Scientific/Engineering
|
@@ -56,17 +56,17 @@ Dynamic: summary
|
|
56
56
|
</a>
|
57
57
|
</p>
|
58
58
|
|
59
|
-
|
60
|
-
By providing a high-level control interface,
|
59
|
+
franky is a high-level control library for Franka robots, offering Python and C++ support.
|
60
|
+
By providing a high-level control interface, franky eliminates the need for strict real-time programming at 1 kHz,
|
61
61
|
making control from non-real-time environments, such as Python programs, feasible.
|
62
|
-
Instead of relying on low-level control commands,
|
62
|
+
Instead of relying on low-level control commands, franky expects high-level position or velocity targets and
|
63
63
|
uses [Ruckig](https://github.com/pantor/ruckig) to plan time-optimal trajectories in real-time.
|
64
64
|
|
65
|
-
Although Python does not provide real-time guarantees,
|
66
|
-
Motions can be preempted at any moment, prompting
|
67
|
-
To handle unforeseen situations—such as unexpected contact with the environment —
|
68
|
-
allows
|
69
|
-
Furthermore, most non-real-time functionality of [libfranka](https://
|
65
|
+
Although Python does not provide real-time guarantees, franky strives to maintain as much real-time control as possible.
|
66
|
+
Motions can be preempted at any moment, prompting franky to re-plan trajectories on the fly.
|
67
|
+
To handle unforeseen situations—such as unexpected contact with the environment — franky includes a reaction system that
|
68
|
+
allows for updating motion commands dynamically.
|
69
|
+
Furthermore, most non-real-time functionality of [libfranka](https://frankarobotics.github.io/docs/libfranka.html), such as
|
70
70
|
Gripper control is made directly available in Python.
|
71
71
|
|
72
72
|
Check out the [tutorial](#-tutorial) and the [examples](https://github.com/TimSchneider42/franky/tree/master/examples)
|
@@ -80,13 +80,13 @@ at [https://timschneider42.github.io/franky/](https://timschneider42.github.io/f
|
|
80
80
|
No more endless hours setting up ROS, juggling packages, or untangling dependencies. Just `pip install` — no ROS at all.
|
81
81
|
|
82
82
|
- **[Four control modes](#motion-types)**: [Cartesian position](#cartesian-position-control), [Cartesian velocity](#cartesian-velocity-control), [Joint position](#joint-position-control), [Joint velocity](#joint-velocity-control)
|
83
|
-
|
83
|
+
franky uses [Ruckig](https://github.com/pantor/ruckig) to generate smooth, time-optimal trajectories while respecting velocity, acceleration, and jerk limits.
|
84
84
|
|
85
85
|
- **[Real-time control from Python and C++](#real-time-motions)**
|
86
|
-
Need to change the target while the robot’s moving? No problem.
|
86
|
+
Need to change the target while the robot’s moving? No problem. franky replans trajectories on the fly so that you can preempt motions anytime.
|
87
87
|
|
88
88
|
- **[Reactive behavior](#-real-time-reactions)**
|
89
|
-
Robots don’t always go according to plan.
|
89
|
+
Robots don’t always go according to plan. franky lets you define reactions to unexpected events—like contact with the environment — so you can change course in real-time.
|
90
90
|
|
91
91
|
- **[Motion and reaction callbacks](#motion-callbacks)**
|
92
92
|
Want to monitor what’s happening under the hood? Add callbacks to your motions and reactions. They won’t block the control thread and are super handy for debugging or logging.
|
@@ -95,17 +95,17 @@ at [https://timschneider42.github.io/franky/](https://timschneider42.github.io/f
|
|
95
95
|
Adjust max velocity, acceleration, and jerk to match your setup or task. Fine control for smooth, safe operation.
|
96
96
|
|
97
97
|
- **Full Python access to the libfranka API**
|
98
|
-
Want to tweak impedance, read the robot state, set force thresholds, or mess with the Jacobian? Go for it. If libfranka supports it, chances are
|
98
|
+
Want to tweak impedance, read the robot state, set force thresholds, or mess with the Jacobian? Go for it. If libfranka supports it, chances are franky does, too.
|
99
99
|
|
100
100
|
## 📖 Python Quickstart Guide
|
101
101
|
|
102
|
-
Real-time kernel already installed and real-time permissions granted? Just install
|
102
|
+
Real-time kernel already installed and real-time permissions granted? Just install franky via
|
103
103
|
|
104
104
|
```bash
|
105
105
|
pip install franky-control
|
106
106
|
```
|
107
107
|
|
108
|
-
|
108
|
+
Otherwise, follow the [setup instructions](#setup) first.
|
109
109
|
|
110
110
|
Now we are already ready to go!
|
111
111
|
Unlock the brakes in the web interface, activate FCI, and start coding:
|
@@ -113,7 +113,7 @@ Unlock the brakes in the web interface, activate FCI, and start coding:
|
|
113
113
|
```python
|
114
114
|
from franky import *
|
115
115
|
|
116
|
-
robot = Robot("
|
116
|
+
robot = Robot("10.90.90.1") # Replace this with your robot's IP
|
117
117
|
|
118
118
|
# Let's start slow (this lets the robot use a maximum of 5% of its velocity, acceleration, and jerk limits)
|
119
119
|
robot.relative_dynamics_factor = 0.05
|
@@ -127,20 +127,20 @@ If you are seeing server version mismatch errors, such as
|
|
127
127
|
```
|
128
128
|
franky.IncompatibleVersionException: libfranka: Incompatible library version (server version: 5, library version: 9)
|
129
129
|
```
|
130
|
-
then your Franka robot is either not on the most recent firmware version or you are using the older Franka Panda model.
|
131
|
-
In any case, it's no big deal; just check [here](https://
|
130
|
+
then your Franka robot is either not on the most recent firmware version, or you are using the older Franka Panda model.
|
131
|
+
In any case, it's no big deal; just check [here](https://frankarobotics.github.io/docs/compatibility.html) which libfranka version you need and follow our [instructions](installing-franky) to install the appropriate franky wheels.
|
132
132
|
|
133
133
|
## <a id="setup" /> ⚙️ Setup
|
134
134
|
|
135
|
-
To install
|
135
|
+
To install franky, you have to follow three steps:
|
136
136
|
|
137
|
-
1. Ensure that you are using a
|
137
|
+
1. Ensure that you are using a real-time kernel
|
138
138
|
2. Ensure that the executing user has permission to run real-time applications
|
139
|
-
3. Install
|
139
|
+
3. Install franky via pip or build it from source
|
140
140
|
|
141
141
|
### Installing a real-time kernel
|
142
142
|
|
143
|
-
In order for Franky to function properly, it requires the underlying OS to use a
|
143
|
+
In order for Franky to function properly, it requires the underlying OS to use a real-time kernel.
|
144
144
|
Otherwise, you might see `communication_constrains_violation` errors.
|
145
145
|
|
146
146
|
To check whether your system is currently using a real-time kernel, type `uname -a`.
|
@@ -155,12 +155,12 @@ If it does not say PREEMPT_RT, you are not currently running a real-time kernel.
|
|
155
155
|
|
156
156
|
There are multiple ways of installing a real-time kernel.
|
157
157
|
You
|
158
|
-
can [build it from source](https://
|
158
|
+
can [build it from source](https://frankarobotics.github.io/docs/installation_linux.html#setting-up-the-real-time-kernel)
|
159
159
|
or, if you are using Ubuntu, it can be [enabled through Ubuntu Pro](https://ubuntu.com/real-time).
|
160
160
|
|
161
161
|
### Allowing the executing user to run real-time applications
|
162
162
|
|
163
|
-
First, create a group `realtime` and add your user (or whoever is running
|
163
|
+
First, create a group `realtime` and add your user (or whoever is running franky) to this group:
|
164
164
|
|
165
165
|
```bash
|
166
166
|
sudo addgroup realtime
|
@@ -187,18 +187,18 @@ $ groups
|
|
187
187
|
... realtime
|
188
188
|
```
|
189
189
|
|
190
|
-
If
|
190
|
+
If real-time is not listed in your groups, try rebooting.
|
191
191
|
|
192
|
-
### Installing
|
192
|
+
### Installing franky
|
193
193
|
|
194
|
-
To start using
|
194
|
+
To start using franky with Python and libfranka *0.16.0*, just install it via
|
195
195
|
|
196
196
|
```bash
|
197
197
|
pip install franky-control
|
198
198
|
```
|
199
199
|
|
200
200
|
We also provide wheels for libfranka versions *0.7.1*, *0.8.0*, *0.9.2*, *0.10.0*, *0.11.0*, *0.12.1*, *0.13.3*,
|
201
|
-
*0.14.2*, and *0.
|
201
|
+
*0.14.2*, *0.15.3*, and *0.16.0*.
|
202
202
|
They can be installed via
|
203
203
|
|
204
204
|
```bash
|
@@ -211,7 +211,7 @@ pip install --no-index --find-links=./dist franky-control
|
|
211
211
|
|
212
212
|
### Using Docker
|
213
213
|
|
214
|
-
To use
|
214
|
+
To use franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
|
215
215
|
accompanying [docker-compose](docker-compose.yml) file.
|
216
216
|
|
217
217
|
```bash
|
@@ -220,7 +220,7 @@ cd franky/
|
|
220
220
|
docker compose build franky-run
|
221
221
|
```
|
222
222
|
|
223
|
-
To use another version of libfranka than the default (0.
|
223
|
+
To use another version of libfranka than the default (0.16.0), add a build argument:
|
224
224
|
|
225
225
|
```bash
|
226
226
|
docker compose build franky-run --build-arg LIBFRANKA_VERSION=0.9.2
|
@@ -232,15 +232,15 @@ To run the container:
|
|
232
232
|
docker compose run franky-run bash
|
233
233
|
```
|
234
234
|
|
235
|
-
The container requires access to the host
|
235
|
+
The container requires access to the host machine's network *and* elevated user rights to allow the Docker user to set RT
|
236
236
|
capabilities of the processes run from within it.
|
237
237
|
|
238
|
-
### Can I use CUDA jointly with
|
238
|
+
### Can I use CUDA jointly with franky?
|
239
239
|
|
240
240
|
Yes. However, you need to set `IGNORE_PREEMPT_RT_PRESENCE=1` during the installation and all subsequent updates of the CUDA drivers on the real-time kernel.
|
241
241
|
|
242
242
|
First, make sure that you have rebooted your system after installing the real-time kernel.
|
243
|
-
Then, add `IGNORE_PREEMPT_RT_PRESENCE=1` to `/etc/environment`, call `export IGNORE_PREEMPT_RT_PRESENCE=1` to also set it in the current session and follow the instructions of Nvidia to install CUDA on your system.
|
243
|
+
Then, add `IGNORE_PREEMPT_RT_PRESENCE=1` to `/etc/environment`, call `export IGNORE_PREEMPT_RT_PRESENCE=1` to also set it in the current session, and follow the instructions of Nvidia to install CUDA on your system.
|
244
244
|
|
245
245
|
If you are on Ubuntu, you can also use [this](tools/install_cuda_realtime.bash) script to install CUDA on your real-time system:
|
246
246
|
```bash
|
@@ -261,15 +261,15 @@ Alternatively, if you are a cowboy and do not care about security, you can also
|
|
261
261
|
bash <(wget -qO- https://raw.githubusercontent.com/timschneider42/franky/master/tools/install_cuda_realtime.bash)
|
262
262
|
```
|
263
263
|
|
264
|
-
### Building
|
264
|
+
### Building franky
|
265
265
|
|
266
|
-
|
266
|
+
franky is based on [libfranka](https://github.com/frankarobotics/libfranka), [Eigen](https://eigen.tuxfamily.org) for
|
267
267
|
transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
|
268
268
|
As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
|
269
|
-
|
269
|
+
franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
|
270
270
|
|
271
271
|
After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
|
272
|
-
|
272
|
+
franky via
|
273
273
|
|
274
274
|
```bash
|
275
275
|
git clone --recurse-submodules git@github.com:timschneider42/franky.git
|
@@ -281,10 +281,10 @@ make
|
|
281
281
|
make install
|
282
282
|
```
|
283
283
|
|
284
|
-
To use
|
284
|
+
To use franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
|
285
285
|
`target_link_libraries(<target> franky)`.
|
286
286
|
|
287
|
-
If you need only the Python module, you can install
|
287
|
+
If you need only the Python module, you can install franky via
|
288
288
|
|
289
289
|
```bash
|
290
290
|
pip install .
|
@@ -293,9 +293,9 @@ pip install .
|
|
293
293
|
Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in the Python path, e.g. by adjusting
|
294
294
|
`PYTHONPATH` accordingly.
|
295
295
|
|
296
|
-
#### Building
|
296
|
+
#### Building franky with Docker
|
297
297
|
|
298
|
-
For building
|
298
|
+
For building franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
|
299
299
|
|
300
300
|
```bash
|
301
301
|
docker compose build franky-build
|
@@ -305,7 +305,7 @@ docker compose run --rm franky-build build-wheels # To build wheels for all sup
|
|
305
305
|
|
306
306
|
## 📚 Tutorial
|
307
307
|
|
308
|
-
|
308
|
+
franky comes with both a C++ and Python API that differ only regarding real-time capability.
|
309
309
|
We will introduce both languages next to each other.
|
310
310
|
In your C++ project, just include `include <franky.hpp>` and link the library.
|
311
311
|
For Python, just `import franky`.
|
@@ -316,7 +316,7 @@ As a first example, only four lines of code are needed for simple robotic motion
|
|
316
316
|
using namespace franky;
|
317
317
|
|
318
318
|
// Connect to the robot with the FCI IP address
|
319
|
-
Robot robot("
|
319
|
+
Robot robot("10.90.90.1");
|
320
320
|
|
321
321
|
// Reduce velocity and acceleration of the robot
|
322
322
|
robot.setRelativeDynamicsFactor(0.05);
|
@@ -333,7 +333,7 @@ The corresponding program in Python is
|
|
333
333
|
```python
|
334
334
|
from franky import Affine, CartesianMotion, Robot, ReferenceType
|
335
335
|
|
336
|
-
robot = Robot("
|
336
|
+
robot = Robot("10.90.90.1")
|
337
337
|
robot.relative_dynamics_factor = 0.05
|
338
338
|
|
339
339
|
motion = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
@@ -343,7 +343,7 @@ robot.move(motion)
|
|
343
343
|
Before executing any code, make sure that you have enabled the Franka Control Interface (FCI) in the Franka UI web interface.
|
344
344
|
|
345
345
|
Furthermore, we will introduce methods for geometric calculations, for moving the robot according to different motion
|
346
|
-
types, how to implement real-time reactions and changing waypoints in real time as well as controlling the gripper.
|
346
|
+
types, how to implement real-time reactions and changing waypoints in real time, as well as controlling the gripper.
|
347
347
|
|
348
348
|
### 🧮 Geometry
|
349
349
|
|
@@ -368,18 +368,18 @@ In all cases, distances are in [m] and rotations in [rad].
|
|
368
368
|
|
369
369
|
### 🤖 Robot
|
370
370
|
|
371
|
-
|
372
|
-
Moreover, we added methods to adapt the
|
371
|
+
franky exposes most of the libfanka API for Python.
|
372
|
+
Moreover, we added methods to adapt the dynamic limits of the robot for all motions.
|
373
373
|
|
374
374
|
```python
|
375
375
|
from franky import *
|
376
376
|
|
377
|
-
robot = Robot("
|
377
|
+
robot = Robot("10.90.90.1")
|
378
378
|
|
379
379
|
# Recover from errors
|
380
380
|
robot.recover_from_errors()
|
381
381
|
|
382
|
-
# Set velocity, acceleration and jerk to 5% of the maximum
|
382
|
+
# Set velocity, acceleration, and jerk to 5% of the maximum
|
383
383
|
robot.relative_dynamics_factor = 0.05
|
384
384
|
|
385
385
|
# Alternatively, you can define each constraint individually
|
@@ -387,7 +387,7 @@ robot.relative_dynamics_factor = RelativeDynamicsFactor(
|
|
387
387
|
velocity=0.1, acceleration=0.05, jerk=0.1
|
388
388
|
)
|
389
389
|
|
390
|
-
# Or, for more
|
390
|
+
# Or, for more fine-grained access, set individual limits
|
391
391
|
robot.translation_velocity_limit.set(3.0)
|
392
392
|
robot.rotation_velocity_limit.set(2.5)
|
393
393
|
robot.elbow_velocity_limit.set(2.62)
|
@@ -411,21 +411,21 @@ print(robot.joint_jerk_limit.max)
|
|
411
411
|
The robot state can be retrieved by accessing the following properties:
|
412
412
|
|
413
413
|
* `state`: Object of type `franky.RobotState`, which extends the
|
414
|
-
libfranka [franka::RobotState](https://
|
414
|
+
libfranka [franka::RobotState](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html) structure by
|
415
415
|
additional state elements.
|
416
416
|
* `current_cartesian_state`: Object of type `franky.CartesianState`, which contains the end-effector pose and velocity
|
417
417
|
obtained
|
418
|
-
from [franka::RobotState::O_T_EE](https://
|
419
|
-
and [franka::RobotState::O_dP_EE_c](https://
|
418
|
+
from [franka::RobotState::O_T_EE](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#a193781d47722b32925e0ea7ac415f442)
|
419
|
+
and [franka::RobotState::O_dP_EE_c](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#a4be112bd1a9a7d777a67aea4a18a8dcc).
|
420
420
|
* `current_joint_state`: Object of type `franky.JointState`, which contains the joint positions and velocities
|
421
421
|
obtained
|
422
|
-
from [franka::RobotState::q](https://
|
423
|
-
and [franka::RobotState::dq](https://
|
422
|
+
from [franka::RobotState::q](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#ade3335d1ac2f6c44741a916d565f7091)
|
423
|
+
and [franka::RobotState::dq](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#a706045af1b176049e9e56df755325bd2).
|
424
424
|
|
425
425
|
```python
|
426
426
|
from franky import *
|
427
427
|
|
428
|
-
robot = Robot("
|
428
|
+
robot = Robot("10.90.90.1")
|
429
429
|
|
430
430
|
# Get the current state as `franky.RobotState`. See the documentation for a list of fields.
|
431
431
|
state = robot.state
|
@@ -450,10 +450,10 @@ f_t_ee = Affine()
|
|
450
450
|
ee_t_k = Affine()
|
451
451
|
ee_pose_kin = robot.model.pose(Frame.EndEffector, q, f_t_ee, ee_t_k)
|
452
452
|
|
453
|
-
# Get the
|
453
|
+
# Get the Jacobian of the current robot state
|
454
454
|
jacobian = robot.model.body_jacobian(Frame.EndEffector, state)
|
455
455
|
|
456
|
-
# Alternatively, just get the URDF as string and do the kinematics computation yourself (only
|
456
|
+
# Alternatively, just get the URDF as a string and do the kinematics computation yourself (only
|
457
457
|
# for libfranka >= 0.15.0)
|
458
458
|
urdf_model = robot.model_urdf
|
459
459
|
```
|
@@ -464,10 +464,10 @@ and [Model](https://timschneider42.github.io/franky/classfranky_1_1_model.html)
|
|
464
464
|
|
465
465
|
### <a id="motion-types" /> 🏃♂️ Motion Types
|
466
466
|
|
467
|
-
|
467
|
+
franky currently supports four different impedance control modes: **joint position control**, **joint velocity control**, **cartesian position control**, and **cartesian velocity control**.
|
468
468
|
Each of these control modes is invoked by passing the robot an appropriate _Motion_ object.
|
469
469
|
|
470
|
-
In the following, we provide a brief example for each motion type implemented by
|
470
|
+
In the following, we provide a brief example for each motion type implemented by franky in Python.
|
471
471
|
The C++ interface is generally analogous, though some variable and method names are different because we
|
472
472
|
follow [PEP 8](https://peps.python.org/pep-0008/) naming conventions in Python
|
473
473
|
and [Google naming conventions](https://google.github.io/styleguide/cppguide.html) in C++.
|
@@ -493,7 +493,7 @@ m_jp2 = JointWaypointMotion(
|
|
493
493
|
]
|
494
494
|
)
|
495
495
|
|
496
|
-
# Intermediate waypoints also permit
|
496
|
+
# Intermediate waypoints also permit specifying target velocities. The default target velocity
|
497
497
|
# is 0, meaning that the robot will stop at every waypoint.
|
498
498
|
m_jp3 = JointWaypointMotion(
|
499
499
|
[
|
@@ -508,8 +508,8 @@ m_jp3 = JointWaypointMotion(
|
|
508
508
|
]
|
509
509
|
)
|
510
510
|
|
511
|
-
# Stop the robot in joint position control mode. The difference
|
512
|
-
# stop-motions such as CartesianStopMotion is that JointStopMotion stops the robot in joint
|
511
|
+
# Stop the robot in joint position control mode. The difference between JointStopMotion to other
|
512
|
+
# stop-motions, such as CartesianStopMotion, is that JointStopMotion stops the robot in joint
|
513
513
|
# position control mode while CartesianStopMotion stops it in cartesian pose control mode. The
|
514
514
|
# difference becomes relevant when asynchronous move commands are being sent or reactions are
|
515
515
|
# being used(see below).
|
@@ -521,7 +521,7 @@ m_jp4 = JointStopMotion()
|
|
521
521
|
```python
|
522
522
|
from franky import *
|
523
523
|
|
524
|
-
# Accelerate to the given joint velocity and hold it. After 1000ms stop the robot again.
|
524
|
+
# Accelerate to the given joint velocity and hold it. After 1000ms, stop the robot again.
|
525
525
|
m_jv1 = JointVelocityMotion(
|
526
526
|
[0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], duration=Duration(1000)
|
527
527
|
)
|
@@ -567,7 +567,7 @@ m_cp2 = CartesianMotion(
|
|
567
567
|
RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))
|
568
568
|
)
|
569
569
|
|
570
|
-
# A linear motion in
|
570
|
+
# A linear motion in Cartesian space relative to the initial position
|
571
571
|
# (Note that this motion is relative both in position and orientation. Hence, when the robot's
|
572
572
|
# end-effector is oriented differently, it will move in a different direction)
|
573
573
|
m_cp3 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
@@ -589,7 +589,7 @@ m_cp4 = CartesianWaypointMotion(
|
|
589
589
|
]
|
590
590
|
)
|
591
591
|
|
592
|
-
# Cartesian waypoints permit
|
592
|
+
# Cartesian waypoints permit specifying target velocities
|
593
593
|
m_cp5 = CartesianWaypointMotion(
|
594
594
|
[
|
595
595
|
CartesianWaypoint(Affine([0.5, -0.2, 0.3], quat)),
|
@@ -602,7 +602,7 @@ m_cp5 = CartesianWaypointMotion(
|
|
602
602
|
]
|
603
603
|
)
|
604
604
|
|
605
|
-
# Stop the robot in
|
605
|
+
# Stop the robot in Cartesian position control mode.
|
606
606
|
m_cp6 = CartesianStopMotion()
|
607
607
|
```
|
608
608
|
|
@@ -611,7 +611,7 @@ m_cp6 = CartesianStopMotion()
|
|
611
611
|
```python
|
612
612
|
from franky import *
|
613
613
|
|
614
|
-
# A
|
614
|
+
# A Cartesian velocity motion with linear (first argument) and angular (second argument)
|
615
615
|
# components
|
616
616
|
m_cv1 = CartesianVelocityMotion(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]))
|
617
617
|
|
@@ -620,8 +620,8 @@ m_cv2 = CartesianVelocityMotion(
|
|
620
620
|
RobotVelocity(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), elbow_velocity=-0.2)
|
621
621
|
)
|
622
622
|
|
623
|
-
# Cartesian velocity motions also support multiple waypoints. Unlike in
|
624
|
-
# control, a
|
623
|
+
# Cartesian velocity motions also support multiple waypoints. Unlike in Cartesian position
|
624
|
+
# control, a Cartesian velocity waypoint is a target velocity to be reached. This particular
|
625
625
|
# example first accelerates the end-effector, holds the velocity for 1s, then reverses
|
626
626
|
# direction for 2s, reverses direction again for 1s, and finally stops. It is important not to
|
627
627
|
# forget to stop the robot at the end of such a sequence, as it will otherwise throw an error.
|
@@ -643,25 +643,25 @@ m_cv4 = CartesianVelocityWaypointMotion(
|
|
643
643
|
]
|
644
644
|
)
|
645
645
|
|
646
|
-
# Stop the robot in
|
646
|
+
# Stop the robot in Cartesian velocity control mode.
|
647
647
|
m_cv6 = CartesianVelocityStopMotion()
|
648
648
|
```
|
649
649
|
|
650
650
|
#### Relative Dynamics Factors
|
651
651
|
|
652
|
-
Every motion and waypoint type allows
|
652
|
+
Every motion and waypoint type allows for adapting the dynamics (velocity, acceleration, and jerk) by setting the respective
|
653
653
|
`relative_dynamics_factor` parameter.
|
654
|
-
This parameter can also be set for the robot globally as shown below or in the `robot.move` command.
|
654
|
+
This parameter can also be set for the robot globally, as shown below, or in the `robot.move` command.
|
655
655
|
Crucially, relative dynamics factors on different layers (robot, move command, and motion) do not override each other
|
656
656
|
but rather get multiplied.
|
657
657
|
Hence, a relative dynamics factor on a motion can only reduce the dynamics of the robot and never increase them.
|
658
658
|
|
659
|
-
There is one exception to this rule and that is if any layer sets the relative dynamics factor to
|
659
|
+
There is one exception to this rule, and that is if any layer sets the relative dynamics factor to
|
660
660
|
`RelativeDynamicsFactor.MAX_DYNAMICS`.
|
661
661
|
This will cause the motion to be executed with maximum velocity, acceleration, and jerk limits, independently of the
|
662
662
|
relative dynamics factors of the other layers.
|
663
|
-
This feature should only be used to abruptly stop the robot in case of an unexpected environment contact as executing
|
664
|
-
|
663
|
+
This feature should only be used to abruptly stop the robot in case of an unexpected environment contact, as executing
|
664
|
+
Other motions with it are likely to lead to a discontinuity error and might be dangerous.
|
665
665
|
|
666
666
|
#### Executing Motions
|
667
667
|
|
@@ -677,7 +677,7 @@ robot.relative_dynamics_factor = RelativeDynamicsFactor(0.05, 0.1, 0.15)
|
|
677
677
|
|
678
678
|
robot.move(m_jp1)
|
679
679
|
|
680
|
-
# We can also set a relative dynamics factor in the move command. It will be multiplied
|
680
|
+
# We can also set a relative dynamics factor in the move command. It will be multiplied by
|
681
681
|
# the other relative dynamics factors (robot and motion if present).
|
682
682
|
robot.move(m_jp2, relative_dynamics_factor=0.8)
|
683
683
|
```
|
@@ -704,7 +704,7 @@ robot.move(m_jp1)
|
|
704
704
|
|
705
705
|
Note that in Python, these callbacks are not executed in the control thread since they would otherwise block it.
|
706
706
|
Instead, they are put in a queue and executed by another thread.
|
707
|
-
While this scheme ensures that the control thread can always run, it cannot prevent
|
707
|
+
While this scheme ensures that the control thread can always run, it cannot prevent the queue from growing indefinitely
|
708
708
|
when the callbacks take more time to execute than it takes for new callbacks to be queued.
|
709
709
|
Hence, callbacks might be executed significantly after they were queued if they take a long time to execute.
|
710
710
|
|
@@ -721,11 +721,11 @@ motion = CartesianMotion(Affine([0.0, 0.0, 0.1]), ReferenceType.Relative) # Mov
|
|
721
721
|
|
722
722
|
# It is important that the reaction motion uses the same control mode as the original motion.
|
723
723
|
# Hence, we cannot register a JointMotion as a reaction motion to a CartesianMotion.
|
724
|
-
# Move up
|
725
|
-
reaction_motion = CartesianMotion(Affine([0.0, 0.0, 0.01]), ReferenceType.Relative)
|
724
|
+
# Move up by 1cm
|
725
|
+
reaction_motion = CartesianMotion(Affine([0.0, 0.0, -0.01]), ReferenceType.Relative)
|
726
726
|
|
727
727
|
# Trigger reaction if the Z force is greater than 30N
|
728
|
-
reaction = Reaction(Measure.FORCE_Z >
|
728
|
+
reaction = Reaction(Measure.FORCE_Z > 5.0, reaction_motion)
|
729
729
|
motion.add_reaction(reaction)
|
730
730
|
|
731
731
|
robot.move(motion)
|
@@ -782,7 +782,7 @@ with lower priority to ensure that the control thread does not get blocked.
|
|
782
782
|
Thus, the callbacks might fire substantially after the reaction has fired, depending on the time it takes to execute
|
783
783
|
them.
|
784
784
|
|
785
|
-
In C
|
785
|
+
In C++, you can additionally use lambdas to define more complex behaviours:
|
786
786
|
|
787
787
|
```c++
|
788
788
|
auto motion = CartesianMotion(
|
@@ -824,20 +824,20 @@ Instead, it returns immediately and, thus, allows the main thread to set new mot
|
|
824
824
|
import time
|
825
825
|
from franky import Affine, CartesianMotion, Robot, ReferenceType
|
826
826
|
|
827
|
-
robot = Robot("
|
827
|
+
robot = Robot("10.90.90.1")
|
828
828
|
robot.relative_dynamics_factor = 0.05
|
829
829
|
|
830
830
|
motion1 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
831
831
|
robot.move(motion1, asynchronous=True)
|
832
832
|
|
833
833
|
time.sleep(0.5)
|
834
|
-
# Note that similar to reactions, when preempting active motions with new motions, the
|
834
|
+
# Note that, similar to reactions, when preempting active motions with new motions, the
|
835
835
|
# control mode cannot change. Hence, we cannot use, e.g., a JointMotion here.
|
836
836
|
motion2 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
837
837
|
robot.move(motion2, asynchronous=True)
|
838
838
|
```
|
839
839
|
|
840
|
-
By calling `Robot.join_motion
|
840
|
+
By calling `Robot.join_motion`, the main thread can be synchronized with the motion thread, as it will block until the
|
841
841
|
robot finishes its motion.
|
842
842
|
|
843
843
|
```python
|
@@ -846,21 +846,21 @@ robot.join_motion()
|
|
846
846
|
|
847
847
|
Note that when exceptions occur during the asynchronous execution of a motion, they will not be thrown immediately.
|
848
848
|
Instead, the control thread stores the exception and terminates.
|
849
|
-
The next time `Robot.join_motion` or `Robot.move`
|
849
|
+
The next time `Robot.join_motion` or `Robot.move` is called, they will throw the stored exception in the main thread.
|
850
850
|
Hence, after an asynchronous motion has finished, make sure to call `Robot.join_motion` to ensure being notified of any
|
851
851
|
exceptions that occurred during the motion.
|
852
852
|
|
853
853
|
### <a id="gripper" /> 👌 Gripper
|
854
854
|
|
855
855
|
In the `franky::Gripper` class, the default gripper force and gripper speed can be set.
|
856
|
-
Then,
|
856
|
+
Then, in addition to the libfranka commands, the following helper methods can be used:
|
857
857
|
|
858
858
|
```c++
|
859
859
|
#include <franky.hpp>
|
860
860
|
#include <chrono>
|
861
861
|
#include <future>
|
862
862
|
|
863
|
-
auto gripper = franky::Gripper("
|
863
|
+
auto gripper = franky::Gripper("10.90.90.1");
|
864
864
|
|
865
865
|
double speed = 0.02; // [m/s]
|
866
866
|
double force = 20.0; // [N]
|
@@ -891,12 +891,12 @@ if (!success_future.wait_for(std::chrono::seconds(1)) == std::future_status::rea
|
|
891
891
|
}
|
892
892
|
```
|
893
893
|
|
894
|
-
The Python API follows the
|
894
|
+
The Python API follows the C++ API closely:
|
895
895
|
|
896
896
|
```python
|
897
897
|
import franky
|
898
898
|
|
899
|
-
gripper = franky.Gripper("
|
899
|
+
gripper = franky.Gripper("10.90.90.1")
|
900
900
|
|
901
901
|
speed = 0.02 # [m/s]
|
902
902
|
force = 20.0 # [N]
|
@@ -929,9 +929,9 @@ else:
|
|
929
929
|
|
930
930
|
For Franka robots, control happens via the Franka Control Interface (FCI), which has to be enabled through the Franka UI in the robot's web interface.
|
931
931
|
The Franka UI also provides methods for locking and unlocking the brakes, setting the execution mode, and executing the safety self-test.
|
932
|
-
However, sometimes you may want to access these methods programmatically, e.g
|
932
|
+
However, sometimes you may want to access these methods programmatically, e.g., for automatically unlocking the brakes before starting a motion, or automatically executing the self-test after 24h of continuous execution.
|
933
933
|
|
934
|
-
For that reason,
|
934
|
+
For that reason, franky provides a `RobotWebSession` class that allows you to access the web interface API of the robot.
|
935
935
|
Note that directly accessing the web interface API is not officially supported and documented by Franka.
|
936
936
|
Hence, use this feature at your own risk.
|
937
937
|
|
@@ -940,7 +940,7 @@ A typical automated workflow could look like this:
|
|
940
940
|
```python
|
941
941
|
import franky
|
942
942
|
|
943
|
-
with franky.RobotWebSession("
|
943
|
+
with franky.RobotWebSession("10.90.90.1", "username", "password") as robot_web_session:
|
944
944
|
# First take control
|
945
945
|
try:
|
946
946
|
# Try taking control. The session currently holding control has to release it in order
|
@@ -978,7 +978,7 @@ In case you are running the robot for longer than 24h you will have noticed that
|
|
978
978
|
import time
|
979
979
|
import franky
|
980
980
|
|
981
|
-
with franky.RobotWebSession("
|
981
|
+
with franky.RobotWebSession("10.90.90.1", "username", "password") as robot_web_session:
|
982
982
|
# Execute self-test if the time until self-test is less than 5 minutes.
|
983
983
|
if robot_web_session.get_system_status()["safety"]["timeToTd2"] < 300:
|
984
984
|
robot_web_session.disable_fci()
|
@@ -1002,9 +1002,9 @@ See [robot_web_session.py](franky/robot_web_session.py) for an example of how to
|
|
1002
1002
|
|
1003
1003
|
## 🛠️ Development
|
1004
1004
|
|
1005
|
-
|
1005
|
+
franky is currently tested against the following versions
|
1006
1006
|
|
1007
|
-
- libfranka 0.7.1, 0.8.0, 0.9.2, 0.10.0, 0.11.0, 0.12.1, 0.13.3, 0.14.2, 0.15.0
|
1007
|
+
- libfranka 0.7.1, 0.8.0, 0.9.2, 0.10.0, 0.11.0, 0.12.1, 0.13.3, 0.14.2, 0.15.3, 0.16.0
|
1008
1008
|
- Eigen 3.4.0
|
1009
1009
|
- Pybind11 2.13.6
|
1010
1010
|
- POCO 1.12.5p2
|
@@ -1015,20 +1015,20 @@ Franky is currently tested against following versions
|
|
1015
1015
|
## 📜 License
|
1016
1016
|
|
1017
1017
|
For non-commercial applications, this software is licensed under the LGPL v3.0.
|
1018
|
-
If you want to use
|
1018
|
+
If you want to use franky within commercial applications or under a different license, please contact us for individual
|
1019
1019
|
agreements.
|
1020
1020
|
|
1021
1021
|
## 🔍 Differences to frankx
|
1022
1022
|
|
1023
|
-
|
1023
|
+
franky started originally as a fork of [frankx](https://github.com/pantor/frankx), though both codebase and
|
1024
1024
|
functionality differ substantially from frankx by now.
|
1025
|
-
Aside
|
1025
|
+
Aside from bug fixes and general performance improvements, franky provides the following new features/improvements:
|
1026
1026
|
|
1027
1027
|
* [Motions can be updated asynchronously.](#-real-time-motions)
|
1028
1028
|
* [Reactions allow for the registration of callbacks instead of just printing to stdout when fired.](#-real-time-reactions)
|
1029
1029
|
* [Motions allow for the registration of callbacks for profiling.](#motion-callbacks)
|
1030
1030
|
* [The robot state is also available during control.](#robot-state)
|
1031
|
-
* A larger part of the libfranka API is exposed to python (e.g
|
1031
|
+
* A larger part of the libfranka API is exposed to python (e.g., `setCollisionBehavior`, `setJoinImpedance`, and
|
1032
1032
|
`setCartesianImpedance`).
|
1033
1033
|
* Cartesian motion generation handles boundaries in Euler angles properly.
|
1034
1034
|
* [There is a new joint motion type that supports waypoints.](#-motion-types)
|
@@ -1039,7 +1039,7 @@ Aside of bug fixes and general performance improvements, Franky provides the fol
|
|
1039
1039
|
* [The `Measure` class allows for arithmetic operations.](#-real-time-reactions)
|
1040
1040
|
* Exceptions caused by libfranka are raised properly instead of being printed to stdout.
|
1041
1041
|
* [We provide wheels for both Franka Research 3 and the older Franka Panda](#-setup)
|
1042
|
-
*
|
1042
|
+
* franky supports [joint velocity control](#joint-velocity-control)
|
1043
1043
|
and [cartesian velocity control](#cartesian-velocity-control)
|
1044
1044
|
* The dynamics limits are not hard-coded anymore but can be [set for each robot instance](#-robot).
|
1045
1045
|
|
@@ -1050,4 +1050,4 @@ Please run the [pre-commit](https://pre-commit.com/) hooks before submitting you
|
|
1050
1050
|
To install the pre-commit hooks, run:
|
1051
1051
|
|
1052
1052
|
1. [Install pre-commit](https://pre-commit.com/#install)
|
1053
|
-
2. Install the Git hooks by running `pre-commit install` or, alternatively, run `pre-commit run --all-files manually.
|
1053
|
+
2. Install the Git hooks by running `pre-commit install` or, alternatively, run `pre-commit run --all-files` manually.
|
@@ -1,27 +1,27 @@
|
|
1
1
|
franky/__init__.py,sha256=57BsmUytdeqMrhHglwvxMS6CgpAEVPw0KJge8_UTzEA,378
|
2
|
-
franky/_franky.cpython-313-x86_64-linux-gnu.so,sha256=
|
2
|
+
franky/_franky.cpython-313-x86_64-linux-gnu.so,sha256=bhLWBKG0iW3A3-HGuKvLVhw63TGz0xCTJmwKRLhnwIw,3092313
|
3
3
|
franky/_franky.pyi,sha256=odBnBaM2qGN4mUa8WvFN5SL9aszPgDTsZj5Jb9UkFHk,60047
|
4
4
|
franky/motion.py,sha256=TWsx2Ba9iYG9e-OxpuYZlVn1wdzKS-Zvz6ayHT_HYXQ,354
|
5
5
|
franky/reaction.py,sha256=cBuHAMek9yH-9Zmwfa0dzz2t5G_1SQEWXNdW7mhhCI8,1519
|
6
6
|
franky/robot.py,sha256=NaTNh4PaJshbz44eibvLCMt6O_Ak7TRVjhUR6AGay9A,236
|
7
7
|
franky/robot_web_session.py,sha256=rYpnUe4b8xj5JjCYxNRZ0uYz8lL2qfxKglcImFDw24Y,9070
|
8
|
-
franky_control.libs/libPocoFoundation-
|
9
|
-
franky_control.libs/libPocoNet-
|
8
|
+
franky_control.libs/libPocoFoundation-55da614c.so.95,sha256=C9mBkna2m4LazUpeOgAp9-NRNUMDdpBMVeaasVAZzSk,3273833
|
9
|
+
franky_control.libs/libPocoNet-18bb01e7.so.95,sha256=rw04unxMioVxQ1Dd01N0pP0hy8kii8uYN7bOQjtrf50,2504833
|
10
10
|
franky_control.libs/libboost_filesystem-38deced9.so.1.66.0,sha256=-thu-LYmEDUKnOhQw3njV9C58dVZV12pn_6-KoqDCeI,145241
|
11
11
|
franky_control.libs/libboost_serialization-3aa46b41.so.1.66.0,sha256=KpSA9K4iakzd-Mvv5JvPSqxJyMYsVkcIXrUbSlAkiIo,316673
|
12
12
|
franky_control.libs/libboost_system-69a6c43e.so.1.66.0,sha256=sd_lA0coUWXm-bluxkOkNrzrxFSAXYDphjPDwBekik8,22905
|
13
13
|
franky_control.libs/libconsole_bridge-def124d9.so.0.3,sha256=Eg1wJzVIRG5GQhyr59_qdYgnmhto0orU0j8HW2A0JIg,27297
|
14
14
|
franky_control.libs/libfmt-8375f6bf.so.6.2.1,sha256=Z8D_NYG4rsuwMIYP3KfNB95w7vnsPaV5XLm2EnWd9Fk,327441
|
15
|
-
franky_control.libs/libfranka-
|
16
|
-
franky_control.libs/libpinocchio_default-
|
17
|
-
franky_control.libs/libpinocchio_parsers-
|
15
|
+
franky_control.libs/libfranka-ef91489b.so.0.15.3,sha256=eVy59SBbO6LWbJgdmJfiPrZuLYrIRJmxufaGKUXCEPs,1608673
|
16
|
+
franky_control.libs/libpinocchio_default-79007ccc.so.3.1.0,sha256=L22h0rzxvI-BfOpnGXX92_tNeo1TGqgLTk0jSwTbNms,9255841
|
17
|
+
franky_control.libs/libpinocchio_parsers-75953cdd.so.3.1.0,sha256=csrLN2aHiR_j77t8xTqUloqxcy043HzGG8lFT4K-tAA,713129
|
18
18
|
franky_control.libs/libtinyxml-435d1f53.so.0.2.6.2,sha256=BGSkG-zXEYTuGquHhydNow2ufOetDZpEP7MbBZyf6hA,120209
|
19
19
|
franky_control.libs/liburdfdom_model-9e7b5a88.so.1.0,sha256=c4cAZ09SHlu-dpMZmwsxC8Ydklm8RzEANxvdJHeh4Ho,187561
|
20
20
|
franky_control.libs/liburdfdom_model_state-741cbb83.so.1.0,sha256=NvqLfm2u-YlCihr5GRoUGL6iJMLRHm-RFEmR0he5csM,59105
|
21
21
|
franky_control.libs/liburdfdom_sensor-5dbb5bb4.so.1.0,sha256=udrHZ0oYFTf9qwr8hm8rSrBKZDkd1L5yy5tyh10D018,51777
|
22
22
|
franky_control.libs/liburdfdom_world-bd943329.so.1.0,sha256=ja9WE45nXtAGUoLpg1T1Hte8BZLldj_WNf9cL3H1RPk,187561
|
23
|
-
franky_control-1.1.
|
24
|
-
franky_control-1.1.
|
25
|
-
franky_control-1.1.
|
26
|
-
franky_control-1.1.
|
27
|
-
franky_control-1.1.
|
23
|
+
franky_control-1.1.2.dist-info/METADATA,sha256=0omOMnCsvfoJiVYM-tuxiS_L_Gmqzq09UT46DVB6xn8,41345
|
24
|
+
franky_control-1.1.2.dist-info/WHEEL,sha256=wj07yRGyNgfcgMSZOScoYkBkpidoeAzGSgCNSOVFG2E,113
|
25
|
+
franky_control-1.1.2.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
|
26
|
+
franky_control-1.1.2.dist-info/RECORD,,
|
27
|
+
franky_control-1.1.2.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
|
index 5a8a2a3..4aec85b 100755
|
|
Binary file
|
index dc82175..385d75e 100755
|
|
Binary file
|
Binary file
|
index c0bfda3..059f79f 100755
|
|
Binary file
|
index 8314b06..119d11a 100755
|
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|