franky-control 1.1.0__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.0.dist-info → franky_control-1.1.2.dist-info}/METADATA +272 -210
- {franky_control-1.1.0.dist-info → franky_control-1.1.2.dist-info}/RECORD +11 -11
- franky_control.libs/{libPocoFoundation-91a48101.so.95 → libPocoFoundation-55da614c.so.95} +0 -0
- franky_control.libs/{libPocoNet-9e586dc9.so.95 → libPocoNet-18bb01e7.so.95} +0 -0
- franky_control.libs/libfranka-ef91489b.so.0.15.3 +0 -0
- franky_control.libs/{libpinocchio_default-53a889f9.so.3.1.0 → libpinocchio_default-79007ccc.so.3.1.0} +0 -0
- franky_control.libs/{libpinocchio_parsers-a0902fb5.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.0.dist-info → franky_control-1.1.2.dist-info}/WHEEL +0 -0
- {franky_control-1.1.0.dist-info → franky_control-1.1.2.dist-info}/licenses/LICENSE +0 -0
- {franky_control-1.1.0.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,24 +95,25 @@ 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:
|
112
|
+
|
112
113
|
```python
|
113
114
|
from franky import *
|
114
115
|
|
115
|
-
robot = Robot("
|
116
|
+
robot = Robot("10.90.90.1") # Replace this with your robot's IP
|
116
117
|
|
117
118
|
# Let's start slow (this lets the robot use a maximum of 5% of its velocity, acceleration, and jerk limits)
|
118
119
|
robot.relative_dynamics_factor = 0.05
|
@@ -126,20 +127,20 @@ If you are seeing server version mismatch errors, such as
|
|
126
127
|
```
|
127
128
|
franky.IncompatibleVersionException: libfranka: Incompatible library version (server version: 5, library version: 9)
|
128
129
|
```
|
129
|
-
then your Franka robot is either not on the most recent firmware version or you are using the older Franka Panda model.
|
130
|
-
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.
|
131
132
|
|
132
133
|
## <a id="setup" /> ⚙️ Setup
|
133
134
|
|
134
|
-
To install
|
135
|
+
To install franky, you have to follow three steps:
|
135
136
|
|
136
|
-
1. Ensure that you are using a
|
137
|
+
1. Ensure that you are using a real-time kernel
|
137
138
|
2. Ensure that the executing user has permission to run real-time applications
|
138
|
-
3. Install
|
139
|
+
3. Install franky via pip or build it from source
|
139
140
|
|
140
141
|
### Installing a real-time kernel
|
141
142
|
|
142
|
-
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.
|
143
144
|
Otherwise, you might see `communication_constrains_violation` errors.
|
144
145
|
|
145
146
|
To check whether your system is currently using a real-time kernel, type `uname -a`.
|
@@ -154,12 +155,12 @@ If it does not say PREEMPT_RT, you are not currently running a real-time kernel.
|
|
154
155
|
|
155
156
|
There are multiple ways of installing a real-time kernel.
|
156
157
|
You
|
157
|
-
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)
|
158
159
|
or, if you are using Ubuntu, it can be [enabled through Ubuntu Pro](https://ubuntu.com/real-time).
|
159
160
|
|
160
161
|
### Allowing the executing user to run real-time applications
|
161
162
|
|
162
|
-
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:
|
163
164
|
|
164
165
|
```bash
|
165
166
|
sudo addgroup realtime
|
@@ -186,18 +187,18 @@ $ groups
|
|
186
187
|
... realtime
|
187
188
|
```
|
188
189
|
|
189
|
-
If
|
190
|
+
If real-time is not listed in your groups, try rebooting.
|
190
191
|
|
191
|
-
### Installing
|
192
|
+
### Installing franky
|
192
193
|
|
193
|
-
To start using
|
194
|
+
To start using franky with Python and libfranka *0.16.0*, just install it via
|
194
195
|
|
195
196
|
```bash
|
196
197
|
pip install franky-control
|
197
198
|
```
|
198
199
|
|
199
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*,
|
200
|
-
*0.14.2*, and *0.
|
201
|
+
*0.14.2*, *0.15.3*, and *0.16.0*.
|
201
202
|
They can be installed via
|
202
203
|
|
203
204
|
```bash
|
@@ -208,39 +209,9 @@ pip install numpy
|
|
208
209
|
pip install --no-index --find-links=./dist franky-control
|
209
210
|
```
|
210
211
|
|
211
|
-
|
212
|
-
transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
|
213
|
-
As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
|
214
|
-
Franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
|
215
|
-
|
216
|
-
After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
|
217
|
-
Franky via
|
218
|
-
|
219
|
-
```bash
|
220
|
-
git clone --recurse-submodules git@github.com:timschneider42/franky.git
|
221
|
-
cd franky
|
222
|
-
mkdir -p build
|
223
|
-
cd build
|
224
|
-
cmake -DCMAKE_BUILD_TYPE=Release ..
|
225
|
-
make
|
226
|
-
make install
|
227
|
-
```
|
228
|
-
|
229
|
-
To use Franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
|
230
|
-
`target_link_libraries(<target> franky)`.
|
231
|
-
|
232
|
-
If you need only the Python module, you can install Franky via
|
212
|
+
### Using Docker
|
233
213
|
|
234
|
-
|
235
|
-
pip install .
|
236
|
-
```
|
237
|
-
|
238
|
-
Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in the Python path, e.g. by adjusting
|
239
|
-
`PYTHONPATH` accordingly.
|
240
|
-
|
241
|
-
#### Using Docker
|
242
|
-
|
243
|
-
To use Franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
|
214
|
+
To use franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
|
244
215
|
accompanying [docker-compose](docker-compose.yml) file.
|
245
216
|
|
246
217
|
```bash
|
@@ -249,7 +220,7 @@ cd franky/
|
|
249
220
|
docker compose build franky-run
|
250
221
|
```
|
251
222
|
|
252
|
-
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:
|
253
224
|
|
254
225
|
```bash
|
255
226
|
docker compose build franky-run --build-arg LIBFRANKA_VERSION=0.9.2
|
@@ -261,25 +232,15 @@ To run the container:
|
|
261
232
|
docker compose run franky-run bash
|
262
233
|
```
|
263
234
|
|
264
|
-
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
|
265
236
|
capabilities of the processes run from within it.
|
266
237
|
|
267
|
-
|
268
|
-
|
269
|
-
For building Franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
|
270
|
-
|
271
|
-
```bash
|
272
|
-
docker compose build franky-build
|
273
|
-
docker compose run --rm franky-build run-tests # To run the tests
|
274
|
-
docker compose run --rm franky-build build-wheels # To build wheels for all supported python versions
|
275
|
-
```
|
276
|
-
|
277
|
-
### Can I use CUDA jointly with Franky?
|
238
|
+
### Can I use CUDA jointly with franky?
|
278
239
|
|
279
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.
|
280
241
|
|
281
242
|
First, make sure that you have rebooted your system after installing the real-time kernel.
|
282
|
-
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.
|
283
244
|
|
284
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:
|
285
246
|
```bash
|
@@ -300,9 +261,51 @@ Alternatively, if you are a cowboy and do not care about security, you can also
|
|
300
261
|
bash <(wget -qO- https://raw.githubusercontent.com/timschneider42/franky/master/tools/install_cuda_realtime.bash)
|
301
262
|
```
|
302
263
|
|
264
|
+
### Building franky
|
265
|
+
|
266
|
+
franky is based on [libfranka](https://github.com/frankarobotics/libfranka), [Eigen](https://eigen.tuxfamily.org) for
|
267
|
+
transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
|
268
|
+
As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
|
269
|
+
franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
|
270
|
+
|
271
|
+
After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
|
272
|
+
franky via
|
273
|
+
|
274
|
+
```bash
|
275
|
+
git clone --recurse-submodules git@github.com:timschneider42/franky.git
|
276
|
+
cd franky
|
277
|
+
mkdir -p build
|
278
|
+
cd build
|
279
|
+
cmake -DCMAKE_BUILD_TYPE=Release ..
|
280
|
+
make
|
281
|
+
make install
|
282
|
+
```
|
283
|
+
|
284
|
+
To use franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
|
285
|
+
`target_link_libraries(<target> franky)`.
|
286
|
+
|
287
|
+
If you need only the Python module, you can install franky via
|
288
|
+
|
289
|
+
```bash
|
290
|
+
pip install .
|
291
|
+
```
|
292
|
+
|
293
|
+
Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in the Python path, e.g. by adjusting
|
294
|
+
`PYTHONPATH` accordingly.
|
295
|
+
|
296
|
+
#### Building franky with Docker
|
297
|
+
|
298
|
+
For building franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
|
299
|
+
|
300
|
+
```bash
|
301
|
+
docker compose build franky-build
|
302
|
+
docker compose run --rm franky-build run-tests # To run the tests
|
303
|
+
docker compose run --rm franky-build build-wheels # To build wheels for all supported python versions
|
304
|
+
```
|
305
|
+
|
303
306
|
## 📚 Tutorial
|
304
307
|
|
305
|
-
|
308
|
+
franky comes with both a C++ and Python API that differ only regarding real-time capability.
|
306
309
|
We will introduce both languages next to each other.
|
307
310
|
In your C++ project, just include `include <franky.hpp>` and link the library.
|
308
311
|
For Python, just `import franky`.
|
@@ -313,7 +316,7 @@ As a first example, only four lines of code are needed for simple robotic motion
|
|
313
316
|
using namespace franky;
|
314
317
|
|
315
318
|
// Connect to the robot with the FCI IP address
|
316
|
-
Robot robot("
|
319
|
+
Robot robot("10.90.90.1");
|
317
320
|
|
318
321
|
// Reduce velocity and acceleration of the robot
|
319
322
|
robot.setRelativeDynamicsFactor(0.05);
|
@@ -330,7 +333,7 @@ The corresponding program in Python is
|
|
330
333
|
```python
|
331
334
|
from franky import Affine, CartesianMotion, Robot, ReferenceType
|
332
335
|
|
333
|
-
robot = Robot("
|
336
|
+
robot = Robot("10.90.90.1")
|
334
337
|
robot.relative_dynamics_factor = 0.05
|
335
338
|
|
336
339
|
motion = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
@@ -340,7 +343,7 @@ robot.move(motion)
|
|
340
343
|
Before executing any code, make sure that you have enabled the Franka Control Interface (FCI) in the Franka UI web interface.
|
341
344
|
|
342
345
|
Furthermore, we will introduce methods for geometric calculations, for moving the robot according to different motion
|
343
|
-
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.
|
344
347
|
|
345
348
|
### 🧮 Geometry
|
346
349
|
|
@@ -365,24 +368,26 @@ In all cases, distances are in [m] and rotations in [rad].
|
|
365
368
|
|
366
369
|
### 🤖 Robot
|
367
370
|
|
368
|
-
|
369
|
-
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.
|
370
373
|
|
371
374
|
```python
|
372
375
|
from franky import *
|
373
376
|
|
374
|
-
robot = Robot("
|
377
|
+
robot = Robot("10.90.90.1")
|
375
378
|
|
376
379
|
# Recover from errors
|
377
380
|
robot.recover_from_errors()
|
378
381
|
|
379
|
-
# Set velocity, acceleration and jerk to 5% of the maximum
|
382
|
+
# Set velocity, acceleration, and jerk to 5% of the maximum
|
380
383
|
robot.relative_dynamics_factor = 0.05
|
381
384
|
|
382
385
|
# Alternatively, you can define each constraint individually
|
383
|
-
robot.relative_dynamics_factor = RelativeDynamicsFactor(
|
386
|
+
robot.relative_dynamics_factor = RelativeDynamicsFactor(
|
387
|
+
velocity=0.1, acceleration=0.05, jerk=0.1
|
388
|
+
)
|
384
389
|
|
385
|
-
# Or, for more
|
390
|
+
# Or, for more fine-grained access, set individual limits
|
386
391
|
robot.translation_velocity_limit.set(3.0)
|
387
392
|
robot.rotation_velocity_limit.set(2.5)
|
388
393
|
robot.elbow_velocity_limit.set(2.62)
|
@@ -406,21 +411,21 @@ print(robot.joint_jerk_limit.max)
|
|
406
411
|
The robot state can be retrieved by accessing the following properties:
|
407
412
|
|
408
413
|
* `state`: Object of type `franky.RobotState`, which extends the
|
409
|
-
libfranka [franka::RobotState](https://
|
414
|
+
libfranka [franka::RobotState](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html) structure by
|
410
415
|
additional state elements.
|
411
416
|
* `current_cartesian_state`: Object of type `franky.CartesianState`, which contains the end-effector pose and velocity
|
412
417
|
obtained
|
413
|
-
from [franka::RobotState::O_T_EE](https://
|
414
|
-
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).
|
415
420
|
* `current_joint_state`: Object of type `franky.JointState`, which contains the joint positions and velocities
|
416
421
|
obtained
|
417
|
-
from [franka::RobotState::q](https://
|
418
|
-
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).
|
419
424
|
|
420
425
|
```python
|
421
426
|
from franky import *
|
422
427
|
|
423
|
-
robot = Robot("
|
428
|
+
robot = Robot("10.90.90.1")
|
424
429
|
|
425
430
|
# Get the current state as `franky.RobotState`. See the documentation for a list of fields.
|
426
431
|
state = robot.state
|
@@ -445,10 +450,11 @@ f_t_ee = Affine()
|
|
445
450
|
ee_t_k = Affine()
|
446
451
|
ee_pose_kin = robot.model.pose(Frame.EndEffector, q, f_t_ee, ee_t_k)
|
447
452
|
|
448
|
-
# Get the
|
453
|
+
# Get the Jacobian of the current robot state
|
449
454
|
jacobian = robot.model.body_jacobian(Frame.EndEffector, state)
|
450
455
|
|
451
|
-
# 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
|
+
# for libfranka >= 0.15.0)
|
452
458
|
urdf_model = robot.model_urdf
|
453
459
|
```
|
454
460
|
|
@@ -458,10 +464,10 @@ and [Model](https://timschneider42.github.io/franky/classfranky_1_1_model.html)
|
|
458
464
|
|
459
465
|
### <a id="motion-types" /> 🏃♂️ Motion Types
|
460
466
|
|
461
|
-
|
467
|
+
franky currently supports four different impedance control modes: **joint position control**, **joint velocity control**, **cartesian position control**, and **cartesian velocity control**.
|
462
468
|
Each of these control modes is invoked by passing the robot an appropriate _Motion_ object.
|
463
469
|
|
464
|
-
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.
|
465
471
|
The C++ interface is generally analogous, though some variable and method names are different because we
|
466
472
|
follow [PEP 8](https://peps.python.org/pep-0008/) naming conventions in Python
|
467
473
|
and [Google naming conventions](https://google.github.io/styleguide/cppguide.html) in C++.
|
@@ -476,28 +482,37 @@ from franky import *
|
|
476
482
|
# A point-to-point motion in the joint space
|
477
483
|
m_jp1 = JointMotion([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7])
|
478
484
|
|
479
|
-
# A motion in joint space with multiple waypoints
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
])
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
485
|
+
# A motion in joint space with multiple waypoints. The robot will stop at each of these
|
486
|
+
# waypoints. If you want the robot to move continuously, you have to specify a target velocity
|
487
|
+
# at every waypoint as shown in the example following this one.
|
488
|
+
m_jp2 = JointWaypointMotion(
|
489
|
+
[
|
490
|
+
JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
|
491
|
+
JointWaypoint([0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8]),
|
492
|
+
JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9]),
|
493
|
+
]
|
494
|
+
)
|
495
|
+
|
496
|
+
# Intermediate waypoints also permit specifying target velocities. The default target velocity
|
497
|
+
# is 0, meaning that the robot will stop at every waypoint.
|
498
|
+
m_jp3 = JointWaypointMotion(
|
499
|
+
[
|
500
|
+
JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
|
501
|
+
JointWaypoint(
|
502
|
+
JointState(
|
503
|
+
position=[0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8],
|
504
|
+
velocity=[0.1, 0.0, 0.0, 0.0, -0.0, 0.0, 0.0],
|
505
|
+
)
|
506
|
+
),
|
507
|
+
JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9]),
|
508
|
+
]
|
509
|
+
)
|
510
|
+
|
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
|
+
# position control mode while CartesianStopMotion stops it in cartesian pose control mode. The
|
514
|
+
# difference becomes relevant when asynchronous move commands are being sent or reactions are
|
515
|
+
# being used(see below).
|
501
516
|
m_jp4 = JointStopMotion()
|
502
517
|
```
|
503
518
|
|
@@ -506,19 +521,31 @@ m_jp4 = JointStopMotion()
|
|
506
521
|
```python
|
507
522
|
from franky import *
|
508
523
|
|
509
|
-
# Accelerate to the given joint velocity and hold it. After 1000ms stop the robot again.
|
510
|
-
m_jv1 = JointVelocityMotion(
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
#
|
515
|
-
#
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
524
|
+
# Accelerate to the given joint velocity and hold it. After 1000ms, stop the robot again.
|
525
|
+
m_jv1 = JointVelocityMotion(
|
526
|
+
[0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], duration=Duration(1000)
|
527
|
+
)
|
528
|
+
|
529
|
+
# Joint velocity motions also support waypoints. Unlike in joint position control, a joint
|
530
|
+
# velocity waypoint is a target velocity to be reached. This particular example first
|
531
|
+
# accelerates the joints, holds the velocity for 1s, then reverses direction for 2s, reverses
|
532
|
+
# direction again for 1s, and finally stops. It is important not to forget to stop the robot
|
533
|
+
# at the end of such a sequence, as it will otherwise throw an error.
|
534
|
+
m_jv2 = JointVelocityWaypointMotion(
|
535
|
+
[
|
536
|
+
JointVelocityWaypoint(
|
537
|
+
[0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)
|
538
|
+
),
|
539
|
+
JointVelocityWaypoint(
|
540
|
+
[-0.1, -0.3, 0.1, -0.0, -0.1, 0.2, -0.4],
|
541
|
+
hold_target_duration=Duration(2000),
|
542
|
+
),
|
543
|
+
JointVelocityWaypoint(
|
544
|
+
[0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)
|
545
|
+
),
|
546
|
+
JointVelocityWaypoint([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
|
547
|
+
]
|
548
|
+
)
|
522
549
|
|
523
550
|
# Stop the robot in joint velocity control mode.
|
524
551
|
m_jv3 = JointVelocityStopMotion()
|
@@ -536,31 +563,46 @@ quat = Rotation.from_euler("xyz", [0, 0, math.pi / 2]).as_quat()
|
|
536
563
|
m_cp1 = CartesianMotion(Affine([0.4, -0.2, 0.3], quat))
|
537
564
|
|
538
565
|
# With target elbow angle (otherwise, the Franka firmware will choose by itself)
|
539
|
-
m_cp2 = CartesianMotion(
|
566
|
+
m_cp2 = CartesianMotion(
|
567
|
+
RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))
|
568
|
+
)
|
540
569
|
|
541
|
-
# A linear motion in
|
542
|
-
# (Note that this motion is relative both in position and orientation. Hence, when the robot's
|
543
|
-
# differently, it will move in a different direction)
|
570
|
+
# A linear motion in Cartesian space relative to the initial position
|
571
|
+
# (Note that this motion is relative both in position and orientation. Hence, when the robot's
|
572
|
+
# end-effector is oriented differently, it will move in a different direction)
|
544
573
|
m_cp3 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
545
574
|
|
546
|
-
# Generalization of CartesianMotion that allows for multiple waypoints
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
#
|
575
|
+
# Generalization of CartesianMotion that allows for multiple waypoints. The robot will stop at
|
576
|
+
# each of these waypoints. If you want the robot to move continuously, you have to specify a
|
577
|
+
# target velocity at every waypoint as shown in the example following this one.
|
578
|
+
m_cp4 = CartesianWaypointMotion(
|
579
|
+
[
|
580
|
+
CartesianWaypoint(
|
581
|
+
RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))
|
582
|
+
),
|
583
|
+
# The following waypoint is relative to the prior one and 50% slower
|
584
|
+
CartesianWaypoint(
|
585
|
+
Affine([0.2, 0.0, 0.0]),
|
586
|
+
ReferenceType.Relative,
|
587
|
+
RelativeDynamicsFactor(0.5, 1.0, 1.0),
|
588
|
+
),
|
589
|
+
]
|
590
|
+
)
|
591
|
+
|
592
|
+
# Cartesian waypoints permit specifying target velocities
|
593
|
+
m_cp5 = CartesianWaypointMotion(
|
594
|
+
[
|
595
|
+
CartesianWaypoint(Affine([0.5, -0.2, 0.3], quat)),
|
596
|
+
CartesianWaypoint(
|
597
|
+
CartesianState(
|
598
|
+
pose=Affine([0.4, -0.1, 0.3], quat), velocity=Twist([-0.01, 0.01, 0.0])
|
599
|
+
)
|
600
|
+
),
|
601
|
+
CartesianWaypoint(Affine([0.3, 0.0, 0.3], quat)),
|
602
|
+
]
|
603
|
+
)
|
604
|
+
|
605
|
+
# Stop the robot in Cartesian position control mode.
|
564
606
|
m_cp6 = CartesianStopMotion()
|
565
607
|
```
|
566
608
|
|
@@ -569,42 +611,57 @@ m_cp6 = CartesianStopMotion()
|
|
569
611
|
```python
|
570
612
|
from franky import *
|
571
613
|
|
572
|
-
# A
|
614
|
+
# A Cartesian velocity motion with linear (first argument) and angular (second argument)
|
615
|
+
# components
|
573
616
|
m_cv1 = CartesianVelocityMotion(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]))
|
574
617
|
|
575
618
|
# With target elbow velocity
|
576
|
-
m_cv2 = CartesianVelocityMotion(
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
# velocity
|
581
|
-
#
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
619
|
+
m_cv2 = CartesianVelocityMotion(
|
620
|
+
RobotVelocity(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), elbow_velocity=-0.2)
|
621
|
+
)
|
622
|
+
|
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
|
+
# example first accelerates the end-effector, holds the velocity for 1s, then reverses
|
626
|
+
# direction for 2s, reverses direction again for 1s, and finally stops. It is important not to
|
627
|
+
# forget to stop the robot at the end of such a sequence, as it will otherwise throw an error.
|
628
|
+
m_cv4 = CartesianVelocityWaypointMotion(
|
629
|
+
[
|
630
|
+
CartesianVelocityWaypoint(
|
631
|
+
Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]),
|
632
|
+
hold_target_duration=Duration(1000),
|
633
|
+
),
|
634
|
+
CartesianVelocityWaypoint(
|
635
|
+
Twist([-0.2, 0.1, -0.1], [-0.1, 0.1, -0.2]),
|
636
|
+
hold_target_duration=Duration(2000),
|
637
|
+
),
|
638
|
+
CartesianVelocityWaypoint(
|
639
|
+
Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]),
|
640
|
+
hold_target_duration=Duration(1000),
|
641
|
+
),
|
642
|
+
CartesianVelocityWaypoint(Twist()),
|
643
|
+
]
|
644
|
+
)
|
645
|
+
|
646
|
+
# Stop the robot in Cartesian velocity control mode.
|
590
647
|
m_cv6 = CartesianVelocityStopMotion()
|
591
648
|
```
|
592
649
|
|
593
650
|
#### Relative Dynamics Factors
|
594
651
|
|
595
|
-
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
|
596
653
|
`relative_dynamics_factor` parameter.
|
597
|
-
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.
|
598
655
|
Crucially, relative dynamics factors on different layers (robot, move command, and motion) do not override each other
|
599
656
|
but rather get multiplied.
|
600
657
|
Hence, a relative dynamics factor on a motion can only reduce the dynamics of the robot and never increase them.
|
601
658
|
|
602
|
-
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
|
603
660
|
`RelativeDynamicsFactor.MAX_DYNAMICS`.
|
604
661
|
This will cause the motion to be executed with maximum velocity, acceleration, and jerk limits, independently of the
|
605
662
|
relative dynamics factors of the other layers.
|
606
|
-
This feature should only be used to abruptly stop the robot in case of an unexpected environment contact as executing
|
607
|
-
|
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.
|
608
665
|
|
609
666
|
#### Executing Motions
|
610
667
|
|
@@ -613,14 +670,15 @@ The real robot can be moved by applying a motion to the robot using `move`:
|
|
613
670
|
```python
|
614
671
|
# Before moving the robot, set an appropriate dynamics factor. We start small:
|
615
672
|
robot.relative_dynamics_factor = 0.05
|
616
|
-
# or alternatively, to control the scaling of velocity, acceleration, and jerk limits
|
673
|
+
# or alternatively, to control the scaling of velocity, acceleration, and jerk limits
|
674
|
+
# separately:
|
617
675
|
robot.relative_dynamics_factor = RelativeDynamicsFactor(0.05, 0.1, 0.15)
|
618
676
|
# If these values are set too high, you will see discontinuity errors
|
619
677
|
|
620
678
|
robot.move(m_jp1)
|
621
679
|
|
622
|
-
# We can also set a relative dynamics factor in the move command. It will be multiplied
|
623
|
-
# dynamics factors (robot and motion if present).
|
680
|
+
# We can also set a relative dynamics factor in the move command. It will be multiplied by
|
681
|
+
# the other relative dynamics factors (robot and motion if present).
|
624
682
|
robot.move(m_jp2, relative_dynamics_factor=0.8)
|
625
683
|
```
|
626
684
|
|
@@ -635,7 +693,8 @@ def cb(
|
|
635
693
|
time_step: Duration,
|
636
694
|
rel_time: Duration,
|
637
695
|
abs_time: Duration,
|
638
|
-
control_signal: JointPositions
|
696
|
+
control_signal: JointPositions,
|
697
|
+
):
|
639
698
|
print(f"At time {abs_time}, the target joint positions were {control_signal.q}")
|
640
699
|
|
641
700
|
|
@@ -645,7 +704,7 @@ robot.move(m_jp1)
|
|
645
704
|
|
646
705
|
Note that in Python, these callbacks are not executed in the control thread since they would otherwise block it.
|
647
706
|
Instead, they are put in a queue and executed by another thread.
|
648
|
-
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
|
649
708
|
when the callbacks take more time to execute than it takes for new callbacks to be queued.
|
650
709
|
Hence, callbacks might be executed significantly after they were queued if they take a long time to execute.
|
651
710
|
|
@@ -660,12 +719,13 @@ from franky import CartesianMotion, Affine, ReferenceType, Measure, Reaction
|
|
660
719
|
|
661
720
|
motion = CartesianMotion(Affine([0.0, 0.0, 0.1]), ReferenceType.Relative) # Move down 10cm
|
662
721
|
|
663
|
-
# It is important that the reaction motion uses the same control mode as the original motion.
|
664
|
-
# a JointMotion as a reaction motion to a CartesianMotion.
|
665
|
-
|
722
|
+
# It is important that the reaction motion uses the same control mode as the original motion.
|
723
|
+
# Hence, we cannot register a JointMotion as a reaction motion to a CartesianMotion.
|
724
|
+
# Move up by 1cm
|
725
|
+
reaction_motion = CartesianMotion(Affine([0.0, 0.0, -0.01]), ReferenceType.Relative)
|
666
726
|
|
667
727
|
# Trigger reaction if the Z force is greater than 30N
|
668
|
-
reaction = Reaction(Measure.FORCE_Z >
|
728
|
+
reaction = Reaction(Measure.FORCE_Z > 5.0, reaction_motion)
|
669
729
|
motion.add_reaction(reaction)
|
670
730
|
|
671
731
|
robot.move(motion)
|
@@ -722,10 +782,11 @@ with lower priority to ensure that the control thread does not get blocked.
|
|
722
782
|
Thus, the callbacks might fire substantially after the reaction has fired, depending on the time it takes to execute
|
723
783
|
them.
|
724
784
|
|
725
|
-
In C
|
785
|
+
In C++, you can additionally use lambdas to define more complex behaviours:
|
726
786
|
|
727
787
|
```c++
|
728
|
-
auto motion = CartesianMotion(
|
788
|
+
auto motion = CartesianMotion(
|
789
|
+
RobotPose(Affine({0.0, 0.0, 0.2}), 0.0), ReferenceType::Relative);
|
729
790
|
|
730
791
|
// Stop motion if force is over 10N
|
731
792
|
auto stop_motion = StopMotion<franka::CartesianPose>()
|
@@ -763,20 +824,20 @@ Instead, it returns immediately and, thus, allows the main thread to set new mot
|
|
763
824
|
import time
|
764
825
|
from franky import Affine, CartesianMotion, Robot, ReferenceType
|
765
826
|
|
766
|
-
robot = Robot("
|
827
|
+
robot = Robot("10.90.90.1")
|
767
828
|
robot.relative_dynamics_factor = 0.05
|
768
829
|
|
769
830
|
motion1 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
770
831
|
robot.move(motion1, asynchronous=True)
|
771
832
|
|
772
833
|
time.sleep(0.5)
|
773
|
-
# Note that similar to reactions, when preempting active motions with new motions, the
|
774
|
-
# Hence, we cannot use, e.g., a JointMotion here.
|
834
|
+
# Note that, similar to reactions, when preempting active motions with new motions, the
|
835
|
+
# control mode cannot change. Hence, we cannot use, e.g., a JointMotion here.
|
775
836
|
motion2 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
|
776
837
|
robot.move(motion2, asynchronous=True)
|
777
838
|
```
|
778
839
|
|
779
|
-
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
|
780
841
|
robot finishes its motion.
|
781
842
|
|
782
843
|
```python
|
@@ -785,21 +846,21 @@ robot.join_motion()
|
|
785
846
|
|
786
847
|
Note that when exceptions occur during the asynchronous execution of a motion, they will not be thrown immediately.
|
787
848
|
Instead, the control thread stores the exception and terminates.
|
788
|
-
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.
|
789
850
|
Hence, after an asynchronous motion has finished, make sure to call `Robot.join_motion` to ensure being notified of any
|
790
851
|
exceptions that occurred during the motion.
|
791
852
|
|
792
853
|
### <a id="gripper" /> 👌 Gripper
|
793
854
|
|
794
855
|
In the `franky::Gripper` class, the default gripper force and gripper speed can be set.
|
795
|
-
Then,
|
856
|
+
Then, in addition to the libfranka commands, the following helper methods can be used:
|
796
857
|
|
797
858
|
```c++
|
798
859
|
#include <franky.hpp>
|
799
860
|
#include <chrono>
|
800
861
|
#include <future>
|
801
862
|
|
802
|
-
auto gripper = franky::Gripper("
|
863
|
+
auto gripper = franky::Gripper("10.90.90.1");
|
803
864
|
|
804
865
|
double speed = 0.02; // [m/s]
|
805
866
|
double force = 20.0; // [N]
|
@@ -830,12 +891,12 @@ if (!success_future.wait_for(std::chrono::seconds(1)) == std::future_status::rea
|
|
830
891
|
}
|
831
892
|
```
|
832
893
|
|
833
|
-
The Python API follows the
|
894
|
+
The Python API follows the C++ API closely:
|
834
895
|
|
835
896
|
```python
|
836
897
|
import franky
|
837
898
|
|
838
|
-
gripper = franky.Gripper("
|
899
|
+
gripper = franky.Gripper("10.90.90.1")
|
839
900
|
|
840
901
|
speed = 0.02 # [m/s]
|
841
902
|
force = 20.0 # [N]
|
@@ -868,9 +929,9 @@ else:
|
|
868
929
|
|
869
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.
|
870
931
|
The Franka UI also provides methods for locking and unlocking the brakes, setting the execution mode, and executing the safety self-test.
|
871
|
-
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.
|
872
933
|
|
873
|
-
For that reason,
|
934
|
+
For that reason, franky provides a `RobotWebSession` class that allows you to access the web interface API of the robot.
|
874
935
|
Note that directly accessing the web interface API is not officially supported and documented by Franka.
|
875
936
|
Hence, use this feature at your own risk.
|
876
937
|
|
@@ -879,18 +940,19 @@ A typical automated workflow could look like this:
|
|
879
940
|
```python
|
880
941
|
import franky
|
881
942
|
|
882
|
-
with franky.RobotWebSession("
|
943
|
+
with franky.RobotWebSession("10.90.90.1", "username", "password") as robot_web_session:
|
883
944
|
# First take control
|
884
945
|
try:
|
885
|
-
# Try taking control. The session currently holding control has to release it in order
|
886
|
-
# control. In the web interface, a notification will show
|
887
|
-
#
|
946
|
+
# Try taking control. The session currently holding control has to release it in order
|
947
|
+
# for this session to gain control. In the web interface, a notification will show
|
948
|
+
# prompting the user to release control. If the other session is another
|
949
|
+
# franky.RobotWebSession, then the `release_control` method can be called on the other
|
888
950
|
# session to release control.
|
889
951
|
robot_web_session.take_control(wait_timeout=10.0)
|
890
952
|
except franky.TakeControlTimeoutError:
|
891
|
-
# If nothing happens for 10s, we try to take control forcefully. This is particularly
|
892
|
-
# holding control is dead. Taking control by force requires the
|
893
|
-
# the robot's wrist.
|
953
|
+
# If nothing happens for 10s, we try to take control forcefully. This is particularly
|
954
|
+
# useful if the session holding control is dead. Taking control by force requires the
|
955
|
+
# user to manually push the blue button close to the robot's wrist.
|
894
956
|
robot_web_session.take_control(wait_timeout=30.0, force=True)
|
895
957
|
|
896
958
|
# Unlock the brakes
|
@@ -916,7 +978,7 @@ In case you are running the robot for longer than 24h you will have noticed that
|
|
916
978
|
import time
|
917
979
|
import franky
|
918
980
|
|
919
|
-
with franky.RobotWebSession("
|
981
|
+
with franky.RobotWebSession("10.90.90.1", "username", "password") as robot_web_session:
|
920
982
|
# Execute self-test if the time until self-test is less than 5 minutes.
|
921
983
|
if robot_web_session.get_system_status()["safety"]["timeToTd2"] < 300:
|
922
984
|
robot_web_session.disable_fci()
|
@@ -940,9 +1002,9 @@ See [robot_web_session.py](franky/robot_web_session.py) for an example of how to
|
|
940
1002
|
|
941
1003
|
## 🛠️ Development
|
942
1004
|
|
943
|
-
|
1005
|
+
franky is currently tested against the following versions
|
944
1006
|
|
945
|
-
- 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
|
946
1008
|
- Eigen 3.4.0
|
947
1009
|
- Pybind11 2.13.6
|
948
1010
|
- POCO 1.12.5p2
|
@@ -953,20 +1015,20 @@ Franky is currently tested against following versions
|
|
953
1015
|
## 📜 License
|
954
1016
|
|
955
1017
|
For non-commercial applications, this software is licensed under the LGPL v3.0.
|
956
|
-
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
|
957
1019
|
agreements.
|
958
1020
|
|
959
1021
|
## 🔍 Differences to frankx
|
960
1022
|
|
961
|
-
|
1023
|
+
franky started originally as a fork of [frankx](https://github.com/pantor/frankx), though both codebase and
|
962
1024
|
functionality differ substantially from frankx by now.
|
963
|
-
Aside
|
1025
|
+
Aside from bug fixes and general performance improvements, franky provides the following new features/improvements:
|
964
1026
|
|
965
1027
|
* [Motions can be updated asynchronously.](#-real-time-motions)
|
966
1028
|
* [Reactions allow for the registration of callbacks instead of just printing to stdout when fired.](#-real-time-reactions)
|
967
1029
|
* [Motions allow for the registration of callbacks for profiling.](#motion-callbacks)
|
968
1030
|
* [The robot state is also available during control.](#robot-state)
|
969
|
-
* 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
|
970
1032
|
`setCartesianImpedance`).
|
971
1033
|
* Cartesian motion generation handles boundaries in Euler angles properly.
|
972
1034
|
* [There is a new joint motion type that supports waypoints.](#-motion-types)
|
@@ -977,7 +1039,7 @@ Aside of bug fixes and general performance improvements, Franky provides the fol
|
|
977
1039
|
* [The `Measure` class allows for arithmetic operations.](#-real-time-reactions)
|
978
1040
|
* Exceptions caused by libfranka are raised properly instead of being printed to stdout.
|
979
1041
|
* [We provide wheels for both Franka Research 3 and the older Franka Panda](#-setup)
|
980
|
-
*
|
1042
|
+
* franky supports [joint velocity control](#joint-velocity-control)
|
981
1043
|
and [cartesian velocity control](#cartesian-velocity-control)
|
982
1044
|
* The dynamics limits are not hard-coded anymore but can be [set for each robot instance](#-robot).
|
983
1045
|
|
@@ -988,4 +1050,4 @@ Please run the [pre-commit](https://pre-commit.com/) hooks before submitting you
|
|
988
1050
|
To install the pre-commit hooks, run:
|
989
1051
|
|
990
1052
|
1. [Install pre-commit](https://pre-commit.com/#install)
|
991
|
-
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 d3c7d43..4aec85b 100755
|
|
Binary file
|
index 17121d8..385d75e 100755
|
|
Binary file
|
Binary file
|
index d1e8322..059f79f 100755
|
|
Binary file
|
index e5136f0..119d11a 100755
|
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|