franky-control 1.1.1__cp310-cp310-manylinux_2_28_x86_64.whl → 1.1.2__cp310-cp310-manylinux_2_28_x86_64.whl

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