franky-control 1.1.0__cp39-cp39-manylinux_2_34_x86_64.whl → 1.1.2__cp39-cp39-manylinux_2_34_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.
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: franky-control
3
- Version: 1.1.0
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: robot,robotics,trajectory-generation,motion-control
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
- 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,
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, Franky expects high-level position or velocity targets and
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, 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 to update motion commands dynamically.
69
- Furthermore, most non-real-time functionality of [libfranka](https://frankaemika.github.io/docs/libfranka.html), such as
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
- Franky uses [Ruckig](https://github.com/pantor/ruckig) to generate smooth, time-optimal trajectories while respecting velocity, acceleration, and jerk limits.
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. Franky re-plans trajectories on the fly so that you can preempt motions anytime.
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. Franky lets you define reactions to unexpected events—like contact with the environment — so you can change course in real-time.
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 Franky does, too.
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 Franky via
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
- otherwise, follow the [setup instructions](#setup) first.
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("172.16.0.2") # Replace this with your robot's IP
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://frankaemika.github.io/docs/compatibility.html) which libfranka version you need and follow our [instructions](installing-frankly) to install the appropriate Franky wheels.
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 Franky, you have to follow three steps:
135
+ To install franky, you have to follow three steps:
135
136
 
136
- 1. Ensure that you are using a realtime kernel
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 Franky via pip or build it from source
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 realtime kernel.
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://frankaemika.github.io/docs/installation_linux.html#setting-up-the-real-time-kernel)
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 Franky) to this group:
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 realtime is not listed in your groups, try rebooting.
190
+ If real-time is not listed in your groups, try rebooting.
190
191
 
191
- ### Installing Franky
192
+ ### Installing franky
192
193
 
193
- To start using Franky with Python and libfranka *0.15.0*, just install it via
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.15.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
- Franky is based on [libfranka](https://github.com/frankaemika/libfranka), [Eigen](https://eigen.tuxfamily.org) for
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
- ```bash
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.15.0) add a build argument:
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 machines network *and* elevated user rights to allow the docker user to set RT
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
- #### Building Franky with Docker
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
- Franky comes with both a C++ and Python API that differ only regarding real-time capability.
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("172.16.0.2");
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("172.16.0.2")
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
- Franky exposes most of the libfanka API for Python.
369
- Moreover, we added methods to adapt the dynamics limits of the robot for all motions.
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("172.16.0.2")
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(velocity=0.1, acceleration=0.05, jerk=0.1)
386
+ robot.relative_dynamics_factor = RelativeDynamicsFactor(
387
+ velocity=0.1, acceleration=0.05, jerk=0.1
388
+ )
384
389
 
385
- # Or, for more finegrained access, set individual limits
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://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html) structure by
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://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#a193781d47722b32925e0ea7ac415f442)
414
- and [franka::RobotState::O_dP_EE_c](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#a4be112bd1a9a7d777a67aea4a18a8dcc).
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://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#ade3335d1ac2f6c44741a916d565f7091)
418
- and [franka::RobotState::dq](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#a706045af1b176049e9e56df755325bd2).
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("172.16.0.2")
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 jacobian of the current robot state
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 for libfranka >= 0.15.0)
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
- Franky currently supports four different impedance control modes: **joint position control**, **joint velocity control**, **cartesian position control**, and **cartesian velocity control**.
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 Franky in Python.
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
- m_jp2 = JointWaypointMotion([
481
- JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
482
- JointWaypoint([0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8]),
483
- JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9])
484
- ])
485
-
486
- # Intermediate waypoints also permit to specify target velocities. The default target velocity is 0, meaning that the
487
- # robot will stop at every waypoint.
488
- m_jp3 = JointWaypointMotion([
489
- JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
490
- JointWaypoint(
491
- JointState(
492
- position=[0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8],
493
- velocity=[0.1, 0.0, 0.0, 0.0, -0.0, 0.0, 0.0])),
494
- JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9])
495
- ])
496
-
497
- # Stop the robot in joint position control mode. The difference of JointStopMotion to other stop motions such as
498
- # CartesianStopMotion is that # JointStopMotion # stops the robot in joint position control mode while
499
- # CartesianStopMotion stops it in cartesian pose control mode. The difference becomes relevant when asynchronous move
500
- # commands are being sent or reactions are being used(see below).
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([0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], duration=Duration(1000))
511
-
512
- # Joint velocity motions also support waypoints. Unlike in joint position control, a joint velocity waypoint is a
513
- # target velocity to be reached. This particular example first accelerates the joints, holds the velocity for 1s, then
514
- # reverses direction for 2s, reverses direction again for 1s, and finally stops. It is important not to forget to stop
515
- # the robot at the end of such a sequence, as it will otherwise throw an error.
516
- m_jv2 = JointVelocityWaypointMotion([
517
- JointVelocityWaypoint([0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)),
518
- JointVelocityWaypoint([-0.1, -0.3, 0.1, -0.0, -0.1, 0.2, -0.4], hold_target_duration=Duration(2000)),
519
- JointVelocityWaypoint([0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)),
520
- JointVelocityWaypoint([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
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(RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3)))
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 cartesian space relative to the initial position
542
- # (Note that this motion is relative both in position and orientation. Hence, when the robot's end-effector is oriented
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
- m_cp4 = CartesianWaypointMotion([
548
- CartesianWaypoint(RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))),
549
- # The following waypoint is relative to the prior one and 50% slower
550
- CartesianWaypoint(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative, RelativeDynamicsFactor(0.5, 1.0, 1.0))
551
- ])
552
-
553
- # Cartesian waypoints also permit to specify target velocities
554
- m_cp5 = CartesianWaypointMotion([
555
- CartesianWaypoint(Affine([0.5, -0.2, 0.3], quat)),
556
- CartesianWaypoint(
557
- CartesianState(
558
- pose=Affine([0.4, -0.1, 0.3], quat),
559
- velocity=Twist([-0.01, 0.01, 0.0]))),
560
- CartesianWaypoint(Affine([0.3, 0.0, 0.3], quat))
561
- ])
562
-
563
- # Stop the robot in cartesian position control mode.
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 cartesian velocity motion with linear (first argument) and angular (second argument) components
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(RobotVelocity(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), elbow_velocity=-0.2))
577
-
578
- # Cartesian velocity motions also support multiple waypoints. Unlike in cartesian position control, a cartesian velocity
579
- # waypoint is a target velocity to be reached. This particular example first accelerates the end-effector, holds the
580
- # velocity for 1s, then # reverses direction for 2s, reverses direction again for 1s, and finally stops. It is important
581
- # not to forget to stop # the robot at the end of such a sequence, as it will otherwise throw an error.
582
- m_cv4 = CartesianVelocityWaypointMotion([
583
- CartesianVelocityWaypoint(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), hold_target_duration=Duration(1000)),
584
- CartesianVelocityWaypoint(Twist([-0.2, 0.1, -0.1], [-0.1, 0.1, -0.2]), hold_target_duration=Duration(2000)),
585
- CartesianVelocityWaypoint(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), hold_target_duration=Duration(1000)),
586
- CartesianVelocityWaypoint(Twist()),
587
- ])
588
-
589
- # Stop the robot in cartesian velocity control mode.
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 to adapt the dynamics (velocity, acceleration and jerk) by setting the respective
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
- other motions with it is likely to lead to a discontinuity error and might be dangerous.
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 separately:
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 with the other relative
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 that the queue grows indefinitely
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. Hence, we cannot register
664
- # a JointMotion as a reaction motion to a CartesianMotion.
665
- reaction_motion = CartesianMotion(Affine([0.0, 0.0, 0.01]), ReferenceType.Relative) # Move up for 1cm
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 > 30.0, reaction_motion)
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++ you can additionally use lambdas to define more complex behaviours:
785
+ In C++, you can additionally use lambdas to define more complex behaviours:
726
786
 
727
787
  ```c++
728
- auto motion = CartesianMotion(RobotPose(Affine({0.0, 0.0, 0.2}), 0.0), ReferenceType::Relative);
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("172.16.0.2")
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 control mode cannot change.
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` the main thread can be synchronized with the motion thread, as it will block until the
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` are called, they will throw the stored exception in the main thread.
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, additionally to the libfranka commands, the following helper methods can be used:
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("172.16.0.2");
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 c++ API closely:
894
+ The Python API follows the C++ API closely:
834
895
 
835
896
  ```python
836
897
  import franky
837
898
 
838
- gripper = franky.Gripper("172.16.0.2")
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. for automatically unlocking the brakes before starting a motion, or automatically executing the self-test after 24h of continuous execution.
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, Franky provides a `RobotWebSession` class that allows you to access the web interface API of the robot.
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("172.16.0.2", "username", "password") as robot_web_session:
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 for this session to gain
886
- # control. In the web interface, a notification will show prompting the user to release control. If the other
887
- # session is another franky.RobotWebSession, then the `release_control` method can be called on the other
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 useful if the session
892
- # holding control is dead. Taking control by force requires the user to manually push the blue button close to
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("172.16.0.2", "username", "password") as robot_web_session:
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
- Franky is currently tested against following versions
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 Franky within commercial applications or under a different license, please contact us for individual
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
- Franky started originally as a fork of [frankx](https://github.com/pantor/frankx), though both codebase and
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 of bug fixes and general performance improvements, Franky provides the following new features/improvements:
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.,`setCollisionBehavior`, `setJoinImpedance`, and
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
- * Franky supports [joint velocity control](#joint-velocity-control)
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,26 +1,26 @@
1
1
  franky/__init__.py,sha256=57BsmUytdeqMrhHglwvxMS6CgpAEVPw0KJge8_UTzEA,378
2
- franky/_franky.cpython-39-x86_64-linux-gnu.so,sha256=S95zWoIMIe6d37OBQM_SpZ5Nn4JQir4eRY96PLgqOhc,3049177
2
+ franky/_franky.cpython-39-x86_64-linux-gnu.so,sha256=iNNFRAn0iR0H85Tcn5LjtGl5Rh72iow_janolVMdBzU,3049177
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-13a5b20e.so.95,sha256=rxMloAr9p8n7VjzdcsgOc1Gt0_jLczPil9R33w9wsoQ,3269633
9
- franky_control.libs/libPocoNet-8bb0f68b.so.95,sha256=J3GvO79BxFia9l2UeHvseDIPhJ1660hAz5kY4L2SYJU,2482737
8
+ franky_control.libs/libPocoFoundation-31c294b8.so.95,sha256=uarUw48_K8yeso4inD43EM1Cq5kK7vCvGCUykxeRYSs,3269633
9
+ franky_control.libs/libPocoNet-e2d7659c.so.95,sha256=8mKU0BZ3SrFThPf39MZzbFXbxzEmLdRGISvZRYfhEfo,2482737
10
10
  franky_control.libs/libboost_filesystem-0bf67256.so.1.75.0,sha256=MV-QRMY_pZ0zReU4H4AbcpyZ_sc6yZ6QR6QdDxF84Qc,139961
11
11
  franky_control.libs/libboost_serialization-67da18f6.so.1.75.0,sha256=Wjn9rKqoXLrVK29NShhm_evaRsbhTFvvGydi8gwr5hs,319177
12
12
  franky_control.libs/libconsole_bridge-acce180d.so.1.0,sha256=-iSKX9xNyLCSSrducf7rDx6hXzdU5v7xQqZDulppIP8,22769
13
13
  franky_control.libs/libfmt-677b7a5c.so.8.1.1,sha256=rN3uzEn_limS_u6DV-BxdTEbs2GrhlicD_OjyAlKYpA,140649
14
- franky_control.libs/libfranka-e5e9247f.so.0.15.0,sha256=gosudHQR1C6GTEsZmAW_YFtr7hBawo6Sgg6aePXKUDw,973497
15
- franky_control.libs/libpinocchio_default-5f84cd5d.so.3.1.0,sha256=GcnCciSRaTTx7nUBv40Ba6HpxLtCHYnEw91hdjm_dps,9668545
16
- franky_control.libs/libpinocchio_parsers-a0b97441.so.3.1.0,sha256=Y5XBw0UOgT1xkvBk-v-QHYGwsk9UQDkPd377uN-W5AE,707441
14
+ franky_control.libs/libfranka-0438a9f0.so.0.15.3,sha256=Or6EhRwQ6GqAeshAs4vnvF-CRZ-_ARU55I1dLxZDBbI,1482217
15
+ franky_control.libs/libpinocchio_default-c77daf45.so.3.1.0,sha256=V9MxYrxk8YzERDep35iGcn2T1-0DLD9kM6upQyguDZs,9668545
16
+ franky_control.libs/libpinocchio_parsers-cbd23136.so.3.1.0,sha256=XYZ311Ie0YR5r1GCupQrk0zJNyWkdWXT0kFYDiY-E_M,707441
17
17
  franky_control.libs/libtinyxml-69e5f0dd.so.0.2.6.2,sha256=V45jOzaljaUrtOAYBS20QBFHn0qPFHTEcWxdcOBoJNA,118121
18
18
  franky_control.libs/liburdfdom_model-9ec0392f.so.1.0,sha256=Kwlq8DuENLdEX5URKcwUC06sl9rxUYoRjGx3EI-uRiY,146081
19
19
  franky_control.libs/liburdfdom_model_state-01125232.so.1.0,sha256=LNMEG27nv_6BYvelpjXjr0YsBl-6IsGQfg3uG0DvTQQ,20857
20
20
  franky_control.libs/liburdfdom_sensor-011819fa.so.1.0,sha256=LzFH_sfeyWcV042TmgSEXTQL1c0teyYg3veA8sTn_EM,20857
21
21
  franky_control.libs/liburdfdom_world-4d53bc81.so.1.0,sha256=IziPhPYdFfZTgKDOnUMGLYSCsZRxYfC1rEKWjvzrpb4,146081
22
- franky_control-1.1.0.dist-info/METADATA,sha256=O0HKEVVI_VNuEOVFEocwKNl_9oUXK3EssjRIdvLxnHM,40320
23
- franky_control-1.1.0.dist-info/WHEEL,sha256=w83R8wm6SA7wYqzAFwOKMQdmvjdW-cKAMsBH_QZ50tc,111
24
- franky_control-1.1.0.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
25
- franky_control-1.1.0.dist-info/RECORD,,
26
- franky_control-1.1.0.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
22
+ franky_control-1.1.2.dist-info/METADATA,sha256=0omOMnCsvfoJiVYM-tuxiS_L_Gmqzq09UT46DVB6xn8,41345
23
+ franky_control-1.1.2.dist-info/WHEEL,sha256=w83R8wm6SA7wYqzAFwOKMQdmvjdW-cKAMsBH_QZ50tc,111
24
+ franky_control-1.1.2.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
25
+ franky_control-1.1.2.dist-info/RECORD,,
26
+ franky_control-1.1.2.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
index eaf603c..d01be13 100755
Binary file