franky-control 1.1.0__cp38-cp38-manylinux_2_34_x86_64.whl → 1.1.2__cp38-cp38-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.1
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
@@ -44,17 +44,17 @@ Requires-Dist: numpy
44
44
  </a>
45
45
  </p>
46
46
 
47
- Franky is a high-level control library for Franka robots offering Python and C++ support.
48
- By providing a high-level control interface, Franky eliminates the need for strict real-time programming at 1 kHz,
47
+ franky is a high-level control library for Franka robots, offering Python and C++ support.
48
+ By providing a high-level control interface, franky eliminates the need for strict real-time programming at 1 kHz,
49
49
  making control from non-real-time environments, such as Python programs, feasible.
50
- Instead of relying on low-level control commands, Franky expects high-level position or velocity targets and
50
+ Instead of relying on low-level control commands, franky expects high-level position or velocity targets and
51
51
  uses [Ruckig](https://github.com/pantor/ruckig) to plan time-optimal trajectories in real-time.
52
52
 
53
- Although Python does not provide real-time guarantees, Franky strives to maintain as much real-time control as possible.
54
- Motions can be preempted at any moment, prompting Franky to re-plan trajectories on the fly.
55
- To handle unforeseen situations—such as unexpected contact with the environment — Franky includes a reaction system that
56
- allows to update motion commands dynamically.
57
- Furthermore, most non-real-time functionality of [libfranka](https://frankaemika.github.io/docs/libfranka.html), such as
53
+ Although Python does not provide real-time guarantees, franky strives to maintain as much real-time control as possible.
54
+ Motions can be preempted at any moment, prompting franky to re-plan trajectories on the fly.
55
+ To handle unforeseen situations—such as unexpected contact with the environment — franky includes a reaction system that
56
+ allows for updating motion commands dynamically.
57
+ Furthermore, most non-real-time functionality of [libfranka](https://frankarobotics.github.io/docs/libfranka.html), such as
58
58
  Gripper control is made directly available in Python.
59
59
 
60
60
  Check out the [tutorial](#-tutorial) and the [examples](https://github.com/TimSchneider42/franky/tree/master/examples)
@@ -68,13 +68,13 @@ at [https://timschneider42.github.io/franky/](https://timschneider42.github.io/f
68
68
  No more endless hours setting up ROS, juggling packages, or untangling dependencies. Just `pip install` — no ROS at all.
69
69
 
70
70
  - **[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)
71
- Franky uses [Ruckig](https://github.com/pantor/ruckig) to generate smooth, time-optimal trajectories while respecting velocity, acceleration, and jerk limits.
71
+ franky uses [Ruckig](https://github.com/pantor/ruckig) to generate smooth, time-optimal trajectories while respecting velocity, acceleration, and jerk limits.
72
72
 
73
73
  - **[Real-time control from Python and C++](#real-time-motions)**
74
- 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.
74
+ 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.
75
75
 
76
76
  - **[Reactive behavior](#-real-time-reactions)**
77
- 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.
77
+ 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.
78
78
 
79
79
  - **[Motion and reaction callbacks](#motion-callbacks)**
80
80
  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.
@@ -83,24 +83,25 @@ at [https://timschneider42.github.io/franky/](https://timschneider42.github.io/f
83
83
  Adjust max velocity, acceleration, and jerk to match your setup or task. Fine control for smooth, safe operation.
84
84
 
85
85
  - **Full Python access to the libfranka API**
86
- 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.
86
+ 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.
87
87
 
88
88
  ## 📖 Python Quickstart Guide
89
89
 
90
- Real-time kernel already installed and real-time permissions granted? Just install Franky via
90
+ Real-time kernel already installed and real-time permissions granted? Just install franky via
91
91
 
92
92
  ```bash
93
93
  pip install franky-control
94
94
  ```
95
95
 
96
- otherwise, follow the [setup instructions](#setup) first.
96
+ Otherwise, follow the [setup instructions](#setup) first.
97
97
 
98
98
  Now we are already ready to go!
99
99
  Unlock the brakes in the web interface, activate FCI, and start coding:
100
+
100
101
  ```python
101
102
  from franky import *
102
103
 
103
- robot = Robot("172.16.0.2") # Replace this with your robot's IP
104
+ robot = Robot("10.90.90.1") # Replace this with your robot's IP
104
105
 
105
106
  # Let's start slow (this lets the robot use a maximum of 5% of its velocity, acceleration, and jerk limits)
106
107
  robot.relative_dynamics_factor = 0.05
@@ -114,20 +115,20 @@ If you are seeing server version mismatch errors, such as
114
115
  ```
115
116
  franky.IncompatibleVersionException: libfranka: Incompatible library version (server version: 5, library version: 9)
116
117
  ```
117
- then your Franka robot is either not on the most recent firmware version or you are using the older Franka Panda model.
118
- 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.
118
+ then your Franka robot is either not on the most recent firmware version, or you are using the older Franka Panda model.
119
+ 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.
119
120
 
120
121
  ## <a id="setup" /> ⚙️ Setup
121
122
 
122
- To install Franky, you have to follow three steps:
123
+ To install franky, you have to follow three steps:
123
124
 
124
- 1. Ensure that you are using a realtime kernel
125
+ 1. Ensure that you are using a real-time kernel
125
126
  2. Ensure that the executing user has permission to run real-time applications
126
- 3. Install Franky via pip or build it from source
127
+ 3. Install franky via pip or build it from source
127
128
 
128
129
  ### Installing a real-time kernel
129
130
 
130
- In order for Franky to function properly, it requires the underlying OS to use a realtime kernel.
131
+ In order for Franky to function properly, it requires the underlying OS to use a real-time kernel.
131
132
  Otherwise, you might see `communication_constrains_violation` errors.
132
133
 
133
134
  To check whether your system is currently using a real-time kernel, type `uname -a`.
@@ -142,12 +143,12 @@ If it does not say PREEMPT_RT, you are not currently running a real-time kernel.
142
143
 
143
144
  There are multiple ways of installing a real-time kernel.
144
145
  You
145
- can [build it from source](https://frankaemika.github.io/docs/installation_linux.html#setting-up-the-real-time-kernel)
146
+ can [build it from source](https://frankarobotics.github.io/docs/installation_linux.html#setting-up-the-real-time-kernel)
146
147
  or, if you are using Ubuntu, it can be [enabled through Ubuntu Pro](https://ubuntu.com/real-time).
147
148
 
148
149
  ### Allowing the executing user to run real-time applications
149
150
 
150
- First, create a group `realtime` and add your user (or whoever is running Franky) to this group:
151
+ First, create a group `realtime` and add your user (or whoever is running franky) to this group:
151
152
 
152
153
  ```bash
153
154
  sudo addgroup realtime
@@ -174,18 +175,18 @@ $ groups
174
175
  ... realtime
175
176
  ```
176
177
 
177
- If realtime is not listed in your groups, try rebooting.
178
+ If real-time is not listed in your groups, try rebooting.
178
179
 
179
- ### Installing Franky
180
+ ### Installing franky
180
181
 
181
- To start using Franky with Python and libfranka *0.15.0*, just install it via
182
+ To start using franky with Python and libfranka *0.16.0*, just install it via
182
183
 
183
184
  ```bash
184
185
  pip install franky-control
185
186
  ```
186
187
 
187
188
  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*,
188
- *0.14.2*, and *0.15.0*.
189
+ *0.14.2*, *0.15.3*, and *0.16.0*.
189
190
  They can be installed via
190
191
 
191
192
  ```bash
@@ -196,39 +197,9 @@ pip install numpy
196
197
  pip install --no-index --find-links=./dist franky-control
197
198
  ```
198
199
 
199
- Franky is based on [libfranka](https://github.com/frankaemika/libfranka), [Eigen](https://eigen.tuxfamily.org) for
200
- transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
201
- As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
202
- Franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
203
-
204
- After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
205
- Franky via
206
-
207
- ```bash
208
- git clone --recurse-submodules git@github.com:timschneider42/franky.git
209
- cd franky
210
- mkdir -p build
211
- cd build
212
- cmake -DCMAKE_BUILD_TYPE=Release ..
213
- make
214
- make install
215
- ```
216
-
217
- To use Franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
218
- `target_link_libraries(<target> franky)`.
219
-
220
- If you need only the Python module, you can install Franky via
200
+ ### Using Docker
221
201
 
222
- ```bash
223
- pip install .
224
- ```
225
-
226
- Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in the Python path, e.g. by adjusting
227
- `PYTHONPATH` accordingly.
228
-
229
- #### Using Docker
230
-
231
- To use Franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
202
+ To use franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
232
203
  accompanying [docker-compose](docker-compose.yml) file.
233
204
 
234
205
  ```bash
@@ -237,7 +208,7 @@ cd franky/
237
208
  docker compose build franky-run
238
209
  ```
239
210
 
240
- To use another version of libfranka than the default (0.15.0) add a build argument:
211
+ To use another version of libfranka than the default (0.16.0), add a build argument:
241
212
 
242
213
  ```bash
243
214
  docker compose build franky-run --build-arg LIBFRANKA_VERSION=0.9.2
@@ -249,25 +220,15 @@ To run the container:
249
220
  docker compose run franky-run bash
250
221
  ```
251
222
 
252
- The container requires access to the host machines network *and* elevated user rights to allow the docker user to set RT
223
+ The container requires access to the host machine's network *and* elevated user rights to allow the Docker user to set RT
253
224
  capabilities of the processes run from within it.
254
225
 
255
- #### Building Franky with Docker
256
-
257
- For building Franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
258
-
259
- ```bash
260
- docker compose build franky-build
261
- docker compose run --rm franky-build run-tests # To run the tests
262
- docker compose run --rm franky-build build-wheels # To build wheels for all supported python versions
263
- ```
264
-
265
- ### Can I use CUDA jointly with Franky?
226
+ ### Can I use CUDA jointly with franky?
266
227
 
267
228
  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.
268
229
 
269
230
  First, make sure that you have rebooted your system after installing the real-time kernel.
270
- 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.
231
+ 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.
271
232
 
272
233
  If you are on Ubuntu, you can also use [this](tools/install_cuda_realtime.bash) script to install CUDA on your real-time system:
273
234
  ```bash
@@ -288,9 +249,51 @@ Alternatively, if you are a cowboy and do not care about security, you can also
288
249
  bash <(wget -qO- https://raw.githubusercontent.com/timschneider42/franky/master/tools/install_cuda_realtime.bash)
289
250
  ```
290
251
 
252
+ ### Building franky
253
+
254
+ franky is based on [libfranka](https://github.com/frankarobotics/libfranka), [Eigen](https://eigen.tuxfamily.org) for
255
+ transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
256
+ As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
257
+ franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
258
+
259
+ After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
260
+ franky via
261
+
262
+ ```bash
263
+ git clone --recurse-submodules git@github.com:timschneider42/franky.git
264
+ cd franky
265
+ mkdir -p build
266
+ cd build
267
+ cmake -DCMAKE_BUILD_TYPE=Release ..
268
+ make
269
+ make install
270
+ ```
271
+
272
+ To use franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
273
+ `target_link_libraries(<target> franky)`.
274
+
275
+ If you need only the Python module, you can install franky via
276
+
277
+ ```bash
278
+ pip install .
279
+ ```
280
+
281
+ Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in the Python path, e.g. by adjusting
282
+ `PYTHONPATH` accordingly.
283
+
284
+ #### Building franky with Docker
285
+
286
+ For building franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
287
+
288
+ ```bash
289
+ docker compose build franky-build
290
+ docker compose run --rm franky-build run-tests # To run the tests
291
+ docker compose run --rm franky-build build-wheels # To build wheels for all supported python versions
292
+ ```
293
+
291
294
  ## 📚 Tutorial
292
295
 
293
- Franky comes with both a C++ and Python API that differ only regarding real-time capability.
296
+ franky comes with both a C++ and Python API that differ only regarding real-time capability.
294
297
  We will introduce both languages next to each other.
295
298
  In your C++ project, just include `include <franky.hpp>` and link the library.
296
299
  For Python, just `import franky`.
@@ -301,7 +304,7 @@ As a first example, only four lines of code are needed for simple robotic motion
301
304
  using namespace franky;
302
305
 
303
306
  // Connect to the robot with the FCI IP address
304
- Robot robot("172.16.0.2");
307
+ Robot robot("10.90.90.1");
305
308
 
306
309
  // Reduce velocity and acceleration of the robot
307
310
  robot.setRelativeDynamicsFactor(0.05);
@@ -318,7 +321,7 @@ The corresponding program in Python is
318
321
  ```python
319
322
  from franky import Affine, CartesianMotion, Robot, ReferenceType
320
323
 
321
- robot = Robot("172.16.0.2")
324
+ robot = Robot("10.90.90.1")
322
325
  robot.relative_dynamics_factor = 0.05
323
326
 
324
327
  motion = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
@@ -328,7 +331,7 @@ robot.move(motion)
328
331
  Before executing any code, make sure that you have enabled the Franka Control Interface (FCI) in the Franka UI web interface.
329
332
 
330
333
  Furthermore, we will introduce methods for geometric calculations, for moving the robot according to different motion
331
- types, how to implement real-time reactions and changing waypoints in real time as well as controlling the gripper.
334
+ types, how to implement real-time reactions and changing waypoints in real time, as well as controlling the gripper.
332
335
 
333
336
  ### 🧮 Geometry
334
337
 
@@ -353,24 +356,26 @@ In all cases, distances are in [m] and rotations in [rad].
353
356
 
354
357
  ### 🤖 Robot
355
358
 
356
- Franky exposes most of the libfanka API for Python.
357
- Moreover, we added methods to adapt the dynamics limits of the robot for all motions.
359
+ franky exposes most of the libfanka API for Python.
360
+ Moreover, we added methods to adapt the dynamic limits of the robot for all motions.
358
361
 
359
362
  ```python
360
363
  from franky import *
361
364
 
362
- robot = Robot("172.16.0.2")
365
+ robot = Robot("10.90.90.1")
363
366
 
364
367
  # Recover from errors
365
368
  robot.recover_from_errors()
366
369
 
367
- # Set velocity, acceleration and jerk to 5% of the maximum
370
+ # Set velocity, acceleration, and jerk to 5% of the maximum
368
371
  robot.relative_dynamics_factor = 0.05
369
372
 
370
373
  # Alternatively, you can define each constraint individually
371
- robot.relative_dynamics_factor = RelativeDynamicsFactor(velocity=0.1, acceleration=0.05, jerk=0.1)
374
+ robot.relative_dynamics_factor = RelativeDynamicsFactor(
375
+ velocity=0.1, acceleration=0.05, jerk=0.1
376
+ )
372
377
 
373
- # Or, for more finegrained access, set individual limits
378
+ # Or, for more fine-grained access, set individual limits
374
379
  robot.translation_velocity_limit.set(3.0)
375
380
  robot.rotation_velocity_limit.set(2.5)
376
381
  robot.elbow_velocity_limit.set(2.62)
@@ -394,21 +399,21 @@ print(robot.joint_jerk_limit.max)
394
399
  The robot state can be retrieved by accessing the following properties:
395
400
 
396
401
  * `state`: Object of type `franky.RobotState`, which extends the
397
- libfranka [franka::RobotState](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html) structure by
402
+ libfranka [franka::RobotState](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html) structure by
398
403
  additional state elements.
399
404
  * `current_cartesian_state`: Object of type `franky.CartesianState`, which contains the end-effector pose and velocity
400
405
  obtained
401
- from [franka::RobotState::O_T_EE](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#a193781d47722b32925e0ea7ac415f442)
402
- and [franka::RobotState::O_dP_EE_c](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#a4be112bd1a9a7d777a67aea4a18a8dcc).
406
+ from [franka::RobotState::O_T_EE](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#a193781d47722b32925e0ea7ac415f442)
407
+ and [franka::RobotState::O_dP_EE_c](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#a4be112bd1a9a7d777a67aea4a18a8dcc).
403
408
  * `current_joint_state`: Object of type `franky.JointState`, which contains the joint positions and velocities
404
409
  obtained
405
- from [franka::RobotState::q](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#ade3335d1ac2f6c44741a916d565f7091)
406
- and [franka::RobotState::dq](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html#a706045af1b176049e9e56df755325bd2).
410
+ from [franka::RobotState::q](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#ade3335d1ac2f6c44741a916d565f7091)
411
+ and [franka::RobotState::dq](https://frankarobotics.github.io/libfranka/0.15.3/structfranka_1_1RobotState.html#a706045af1b176049e9e56df755325bd2).
407
412
 
408
413
  ```python
409
414
  from franky import *
410
415
 
411
- robot = Robot("172.16.0.2")
416
+ robot = Robot("10.90.90.1")
412
417
 
413
418
  # Get the current state as `franky.RobotState`. See the documentation for a list of fields.
414
419
  state = robot.state
@@ -433,10 +438,11 @@ f_t_ee = Affine()
433
438
  ee_t_k = Affine()
434
439
  ee_pose_kin = robot.model.pose(Frame.EndEffector, q, f_t_ee, ee_t_k)
435
440
 
436
- # Get the jacobian of the current robot state
441
+ # Get the Jacobian of the current robot state
437
442
  jacobian = robot.model.body_jacobian(Frame.EndEffector, state)
438
443
 
439
- # Alternatively, just get the URDF as string and do the kinematics computation yourself (only for libfranka >= 0.15.0)
444
+ # Alternatively, just get the URDF as a string and do the kinematics computation yourself (only
445
+ # for libfranka >= 0.15.0)
440
446
  urdf_model = robot.model_urdf
441
447
  ```
442
448
 
@@ -446,10 +452,10 @@ and [Model](https://timschneider42.github.io/franky/classfranky_1_1_model.html)
446
452
 
447
453
  ### <a id="motion-types" /> 🏃‍♂️ Motion Types
448
454
 
449
- Franky currently supports four different impedance control modes: **joint position control**, **joint velocity control**, **cartesian position control**, and **cartesian velocity control**.
455
+ franky currently supports four different impedance control modes: **joint position control**, **joint velocity control**, **cartesian position control**, and **cartesian velocity control**.
450
456
  Each of these control modes is invoked by passing the robot an appropriate _Motion_ object.
451
457
 
452
- In the following, we provide a brief example for each motion type implemented by Franky in Python.
458
+ In the following, we provide a brief example for each motion type implemented by franky in Python.
453
459
  The C++ interface is generally analogous, though some variable and method names are different because we
454
460
  follow [PEP 8](https://peps.python.org/pep-0008/) naming conventions in Python
455
461
  and [Google naming conventions](https://google.github.io/styleguide/cppguide.html) in C++.
@@ -464,28 +470,37 @@ from franky import *
464
470
  # A point-to-point motion in the joint space
465
471
  m_jp1 = JointMotion([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7])
466
472
 
467
- # A motion in joint space with multiple waypoints
468
- m_jp2 = JointWaypointMotion([
469
- JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
470
- JointWaypoint([0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8]),
471
- JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9])
472
- ])
473
-
474
- # Intermediate waypoints also permit to specify target velocities. The default target velocity is 0, meaning that the
475
- # robot will stop at every waypoint.
476
- m_jp3 = JointWaypointMotion([
477
- JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
478
- JointWaypoint(
479
- JointState(
480
- position=[0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8],
481
- velocity=[0.1, 0.0, 0.0, 0.0, -0.0, 0.0, 0.0])),
482
- JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9])
483
- ])
484
-
485
- # Stop the robot in joint position control mode. The difference of JointStopMotion to other stop motions such as
486
- # CartesianStopMotion is that # JointStopMotion # stops the robot in joint position control mode while
487
- # CartesianStopMotion stops it in cartesian pose control mode. The difference becomes relevant when asynchronous move
488
- # commands are being sent or reactions are being used(see below).
473
+ # A motion in joint space with multiple waypoints. The robot will stop at each of these
474
+ # waypoints. If you want the robot to move continuously, you have to specify a target velocity
475
+ # at every waypoint as shown in the example following this one.
476
+ m_jp2 = JointWaypointMotion(
477
+ [
478
+ JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
479
+ JointWaypoint([0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8]),
480
+ JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9]),
481
+ ]
482
+ )
483
+
484
+ # Intermediate waypoints also permit specifying target velocities. The default target velocity
485
+ # is 0, meaning that the robot will stop at every waypoint.
486
+ m_jp3 = JointWaypointMotion(
487
+ [
488
+ JointWaypoint([-0.3, 0.1, 0.3, -1.4, 0.1, 1.8, 0.7]),
489
+ JointWaypoint(
490
+ JointState(
491
+ position=[0.0, 0.3, 0.3, -1.5, -0.2, 1.5, 0.8],
492
+ velocity=[0.1, 0.0, 0.0, 0.0, -0.0, 0.0, 0.0],
493
+ )
494
+ ),
495
+ JointWaypoint([0.1, 0.4, 0.3, -1.4, -0.3, 1.7, 0.9]),
496
+ ]
497
+ )
498
+
499
+ # Stop the robot in joint position control mode. The difference between JointStopMotion to other
500
+ # stop-motions, such as CartesianStopMotion, is that JointStopMotion stops the robot in joint
501
+ # position control mode while CartesianStopMotion stops it in cartesian pose control mode. The
502
+ # difference becomes relevant when asynchronous move commands are being sent or reactions are
503
+ # being used(see below).
489
504
  m_jp4 = JointStopMotion()
490
505
  ```
491
506
 
@@ -494,19 +509,31 @@ m_jp4 = JointStopMotion()
494
509
  ```python
495
510
  from franky import *
496
511
 
497
- # Accelerate to the given joint velocity and hold it. After 1000ms stop the robot again.
498
- m_jv1 = JointVelocityMotion([0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], duration=Duration(1000))
499
-
500
- # Joint velocity motions also support waypoints. Unlike in joint position control, a joint velocity waypoint is a
501
- # target velocity to be reached. This particular example first accelerates the joints, holds the velocity for 1s, then
502
- # reverses direction for 2s, reverses direction again for 1s, and finally stops. It is important not to forget to stop
503
- # the robot at the end of such a sequence, as it will otherwise throw an error.
504
- m_jv2 = JointVelocityWaypointMotion([
505
- JointVelocityWaypoint([0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)),
506
- JointVelocityWaypoint([-0.1, -0.3, 0.1, -0.0, -0.1, 0.2, -0.4], hold_target_duration=Duration(2000)),
507
- JointVelocityWaypoint([0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)),
508
- JointVelocityWaypoint([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
509
- ])
512
+ # Accelerate to the given joint velocity and hold it. After 1000ms, stop the robot again.
513
+ m_jv1 = JointVelocityMotion(
514
+ [0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], duration=Duration(1000)
515
+ )
516
+
517
+ # Joint velocity motions also support waypoints. Unlike in joint position control, a joint
518
+ # velocity waypoint is a target velocity to be reached. This particular example first
519
+ # accelerates the joints, holds the velocity for 1s, then reverses direction for 2s, reverses
520
+ # direction again for 1s, and finally stops. It is important not to forget to stop the robot
521
+ # at the end of such a sequence, as it will otherwise throw an error.
522
+ m_jv2 = JointVelocityWaypointMotion(
523
+ [
524
+ JointVelocityWaypoint(
525
+ [0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)
526
+ ),
527
+ JointVelocityWaypoint(
528
+ [-0.1, -0.3, 0.1, -0.0, -0.1, 0.2, -0.4],
529
+ hold_target_duration=Duration(2000),
530
+ ),
531
+ JointVelocityWaypoint(
532
+ [0.1, 0.3, -0.1, 0.0, 0.1, -0.2, 0.4], hold_target_duration=Duration(1000)
533
+ ),
534
+ JointVelocityWaypoint([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
535
+ ]
536
+ )
510
537
 
511
538
  # Stop the robot in joint velocity control mode.
512
539
  m_jv3 = JointVelocityStopMotion()
@@ -524,31 +551,46 @@ quat = Rotation.from_euler("xyz", [0, 0, math.pi / 2]).as_quat()
524
551
  m_cp1 = CartesianMotion(Affine([0.4, -0.2, 0.3], quat))
525
552
 
526
553
  # With target elbow angle (otherwise, the Franka firmware will choose by itself)
527
- m_cp2 = CartesianMotion(RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3)))
554
+ m_cp2 = CartesianMotion(
555
+ RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))
556
+ )
528
557
 
529
- # A linear motion in cartesian space relative to the initial position
530
- # (Note that this motion is relative both in position and orientation. Hence, when the robot's end-effector is oriented
531
- # differently, it will move in a different direction)
558
+ # A linear motion in Cartesian space relative to the initial position
559
+ # (Note that this motion is relative both in position and orientation. Hence, when the robot's
560
+ # end-effector is oriented differently, it will move in a different direction)
532
561
  m_cp3 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
533
562
 
534
- # Generalization of CartesianMotion that allows for multiple waypoints
535
- m_cp4 = CartesianWaypointMotion([
536
- CartesianWaypoint(RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))),
537
- # The following waypoint is relative to the prior one and 50% slower
538
- CartesianWaypoint(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative, RelativeDynamicsFactor(0.5, 1.0, 1.0))
539
- ])
540
-
541
- # Cartesian waypoints also permit to specify target velocities
542
- m_cp5 = CartesianWaypointMotion([
543
- CartesianWaypoint(Affine([0.5, -0.2, 0.3], quat)),
544
- CartesianWaypoint(
545
- CartesianState(
546
- pose=Affine([0.4, -0.1, 0.3], quat),
547
- velocity=Twist([-0.01, 0.01, 0.0]))),
548
- CartesianWaypoint(Affine([0.3, 0.0, 0.3], quat))
549
- ])
550
-
551
- # Stop the robot in cartesian position control mode.
563
+ # Generalization of CartesianMotion that allows for multiple waypoints. The robot will stop at
564
+ # each of these waypoints. If you want the robot to move continuously, you have to specify a
565
+ # target velocity at every waypoint as shown in the example following this one.
566
+ m_cp4 = CartesianWaypointMotion(
567
+ [
568
+ CartesianWaypoint(
569
+ RobotPose(Affine([0.4, -0.2, 0.3], quat), elbow_state=ElbowState(0.3))
570
+ ),
571
+ # The following waypoint is relative to the prior one and 50% slower
572
+ CartesianWaypoint(
573
+ Affine([0.2, 0.0, 0.0]),
574
+ ReferenceType.Relative,
575
+ RelativeDynamicsFactor(0.5, 1.0, 1.0),
576
+ ),
577
+ ]
578
+ )
579
+
580
+ # Cartesian waypoints permit specifying target velocities
581
+ m_cp5 = CartesianWaypointMotion(
582
+ [
583
+ CartesianWaypoint(Affine([0.5, -0.2, 0.3], quat)),
584
+ CartesianWaypoint(
585
+ CartesianState(
586
+ pose=Affine([0.4, -0.1, 0.3], quat), velocity=Twist([-0.01, 0.01, 0.0])
587
+ )
588
+ ),
589
+ CartesianWaypoint(Affine([0.3, 0.0, 0.3], quat)),
590
+ ]
591
+ )
592
+
593
+ # Stop the robot in Cartesian position control mode.
552
594
  m_cp6 = CartesianStopMotion()
553
595
  ```
554
596
 
@@ -557,42 +599,57 @@ m_cp6 = CartesianStopMotion()
557
599
  ```python
558
600
  from franky import *
559
601
 
560
- # A cartesian velocity motion with linear (first argument) and angular (second argument) components
602
+ # A Cartesian velocity motion with linear (first argument) and angular (second argument)
603
+ # components
561
604
  m_cv1 = CartesianVelocityMotion(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]))
562
605
 
563
606
  # With target elbow velocity
564
- m_cv2 = CartesianVelocityMotion(RobotVelocity(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), elbow_velocity=-0.2))
565
-
566
- # Cartesian velocity motions also support multiple waypoints. Unlike in cartesian position control, a cartesian velocity
567
- # waypoint is a target velocity to be reached. This particular example first accelerates the end-effector, holds the
568
- # velocity for 1s, then # reverses direction for 2s, reverses direction again for 1s, and finally stops. It is important
569
- # not to forget to stop # the robot at the end of such a sequence, as it will otherwise throw an error.
570
- m_cv4 = CartesianVelocityWaypointMotion([
571
- CartesianVelocityWaypoint(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), hold_target_duration=Duration(1000)),
572
- CartesianVelocityWaypoint(Twist([-0.2, 0.1, -0.1], [-0.1, 0.1, -0.2]), hold_target_duration=Duration(2000)),
573
- CartesianVelocityWaypoint(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), hold_target_duration=Duration(1000)),
574
- CartesianVelocityWaypoint(Twist()),
575
- ])
576
-
577
- # Stop the robot in cartesian velocity control mode.
607
+ m_cv2 = CartesianVelocityMotion(
608
+ RobotVelocity(Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]), elbow_velocity=-0.2)
609
+ )
610
+
611
+ # Cartesian velocity motions also support multiple waypoints. Unlike in Cartesian position
612
+ # control, a Cartesian velocity waypoint is a target velocity to be reached. This particular
613
+ # example first accelerates the end-effector, holds the velocity for 1s, then reverses
614
+ # direction for 2s, reverses direction again for 1s, and finally stops. It is important not to
615
+ # forget to stop the robot at the end of such a sequence, as it will otherwise throw an error.
616
+ m_cv4 = CartesianVelocityWaypointMotion(
617
+ [
618
+ CartesianVelocityWaypoint(
619
+ Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]),
620
+ hold_target_duration=Duration(1000),
621
+ ),
622
+ CartesianVelocityWaypoint(
623
+ Twist([-0.2, 0.1, -0.1], [-0.1, 0.1, -0.2]),
624
+ hold_target_duration=Duration(2000),
625
+ ),
626
+ CartesianVelocityWaypoint(
627
+ Twist([0.2, -0.1, 0.1], [0.1, -0.1, 0.2]),
628
+ hold_target_duration=Duration(1000),
629
+ ),
630
+ CartesianVelocityWaypoint(Twist()),
631
+ ]
632
+ )
633
+
634
+ # Stop the robot in Cartesian velocity control mode.
578
635
  m_cv6 = CartesianVelocityStopMotion()
579
636
  ```
580
637
 
581
638
  #### Relative Dynamics Factors
582
639
 
583
- Every motion and waypoint type allows to adapt the dynamics (velocity, acceleration and jerk) by setting the respective
640
+ Every motion and waypoint type allows for adapting the dynamics (velocity, acceleration, and jerk) by setting the respective
584
641
  `relative_dynamics_factor` parameter.
585
- This parameter can also be set for the robot globally as shown below or in the `robot.move` command.
642
+ This parameter can also be set for the robot globally, as shown below, or in the `robot.move` command.
586
643
  Crucially, relative dynamics factors on different layers (robot, move command, and motion) do not override each other
587
644
  but rather get multiplied.
588
645
  Hence, a relative dynamics factor on a motion can only reduce the dynamics of the robot and never increase them.
589
646
 
590
- There is one exception to this rule and that is if any layer sets the relative dynamics factor to
647
+ There is one exception to this rule, and that is if any layer sets the relative dynamics factor to
591
648
  `RelativeDynamicsFactor.MAX_DYNAMICS`.
592
649
  This will cause the motion to be executed with maximum velocity, acceleration, and jerk limits, independently of the
593
650
  relative dynamics factors of the other layers.
594
- This feature should only be used to abruptly stop the robot in case of an unexpected environment contact as executing
595
- other motions with it is likely to lead to a discontinuity error and might be dangerous.
651
+ This feature should only be used to abruptly stop the robot in case of an unexpected environment contact, as executing
652
+ Other motions with it are likely to lead to a discontinuity error and might be dangerous.
596
653
 
597
654
  #### Executing Motions
598
655
 
@@ -601,14 +658,15 @@ The real robot can be moved by applying a motion to the robot using `move`:
601
658
  ```python
602
659
  # Before moving the robot, set an appropriate dynamics factor. We start small:
603
660
  robot.relative_dynamics_factor = 0.05
604
- # or alternatively, to control the scaling of velocity, acceleration, and jerk limits separately:
661
+ # or alternatively, to control the scaling of velocity, acceleration, and jerk limits
662
+ # separately:
605
663
  robot.relative_dynamics_factor = RelativeDynamicsFactor(0.05, 0.1, 0.15)
606
664
  # If these values are set too high, you will see discontinuity errors
607
665
 
608
666
  robot.move(m_jp1)
609
667
 
610
- # We can also set a relative dynamics factor in the move command. It will be multiplied with the other relative
611
- # dynamics factors (robot and motion if present).
668
+ # We can also set a relative dynamics factor in the move command. It will be multiplied by
669
+ # the other relative dynamics factors (robot and motion if present).
612
670
  robot.move(m_jp2, relative_dynamics_factor=0.8)
613
671
  ```
614
672
 
@@ -623,7 +681,8 @@ def cb(
623
681
  time_step: Duration,
624
682
  rel_time: Duration,
625
683
  abs_time: Duration,
626
- control_signal: JointPositions):
684
+ control_signal: JointPositions,
685
+ ):
627
686
  print(f"At time {abs_time}, the target joint positions were {control_signal.q}")
628
687
 
629
688
 
@@ -633,7 +692,7 @@ robot.move(m_jp1)
633
692
 
634
693
  Note that in Python, these callbacks are not executed in the control thread since they would otherwise block it.
635
694
  Instead, they are put in a queue and executed by another thread.
636
- While this scheme ensures that the control thread can always run, it cannot prevent that the queue grows indefinitely
695
+ While this scheme ensures that the control thread can always run, it cannot prevent the queue from growing indefinitely
637
696
  when the callbacks take more time to execute than it takes for new callbacks to be queued.
638
697
  Hence, callbacks might be executed significantly after they were queued if they take a long time to execute.
639
698
 
@@ -648,12 +707,13 @@ from franky import CartesianMotion, Affine, ReferenceType, Measure, Reaction
648
707
 
649
708
  motion = CartesianMotion(Affine([0.0, 0.0, 0.1]), ReferenceType.Relative) # Move down 10cm
650
709
 
651
- # It is important that the reaction motion uses the same control mode as the original motion. Hence, we cannot register
652
- # a JointMotion as a reaction motion to a CartesianMotion.
653
- reaction_motion = CartesianMotion(Affine([0.0, 0.0, 0.01]), ReferenceType.Relative) # Move up for 1cm
710
+ # It is important that the reaction motion uses the same control mode as the original motion.
711
+ # Hence, we cannot register a JointMotion as a reaction motion to a CartesianMotion.
712
+ # Move up by 1cm
713
+ reaction_motion = CartesianMotion(Affine([0.0, 0.0, -0.01]), ReferenceType.Relative)
654
714
 
655
715
  # Trigger reaction if the Z force is greater than 30N
656
- reaction = Reaction(Measure.FORCE_Z > 30.0, reaction_motion)
716
+ reaction = Reaction(Measure.FORCE_Z > 5.0, reaction_motion)
657
717
  motion.add_reaction(reaction)
658
718
 
659
719
  robot.move(motion)
@@ -710,10 +770,11 @@ with lower priority to ensure that the control thread does not get blocked.
710
770
  Thus, the callbacks might fire substantially after the reaction has fired, depending on the time it takes to execute
711
771
  them.
712
772
 
713
- In C++ you can additionally use lambdas to define more complex behaviours:
773
+ In C++, you can additionally use lambdas to define more complex behaviours:
714
774
 
715
775
  ```c++
716
- auto motion = CartesianMotion(RobotPose(Affine({0.0, 0.0, 0.2}), 0.0), ReferenceType::Relative);
776
+ auto motion = CartesianMotion(
777
+ RobotPose(Affine({0.0, 0.0, 0.2}), 0.0), ReferenceType::Relative);
717
778
 
718
779
  // Stop motion if force is over 10N
719
780
  auto stop_motion = StopMotion<franka::CartesianPose>()
@@ -751,20 +812,20 @@ Instead, it returns immediately and, thus, allows the main thread to set new mot
751
812
  import time
752
813
  from franky import Affine, CartesianMotion, Robot, ReferenceType
753
814
 
754
- robot = Robot("172.16.0.2")
815
+ robot = Robot("10.90.90.1")
755
816
  robot.relative_dynamics_factor = 0.05
756
817
 
757
818
  motion1 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
758
819
  robot.move(motion1, asynchronous=True)
759
820
 
760
821
  time.sleep(0.5)
761
- # Note that similar to reactions, when preempting active motions with new motions, the control mode cannot change.
762
- # Hence, we cannot use, e.g., a JointMotion here.
822
+ # Note that, similar to reactions, when preempting active motions with new motions, the
823
+ # control mode cannot change. Hence, we cannot use, e.g., a JointMotion here.
763
824
  motion2 = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
764
825
  robot.move(motion2, asynchronous=True)
765
826
  ```
766
827
 
767
- By calling `Robot.join_motion` the main thread can be synchronized with the motion thread, as it will block until the
828
+ By calling `Robot.join_motion`, the main thread can be synchronized with the motion thread, as it will block until the
768
829
  robot finishes its motion.
769
830
 
770
831
  ```python
@@ -773,21 +834,21 @@ robot.join_motion()
773
834
 
774
835
  Note that when exceptions occur during the asynchronous execution of a motion, they will not be thrown immediately.
775
836
  Instead, the control thread stores the exception and terminates.
776
- The next time `Robot.join_motion` or `Robot.move` are called, they will throw the stored exception in the main thread.
837
+ The next time `Robot.join_motion` or `Robot.move` is called, they will throw the stored exception in the main thread.
777
838
  Hence, after an asynchronous motion has finished, make sure to call `Robot.join_motion` to ensure being notified of any
778
839
  exceptions that occurred during the motion.
779
840
 
780
841
  ### <a id="gripper" /> 👌 Gripper
781
842
 
782
843
  In the `franky::Gripper` class, the default gripper force and gripper speed can be set.
783
- Then, additionally to the libfranka commands, the following helper methods can be used:
844
+ Then, in addition to the libfranka commands, the following helper methods can be used:
784
845
 
785
846
  ```c++
786
847
  #include <franky.hpp>
787
848
  #include <chrono>
788
849
  #include <future>
789
850
 
790
- auto gripper = franky::Gripper("172.16.0.2");
851
+ auto gripper = franky::Gripper("10.90.90.1");
791
852
 
792
853
  double speed = 0.02; // [m/s]
793
854
  double force = 20.0; // [N]
@@ -818,12 +879,12 @@ if (!success_future.wait_for(std::chrono::seconds(1)) == std::future_status::rea
818
879
  }
819
880
  ```
820
881
 
821
- The Python API follows the c++ API closely:
882
+ The Python API follows the C++ API closely:
822
883
 
823
884
  ```python
824
885
  import franky
825
886
 
826
- gripper = franky.Gripper("172.16.0.2")
887
+ gripper = franky.Gripper("10.90.90.1")
827
888
 
828
889
  speed = 0.02 # [m/s]
829
890
  force = 20.0 # [N]
@@ -856,9 +917,9 @@ else:
856
917
 
857
918
  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.
858
919
  The Franka UI also provides methods for locking and unlocking the brakes, setting the execution mode, and executing the safety self-test.
859
- 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.
920
+ 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.
860
921
 
861
- For that reason, Franky provides a `RobotWebSession` class that allows you to access the web interface API of the robot.
922
+ For that reason, franky provides a `RobotWebSession` class that allows you to access the web interface API of the robot.
862
923
  Note that directly accessing the web interface API is not officially supported and documented by Franka.
863
924
  Hence, use this feature at your own risk.
864
925
 
@@ -867,18 +928,19 @@ A typical automated workflow could look like this:
867
928
  ```python
868
929
  import franky
869
930
 
870
- with franky.RobotWebSession("172.16.0.2", "username", "password") as robot_web_session:
931
+ with franky.RobotWebSession("10.90.90.1", "username", "password") as robot_web_session:
871
932
  # First take control
872
933
  try:
873
- # Try taking control. The session currently holding control has to release it in order for this session to gain
874
- # control. In the web interface, a notification will show prompting the user to release control. If the other
875
- # session is another franky.RobotWebSession, then the `release_control` method can be called on the other
934
+ # Try taking control. The session currently holding control has to release it in order
935
+ # for this session to gain control. In the web interface, a notification will show
936
+ # prompting the user to release control. If the other session is another
937
+ # franky.RobotWebSession, then the `release_control` method can be called on the other
876
938
  # session to release control.
877
939
  robot_web_session.take_control(wait_timeout=10.0)
878
940
  except franky.TakeControlTimeoutError:
879
- # If nothing happens for 10s, we try to take control forcefully. This is particularly useful if the session
880
- # holding control is dead. Taking control by force requires the user to manually push the blue button close to
881
- # the robot's wrist.
941
+ # If nothing happens for 10s, we try to take control forcefully. This is particularly
942
+ # useful if the session holding control is dead. Taking control by force requires the
943
+ # user to manually push the blue button close to the robot's wrist.
882
944
  robot_web_session.take_control(wait_timeout=30.0, force=True)
883
945
 
884
946
  # Unlock the brakes
@@ -904,7 +966,7 @@ In case you are running the robot for longer than 24h you will have noticed that
904
966
  import time
905
967
  import franky
906
968
 
907
- with franky.RobotWebSession("172.16.0.2", "username", "password") as robot_web_session:
969
+ with franky.RobotWebSession("10.90.90.1", "username", "password") as robot_web_session:
908
970
  # Execute self-test if the time until self-test is less than 5 minutes.
909
971
  if robot_web_session.get_system_status()["safety"]["timeToTd2"] < 300:
910
972
  robot_web_session.disable_fci()
@@ -928,9 +990,9 @@ See [robot_web_session.py](franky/robot_web_session.py) for an example of how to
928
990
 
929
991
  ## 🛠️ Development
930
992
 
931
- Franky is currently tested against following versions
993
+ franky is currently tested against the following versions
932
994
 
933
- - 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
995
+ - 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
934
996
  - Eigen 3.4.0
935
997
  - Pybind11 2.13.6
936
998
  - POCO 1.12.5p2
@@ -941,20 +1003,20 @@ Franky is currently tested against following versions
941
1003
  ## 📜 License
942
1004
 
943
1005
  For non-commercial applications, this software is licensed under the LGPL v3.0.
944
- If you want to use Franky within commercial applications or under a different license, please contact us for individual
1006
+ If you want to use franky within commercial applications or under a different license, please contact us for individual
945
1007
  agreements.
946
1008
 
947
1009
  ## 🔍 Differences to frankx
948
1010
 
949
- Franky started originally as a fork of [frankx](https://github.com/pantor/frankx), though both codebase and
1011
+ franky started originally as a fork of [frankx](https://github.com/pantor/frankx), though both codebase and
950
1012
  functionality differ substantially from frankx by now.
951
- Aside of bug fixes and general performance improvements, Franky provides the following new features/improvements:
1013
+ Aside from bug fixes and general performance improvements, franky provides the following new features/improvements:
952
1014
 
953
1015
  * [Motions can be updated asynchronously.](#-real-time-motions)
954
1016
  * [Reactions allow for the registration of callbacks instead of just printing to stdout when fired.](#-real-time-reactions)
955
1017
  * [Motions allow for the registration of callbacks for profiling.](#motion-callbacks)
956
1018
  * [The robot state is also available during control.](#robot-state)
957
- * A larger part of the libfranka API is exposed to python (e.g.,`setCollisionBehavior`, `setJoinImpedance`, and
1019
+ * A larger part of the libfranka API is exposed to python (e.g., `setCollisionBehavior`, `setJoinImpedance`, and
958
1020
  `setCartesianImpedance`).
959
1021
  * Cartesian motion generation handles boundaries in Euler angles properly.
960
1022
  * [There is a new joint motion type that supports waypoints.](#-motion-types)
@@ -965,7 +1027,7 @@ Aside of bug fixes and general performance improvements, Franky provides the fol
965
1027
  * [The `Measure` class allows for arithmetic operations.](#-real-time-reactions)
966
1028
  * Exceptions caused by libfranka are raised properly instead of being printed to stdout.
967
1029
  * [We provide wheels for both Franka Research 3 and the older Franka Panda](#-setup)
968
- * Franky supports [joint velocity control](#joint-velocity-control)
1030
+ * franky supports [joint velocity control](#joint-velocity-control)
969
1031
  and [cartesian velocity control](#cartesian-velocity-control)
970
1032
  * The dynamics limits are not hard-coded anymore but can be [set for each robot instance](#-robot).
971
1033
 
@@ -976,4 +1038,4 @@ Please run the [pre-commit](https://pre-commit.com/) hooks before submitting you
976
1038
  To install the pre-commit hooks, run:
977
1039
 
978
1040
  1. [Install pre-commit](https://pre-commit.com/#install)
979
- 2. Install the Git hooks by running `pre-commit install` or, alternatively, run `pre-commit run --all-files manually.
1041
+ 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-38-x86_64-linux-gnu.so,sha256=DfE2rLEp2ab3Li471Jt0cVZ39Ka0J6zLxmAxiWKJ6-w,3049137
2
+ franky/_franky.cpython-38-x86_64-linux-gnu.so,sha256=SZqjpn2XeEdUyEZbhfsyg1Qt-hvrHKIlYI9yVQefVu4,3049137
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/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
23
- franky_control-1.1.0.dist-info/METADATA,sha256=tY2cwf3m5RF0BLL6f5MlP4GC-huOPAImMbvIP4NU0wg,40066
24
- franky_control-1.1.0.dist-info/WHEEL,sha256=L3HW8fVbXzdi0Qbq6Dl6IkkMSshhqlUpffoAzAKCWvI,111
25
- franky_control-1.1.0.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
26
- franky_control-1.1.0.dist-info/RECORD,,
22
+ franky_control-1.1.2.dist-info/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
23
+ franky_control-1.1.2.dist-info/METADATA,sha256=rAAddCuosCjBZ7YkBKAIelfYItywXBzyEXSk3IkfXoY,41091
24
+ franky_control-1.1.2.dist-info/WHEEL,sha256=L3HW8fVbXzdi0Qbq6Dl6IkkMSshhqlUpffoAzAKCWvI,111
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,,
index eaf603c..d01be13 100755
Binary file