franky-control 1.0.0__cp313-cp313t-manylinux_2_34_x86_64.whl → 1.0.1__cp313-cp313t-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.
franky/_franky.pyi CHANGED
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import numpy
6
6
  import pybind11_stubgen.typing_ext
7
7
  import typing
8
- __all__ = ['Affine', 'BaseCartesianPoseMotion', 'BaseCartesianVelocityMotion', 'BaseJointPositionMotion', 'BaseJointVelocityMotion', 'BaseTorqueMotion', 'BoolFuture', 'CartesianImpedanceMotion', 'CartesianMotion', 'CartesianPose', 'CartesianPoseReaction', 'CartesianState', 'CartesianStopMotion', 'CartesianVelocities', 'CartesianVelocityMotion', 'CartesianVelocityReaction', 'CartesianVelocityStopMotion', 'CartesianVelocityWaypoint', 'CartesianVelocityWaypointMotion', 'CartesianWaypoint', 'CartesianWaypointMotion', 'CommandException', 'Condition', 'ControlException', 'ControlSignalType', 'ControllerMode', 'DoubleDynamicsLimit', 'Duration', 'ElbowState', 'Errors', 'Exception', 'ExponentialImpedanceMotion', 'FlipDirection', 'Frame', 'Gripper', 'GripperException', 'GripperState', 'ImpedanceMotion', 'IncompatibleVersionException', 'InvalidMotionTypeException', 'InvalidOperationException', 'JointMotion', 'JointPositionReaction', 'JointPositions', 'JointState', 'JointStopMotion', 'JointVelocities', 'JointVelocityMotion', 'JointVelocityReaction', 'JointVelocityStopMotion', 'JointVelocityWaypoint', 'JointVelocityWaypointMotion', 'JointWaypoint', 'JointWaypointMotion', 'Measure', 'Model', 'ModelException', 'NetworkException', 'ProtocolException', 'ReactionRecursionException', 'RealtimeConfig', 'RealtimeException', 'ReferenceType', 'RelativeDynamicsFactor', 'RobotInternal', 'RobotMode', 'RobotPose', 'RobotState', 'RobotVelocity', 'TorqueReaction', 'Torques', 'Twist', 'TwistAcceleration', 'VectorDynamicsLimit']
8
+ __all__ = ['Affine', 'BaseCartesianPoseMotion', 'BaseCartesianVelocityMotion', 'BaseJointPositionMotion', 'BaseJointVelocityMotion', 'BaseTorqueMotion', 'BoolFuture', 'CartesianImpedanceMotion', 'CartesianMotion', 'CartesianPose', 'CartesianPoseReaction', 'CartesianState', 'CartesianStopMotion', 'CartesianVelocities', 'CartesianVelocityMotion', 'CartesianVelocityReaction', 'CartesianVelocityStopMotion', 'CartesianVelocityWaypoint', 'CartesianVelocityWaypointMotion', 'CartesianWaypoint', 'CartesianWaypointMotion', 'CommandException', 'Condition', 'ControlException', 'ControlSignalType', 'ControllerMode', 'DoubleDynamicsLimit', 'Duration', 'ElbowState', 'Errors', 'Exception', 'ExponentialImpedanceMotion', 'FlipDirection', 'Frame', 'Gripper', 'GripperException', 'GripperState', 'ImpedanceMotion', 'IncompatibleVersionException', 'InvalidMotionTypeException', 'InvalidOperationException', 'JointMotion', 'JointPositionReaction', 'JointPositions', 'JointState', 'JointStopMotion', 'JointVelocities', 'JointVelocityMotion', 'JointVelocityReaction', 'JointVelocityStopMotion', 'JointVelocityWaypoint', 'JointVelocityWaypointMotion', 'JointWaypoint', 'JointWaypointMotion', 'Measure', 'Model', 'ModelException', 'NetworkException', 'ProtocolException', 'ReactionRecursionException', 'RealtimeConfig', 'RealtimeException', 'ReferenceType', 'RelativeDynamicsFactor', 'RobotMode', 'RobotPose', 'RobotState', 'RobotVelocity', 'TorqueReaction', 'Torques', 'Twist', 'TwistAcceleration', 'VectorDynamicsLimit']
9
9
  class Affine:
10
10
  @staticmethod
11
11
  def _pybind11_conduit_v1_(*args, **kwargs):
@@ -1188,158 +1188,6 @@ class RelativeDynamicsFactor:
1188
1188
  @property
1189
1189
  def velocity(self) -> float:
1190
1190
  ...
1191
- class RobotInternal:
1192
- control_rate: typing.ClassVar[float] = 0.001
1193
- degrees_of_freedom: typing.ClassVar[int] = 7
1194
- relative_dynamics_factor: RelativeDynamicsFactor
1195
- @staticmethod
1196
- def _pybind11_conduit_v1_(*args, **kwargs):
1197
- ...
1198
- def __init__(self, fci_hostname: str, relative_dynamics_factor: RelativeDynamicsFactor | float = 1.0, default_torque_threshold: float = 20.0, default_force_threshold: float = 30.0, controller_mode: ControllerMode = ..., realtime_config: RealtimeConfig = ..., kalman_q_process_var: float = 0.0001, kalman_dq_process_var: float = 0.001, kalman_ddq_process_var: float = 0.1, kalman_control_process_var: float = 1.0, kalman_q_obs_var: float = 0.01, kalman_dq_obs_var: float = 0.1, kalman_q_d_obs_var: float = 0.0001, kalman_dq_d_obs_var: float = 0.0001, kalman_ddq_d_obs_var: float = 0.0001, kalman_control_adaptation_rate: float = 0.1) -> None:
1199
- ...
1200
- def join_motion(self, timeout: float | None = None) -> bool:
1201
- ...
1202
- @typing.overload
1203
- def move(self, motion: BaseCartesianPoseMotion, asynchronous: bool = False) -> None:
1204
- ...
1205
- @typing.overload
1206
- def move(self, motion: BaseCartesianVelocityMotion, asynchronous: bool = False) -> None:
1207
- ...
1208
- @typing.overload
1209
- def move(self, motion: BaseJointPositionMotion, asynchronous: bool = False) -> None:
1210
- ...
1211
- @typing.overload
1212
- def move(self, motion: BaseJointVelocityMotion, asynchronous: bool = False) -> None:
1213
- ...
1214
- @typing.overload
1215
- def move(self, motion: BaseTorqueMotion, asynchronous: bool = False) -> None:
1216
- ...
1217
- def poll_motion(self) -> bool:
1218
- ...
1219
- def recover_from_errors(self) -> bool:
1220
- ...
1221
- def set_cartesian_impedance(self, K_x: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)]) -> None:
1222
- ...
1223
- @typing.overload
1224
- def set_collision_behavior(self, torque_thresholds: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], force_thresholds: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]]) -> None:
1225
- ...
1226
- @typing.overload
1227
- def set_collision_behavior(self, lower_torque_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], upper_torque_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], lower_force_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], upper_force_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]]) -> None:
1228
- ...
1229
- @typing.overload
1230
- def set_collision_behavior(self, lower_torque_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], upper_torque_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], lower_torque_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], upper_torque_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], lower_force_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], upper_force_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], lower_force_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], upper_force_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]]) -> None:
1231
- ...
1232
- def set_ee(self, NE_T_EE: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(16)]) -> None:
1233
- ...
1234
- def set_guiding_mode(self, guiding_mode: typing.Annotated[list[bool], pybind11_stubgen.typing_ext.FixedSize(6)], elbow: bool) -> None:
1235
- ...
1236
- def set_joint_impedance(self, K_theta: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)]) -> None:
1237
- ...
1238
- def set_k(self, EE_T_K: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(16)]) -> None:
1239
- ...
1240
- def set_load(self, load_mass: float, F_x_Cload: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(3)], load_inertia: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(9)]) -> None:
1241
- ...
1242
- def stop(self) -> None:
1243
- ...
1244
- @property
1245
- def current_cartesian_state(self) -> CartesianState:
1246
- ...
1247
- @property
1248
- def current_cartesian_velocity(self) -> RobotVelocity:
1249
- ...
1250
- @property
1251
- def current_control_signal_type(self) -> ControlSignalType | None:
1252
- ...
1253
- @property
1254
- def current_joint_positions(self) -> numpy.ndarray[numpy.float64[7, 1]]:
1255
- ...
1256
- @property
1257
- def current_joint_state(self) -> JointState:
1258
- ...
1259
- @property
1260
- def current_joint_velocities(self) -> numpy.ndarray[numpy.float64[7, 1]]:
1261
- ...
1262
- @property
1263
- def current_pose(self) -> RobotPose:
1264
- ...
1265
- @property
1266
- def elbow_acceleration_limit(self) -> DoubleDynamicsLimit:
1267
- """
1268
- [rad/s²]
1269
- """
1270
- @property
1271
- def elbow_jerk_limit(self) -> DoubleDynamicsLimit:
1272
- """
1273
- [rad/s³]
1274
- """
1275
- @property
1276
- def elbow_velocity_limit(self) -> DoubleDynamicsLimit:
1277
- """
1278
- [rad/s]
1279
- """
1280
- @property
1281
- def fci_hostname(self) -> str:
1282
- ...
1283
- @property
1284
- def has_errors(self) -> bool:
1285
- ...
1286
- @property
1287
- def is_in_control(self) -> bool:
1288
- ...
1289
- @property
1290
- def joint_acceleration_limit(self) -> VectorDynamicsLimit:
1291
- """
1292
- [rad/s²]
1293
- """
1294
- @property
1295
- def joint_jerk_limit(self) -> VectorDynamicsLimit:
1296
- """
1297
- [rad/s^3]
1298
- """
1299
- @property
1300
- def joint_velocity_limit(self) -> VectorDynamicsLimit:
1301
- """
1302
- [rad/s]
1303
- """
1304
- @property
1305
- def model(self) -> Model:
1306
- ...
1307
- @property
1308
- def model_urdf(self) -> str:
1309
- ...
1310
- @property
1311
- def rotation_acceleration_limit(self) -> DoubleDynamicsLimit:
1312
- """
1313
- [rad/s²]
1314
- """
1315
- @property
1316
- def rotation_jerk_limit(self) -> DoubleDynamicsLimit:
1317
- """
1318
- [rad/s³]
1319
- """
1320
- @property
1321
- def rotation_velocity_limit(self) -> DoubleDynamicsLimit:
1322
- """
1323
- [rad/s]
1324
- """
1325
- @property
1326
- def state(self) -> RobotState:
1327
- ...
1328
- @property
1329
- def translation_acceleration_limit(self) -> DoubleDynamicsLimit:
1330
- """
1331
- [m/s²]
1332
- """
1333
- @property
1334
- def translation_jerk_limit(self) -> DoubleDynamicsLimit:
1335
- """
1336
- [m/s³]
1337
- """
1338
- @property
1339
- def translation_velocity_limit(self) -> DoubleDynamicsLimit:
1340
- """
1341
- [m/s]
1342
- """
1343
1191
  class RobotMode:
1344
1192
  """
1345
1193
  Members:
@@ -1734,3 +1582,155 @@ class VectorDynamicsLimit:
1734
1582
  @property
1735
1583
  def max(self) -> numpy.ndarray[numpy.float64[7, 1]]:
1736
1584
  ...
1585
+ class _RobotInternal:
1586
+ control_rate: typing.ClassVar[float] = 0.001
1587
+ degrees_of_freedom: typing.ClassVar[int] = 7
1588
+ relative_dynamics_factor: RelativeDynamicsFactor
1589
+ @staticmethod
1590
+ def _pybind11_conduit_v1_(*args, **kwargs):
1591
+ ...
1592
+ def __init__(self, fci_hostname: str, relative_dynamics_factor: RelativeDynamicsFactor | float = 1.0, default_torque_threshold: float = 20.0, default_force_threshold: float = 30.0, controller_mode: ControllerMode = ..., realtime_config: RealtimeConfig = ..., kalman_q_process_var: float = 0.0001, kalman_dq_process_var: float = 0.001, kalman_ddq_process_var: float = 0.1, kalman_control_process_var: float = 1.0, kalman_q_obs_var: float = 0.01, kalman_dq_obs_var: float = 0.1, kalman_q_d_obs_var: float = 0.0001, kalman_dq_d_obs_var: float = 0.0001, kalman_ddq_d_obs_var: float = 0.0001, kalman_control_adaptation_rate: float = 0.1) -> None:
1593
+ ...
1594
+ def join_motion(self, timeout: float | None = None) -> bool:
1595
+ ...
1596
+ @typing.overload
1597
+ def move(self, motion: BaseCartesianPoseMotion, asynchronous: bool = False) -> None:
1598
+ ...
1599
+ @typing.overload
1600
+ def move(self, motion: BaseCartesianVelocityMotion, asynchronous: bool = False) -> None:
1601
+ ...
1602
+ @typing.overload
1603
+ def move(self, motion: BaseJointPositionMotion, asynchronous: bool = False) -> None:
1604
+ ...
1605
+ @typing.overload
1606
+ def move(self, motion: BaseJointVelocityMotion, asynchronous: bool = False) -> None:
1607
+ ...
1608
+ @typing.overload
1609
+ def move(self, motion: BaseTorqueMotion, asynchronous: bool = False) -> None:
1610
+ ...
1611
+ def poll_motion(self) -> bool:
1612
+ ...
1613
+ def recover_from_errors(self) -> bool:
1614
+ ...
1615
+ def set_cartesian_impedance(self, K_x: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)]) -> None:
1616
+ ...
1617
+ @typing.overload
1618
+ def set_collision_behavior(self, torque_thresholds: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], force_thresholds: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]]) -> None:
1619
+ ...
1620
+ @typing.overload
1621
+ def set_collision_behavior(self, lower_torque_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], upper_torque_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], lower_force_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], upper_force_threshold: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]]) -> None:
1622
+ ...
1623
+ @typing.overload
1624
+ def set_collision_behavior(self, lower_torque_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], upper_torque_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], lower_torque_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], upper_torque_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)] | numpy.ndarray[numpy.float64[7, 1]], lower_force_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], upper_force_threshold_acceleration: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], lower_force_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]], upper_force_threshold_nominal: float | typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(6)] | numpy.ndarray[numpy.float64[6, 1]]) -> None:
1625
+ ...
1626
+ def set_ee(self, NE_T_EE: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(16)]) -> None:
1627
+ ...
1628
+ def set_guiding_mode(self, guiding_mode: typing.Annotated[list[bool], pybind11_stubgen.typing_ext.FixedSize(6)], elbow: bool) -> None:
1629
+ ...
1630
+ def set_joint_impedance(self, K_theta: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(7)]) -> None:
1631
+ ...
1632
+ def set_k(self, EE_T_K: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(16)]) -> None:
1633
+ ...
1634
+ def set_load(self, load_mass: float, F_x_Cload: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(3)], load_inertia: typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(9)]) -> None:
1635
+ ...
1636
+ def stop(self) -> None:
1637
+ ...
1638
+ @property
1639
+ def current_cartesian_state(self) -> CartesianState:
1640
+ ...
1641
+ @property
1642
+ def current_cartesian_velocity(self) -> RobotVelocity:
1643
+ ...
1644
+ @property
1645
+ def current_control_signal_type(self) -> ControlSignalType | None:
1646
+ ...
1647
+ @property
1648
+ def current_joint_positions(self) -> numpy.ndarray[numpy.float64[7, 1]]:
1649
+ ...
1650
+ @property
1651
+ def current_joint_state(self) -> JointState:
1652
+ ...
1653
+ @property
1654
+ def current_joint_velocities(self) -> numpy.ndarray[numpy.float64[7, 1]]:
1655
+ ...
1656
+ @property
1657
+ def current_pose(self) -> RobotPose:
1658
+ ...
1659
+ @property
1660
+ def elbow_acceleration_limit(self) -> DoubleDynamicsLimit:
1661
+ """
1662
+ [rad/s²]
1663
+ """
1664
+ @property
1665
+ def elbow_jerk_limit(self) -> DoubleDynamicsLimit:
1666
+ """
1667
+ [rad/s³]
1668
+ """
1669
+ @property
1670
+ def elbow_velocity_limit(self) -> DoubleDynamicsLimit:
1671
+ """
1672
+ [rad/s]
1673
+ """
1674
+ @property
1675
+ def fci_hostname(self) -> str:
1676
+ ...
1677
+ @property
1678
+ def has_errors(self) -> bool:
1679
+ ...
1680
+ @property
1681
+ def is_in_control(self) -> bool:
1682
+ ...
1683
+ @property
1684
+ def joint_acceleration_limit(self) -> VectorDynamicsLimit:
1685
+ """
1686
+ [rad/s²]
1687
+ """
1688
+ @property
1689
+ def joint_jerk_limit(self) -> VectorDynamicsLimit:
1690
+ """
1691
+ [rad/s^3]
1692
+ """
1693
+ @property
1694
+ def joint_velocity_limit(self) -> VectorDynamicsLimit:
1695
+ """
1696
+ [rad/s]
1697
+ """
1698
+ @property
1699
+ def model(self) -> Model:
1700
+ ...
1701
+ @property
1702
+ def model_urdf(self) -> str:
1703
+ ...
1704
+ @property
1705
+ def rotation_acceleration_limit(self) -> DoubleDynamicsLimit:
1706
+ """
1707
+ [rad/s²]
1708
+ """
1709
+ @property
1710
+ def rotation_jerk_limit(self) -> DoubleDynamicsLimit:
1711
+ """
1712
+ [rad/s³]
1713
+ """
1714
+ @property
1715
+ def rotation_velocity_limit(self) -> DoubleDynamicsLimit:
1716
+ """
1717
+ [rad/s]
1718
+ """
1719
+ @property
1720
+ def state(self) -> RobotState:
1721
+ ...
1722
+ @property
1723
+ def translation_acceleration_limit(self) -> DoubleDynamicsLimit:
1724
+ """
1725
+ [m/s²]
1726
+ """
1727
+ @property
1728
+ def translation_jerk_limit(self) -> DoubleDynamicsLimit:
1729
+ """
1730
+ [m/s³]
1731
+ """
1732
+ @property
1733
+ def translation_velocity_limit(self) -> DoubleDynamicsLimit:
1734
+ """
1735
+ [m/s]
1736
+ """
franky/robot.py CHANGED
@@ -1,8 +1,8 @@
1
- from ._franky import RobotInternal
1
+ from ._franky import _RobotInternal
2
2
 
3
3
  from .robot_web_session import RobotWebSession
4
4
 
5
5
 
6
- class Robot(RobotInternal):
6
+ class Robot(_RobotInternal):
7
7
  def create_web_session(self, username: str, password: str):
8
8
  return RobotWebSession(self, username, password)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: franky-control
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: High-level control library for Franka robots.
5
5
  Home-page: https://github.com/TimSchneider42/franky
6
6
  Author: Tim Schneider
@@ -58,16 +58,16 @@ Dynamic: summary
58
58
 
59
59
  Franky is a high-level control library for Franka robots offering Python and C++ support.
60
60
  By providing a high-level control interface, Franky eliminates the need for strict real-time programming at 1 kHz,
61
- making control from non-real time environments, such as Python programs, feasible.
61
+ making control from non-real-time environments, such as Python programs, feasible.
62
62
  Instead of relying on low-level control commands, Franky expects high-level position or velocity targets and
63
- uses [Ruckig](https://github.com/pantor/ruckig) to plan time-optimal trajectories in real time.
63
+ uses [Ruckig](https://github.com/pantor/ruckig) to plan time-optimal trajectories in real-time.
64
64
 
65
65
  Although Python does not provide real-time guarantees, Franky strives to maintain as much real-time control as possible.
66
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 dynamically update motion commands.
69
- Furthermore, most non-real time functionality of [libfranka](https://frankaemika.github.io/docs/libfranka.html), such as
70
- Gripper control, is made directly available in Python.
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
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)
73
73
  for an introduction.
@@ -79,41 +79,67 @@ at [https://timschneider42.github.io/franky/](https://timschneider42.github.io/f
79
79
  - **Control your Franka robot directly from Python in just a few lines!**
80
80
  No more endless hours setting up ROS, juggling packages, or untangling dependencies. Just `pip install` — no ROS at all.
81
81
 
82
- - **[Four control modes](#-motion-types)**:
83
- - [Cartesian position](#cartesian-position-control)
84
- - [Cartesian velocity](#cartesian-velocity-control)
85
- - [Joint position](#joint-position-control)
86
- - [Joint velocity](#joint-velocity-control)
87
-
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)
88
83
  Franky uses [Ruckig](https://github.com/pantor/ruckig) to generate smooth, time-optimal trajectories while respecting velocity, acceleration, and jerk limits.
89
84
 
90
- - **[Real-time control from Python and C++](#-real-time-motions)**:
91
- Need to change the target while the robot’s moving? No problem. Franky re-plans trajectories on the fly, so you can preempt motions anytime.
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.
92
87
 
93
- - **[Reactive behavior](#-real-time-reactions)**:
94
- 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.
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.
95
90
 
96
- - **[Motion and reaction callbacks](#motion-callbacks)**:
91
+ - **[Motion and reaction callbacks](#motion-callbacks)**
97
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.
98
93
 
99
- - **Things are moving too fast? [Tune the robot's dynamics to your needs](#-robot)**:
94
+ - **Things are moving too fast? [Tune the robot's dynamics to your needs](#-robot)**
100
95
  Adjust max velocity, acceleration, and jerk to match your setup or task. Fine control for smooth, safe operation.
101
96
 
102
- - **Full Python access to the libfranka API**:
103
- 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.
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.
104
99
 
100
+ ## 📖 Python Quickstart Guide
105
101
 
106
- ## ⚙️ Setup
102
+ Real-time kernel already installed and real-time permissions granted? Just install Franky via
107
103
 
108
- To install franky, you have to follow three steps:
104
+ ```bash
105
+ pip install franky-control
106
+ ```
107
+
108
+ otherwise, follow the [setup instructions](#setup) first.
109
+
110
+ Now we are already ready to go!
111
+ Unlock the brakes in the web interface, activate FCI, and start coding:
112
+ ```python
113
+ from franky import *
114
+
115
+ robot = Robot("172.16.0.2") # Replace this with your robot's IP
116
+
117
+ # Let's start slow (this lets the robot use a maximum of 5% of its velocity, acceleration, and jerk limits)
118
+ robot.relative_dynamics_factor = 0.05
119
+
120
+ # Move the robot 20cm along the relative X-axis of its end-effector
121
+ motion = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
122
+ robot.move(motion)
123
+ ```
124
+
125
+ If you are seeing server version mismatch errors, such as
126
+ ```
127
+ franky.IncompatibleVersionException: libfranka: Incompatible library version (server version: 5, library version: 9)
128
+ ```
129
+ then your Franka robot is either not on the most recent firmware version or you are using the older Franka Panda model.
130
+ In any case, it's no big deal; just check [here](https://frankaemika.github.io/docs/compatibility.html) which libfranka version you need and follow our [instructions](installing-frankly) to install the appropriate Franky wheels.
131
+
132
+ ## <a id="setup" /> ⚙️ Setup
133
+
134
+ To install Franky, you have to follow three steps:
109
135
 
110
136
  1. Ensure that you are using a realtime kernel
111
137
  2. Ensure that the executing user has permission to run real-time applications
112
- 3. Install franky via pip or build it from source
138
+ 3. Install Franky via pip or build it from source
113
139
 
114
140
  ### Installing a real-time kernel
115
141
 
116
- In order for franky to function properly, it requires the underlying OS to use a realtime kernel.
142
+ In order for Franky to function properly, it requires the underlying OS to use a realtime kernel.
117
143
  Otherwise, you might see `communication_constrains_violation` errors.
118
144
 
119
145
  To check whether your system is currently using a real-time kernel, type `uname -a`.
@@ -133,7 +159,7 @@ or, if you are using Ubuntu, it can be [enabled through Ubuntu Pro](https://ubun
133
159
 
134
160
  ### Allowing the executing user to run real-time applications
135
161
 
136
- First, create a group `realtime` and add your user (or whoever is running franky) to this group:
162
+ First, create a group `realtime` and add your user (or whoever is running Franky) to this group:
137
163
 
138
164
  ```bash
139
165
  sudo addgroup realtime
@@ -162,9 +188,9 @@ $ groups
162
188
 
163
189
  If realtime is not listed in your groups, try rebooting.
164
190
 
165
- ### Installing franky
191
+ ### Installing Franky
166
192
 
167
- To start using franky with Python and libfranka *0.15.0*, just install it via
193
+ To start using Franky with Python and libfranka *0.15.0*, just install it via
168
194
 
169
195
  ```bash
170
196
  pip install franky-control
@@ -185,10 +211,10 @@ pip install --no-index --find-links=./dist franky-control
185
211
  Franky is based on [libfranka](https://github.com/frankaemika/libfranka), [Eigen](https://eigen.tuxfamily.org) for
186
212
  transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
187
213
  As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
188
- franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
214
+ Franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
189
215
 
190
216
  After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
191
- franky via
217
+ Franky via
192
218
 
193
219
  ```bash
194
220
  git clone --recurse-submodules git@github.com:timschneider42/franky.git
@@ -200,10 +226,10 @@ make
200
226
  make install
201
227
  ```
202
228
 
203
- To use franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
229
+ To use Franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
204
230
  `target_link_libraries(<target> franky)`.
205
231
 
206
- If you need only the Python module, you can install franky via
232
+ If you need only the Python module, you can install Franky via
207
233
 
208
234
  ```bash
209
235
  pip install .
@@ -214,7 +240,7 @@ Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in t
214
240
 
215
241
  #### Using Docker
216
242
 
217
- To use franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
243
+ To use Franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
218
244
  accompanying [docker-compose](docker-compose.yml) file.
219
245
 
220
246
  ```bash
@@ -238,9 +264,9 @@ docker compose run franky-run bash
238
264
  The container requires access to the host machines network *and* elevated user rights to allow the docker user to set RT
239
265
  capabilities of the processes run from within it.
240
266
 
241
- #### Building franky with Docker
267
+ #### Building Franky with Docker
242
268
 
243
- For building franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
269
+ For building Franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
244
270
 
245
271
  ```bash
246
272
  docker compose build franky-build
@@ -349,7 +375,7 @@ print(robot.joint_jerk_limit.max)
349
375
 
350
376
  #### Robot State
351
377
 
352
- The robot state can be retrieved by calling the following methods:
378
+ The robot state can be retrieved by accessing the following properties:
353
379
 
354
380
  * `state`: Object of type `franky.RobotState`, which extends the
355
381
  libfranka [franka::RobotState](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html) structure by
@@ -375,7 +401,7 @@ state = robot.state
375
401
  cartesian_state = robot.current_cartesian_state
376
402
  robot_pose = cartesian_state.pose # Contains end-effector pose and elbow position
377
403
  ee_pose = robot_pose.end_effector_pose
378
- elbow_pos = robot_pose.elbow_position
404
+ elbow_pos = robot_pose.elbow_state
379
405
  robot_velocity = cartesian_state.velocity # Contains end-effector twist and elbow velocity
380
406
  ee_twist = robot_velocity.end_effector_twist
381
407
  elbow_vel = robot_velocity.elbow_velocity
@@ -402,7 +428,7 @@ For a full list of state-related features, check
402
428
  the [Robot](https://timschneider42.github.io/franky/classfranky_1_1_robot.html)
403
429
  and [Model](https://timschneider42.github.io/franky/classfranky_1_1_model.html) sections of the documentation.
404
430
 
405
- ### 🏃‍♂️ Motion Types
431
+ ### <a id="motion-types" /> 🏃‍♂️ Motion Types
406
432
 
407
433
  Franky currently supports four different impedance control modes: **joint position control**, **joint velocity control
408
434
  **, **cartesian position control**, and **cartesian velocity control**.
@@ -700,7 +726,7 @@ motion
700
726
  robot.move(motion)
701
727
  ```
702
728
 
703
- ### ⏱️ Real-Time Motions
729
+ ### <a id="real-time-motions" /> ⏱️ Real-Time Motions
704
730
 
705
731
  By setting the `asynchronous` parameter of `Robot.move` to `True`, the function does not block until the motion
706
732
  finishes.
@@ -825,7 +851,7 @@ Franky is currently tested against following versions
825
851
  ## 📜 License
826
852
 
827
853
  For non-commercial applications, this software is licensed under the LGPL v3.0.
828
- If you want to use franky within commercial applications or under a different license, please contact us for individual
854
+ If you want to use Franky within commercial applications or under a different license, please contact us for individual
829
855
  agreements.
830
856
 
831
857
  ## 🔍 Differences to frankx
@@ -1,9 +1,9 @@
1
1
  franky/__init__.py,sha256=lmRG8cc4eX-0gZgCkxxVCOrmuUEGJsppWl7DDURib-Y,293
2
- franky/_franky.cpython-313t-x86_64-linux-gnu.so,sha256=a6-emQmaf_7cD-W46xQqBj1jrLr6X0gQ7rPX8rJ2DOs,3087673
3
- franky/_franky.pyi,sha256=jp1xC8uvF4A6GBC-8B5JlWfp-N7mdm3OYsCYFWRTnek,60055
2
+ franky/_franky.cpython-313t-x86_64-linux-gnu.so,sha256=-fRmLtN2iSGNdR2xQjY4KSRyf6eIhIu-QSu8WKFUaYE,3069865
3
+ franky/_franky.pyi,sha256=ocNP_RzseT7pe5tdwKkBn7hcG3EKXxQ1RDmhNbawIAQ,60039
4
4
  franky/motion.py,sha256=EZmZPvu2r4YBhcokV1PFh8s8NmiwOUERvct3Zz629C8,334
5
5
  franky/reaction.py,sha256=gDD7kVc_7Et2NwMmCB4Hcd12aK0eygJVqXzZ9Dzw0_M,1488
6
- franky/robot.py,sha256=GCWQOnhQIv3DhOo5FsHHgsFeNIZX8IQgeJ09VV84DLE,234
6
+ franky/robot.py,sha256=NaTNh4PaJshbz44eibvLCMt6O_Ak7TRVjhUR6AGay9A,236
7
7
  franky/robot_web_session.py,sha256=zOTAqDF4PbZLqJFr3RcuBwfWRSEMiw0Eag1stk3GWKE,7622
8
8
  franky_control.libs/libPocoFoundationd-74964157.so.92,sha256=BHLfMLcmdIPPcSI8dAkqtFlclnh_y2BtbFNKyF-p3EA,2420809
9
9
  franky_control.libs/libPocoNetd-5dd54f10.so.92,sha256=OFNDrRm1dpHiAzz5VZppU2O9TU0lkQj_GOMiPKQ0UWo,1907953
@@ -12,17 +12,17 @@ franky_control.libs/libboost_filesystem-63963750.so.1.78.0,sha256=PlaCrBtuzsgfIQ
12
12
  franky_control.libs/libboost_serialization-75ebc722.so.1.78.0,sha256=2287N4aM0rCR-iuEDyvMjrx5hefLHyhKBLSCCn3ofRs,319177
13
13
  franky_control.libs/libconsole_bridge-acce180d.so.1.0,sha256=-iSKX9xNyLCSSrducf7rDx6hXzdU5v7xQqZDulppIP8,22769
14
14
  franky_control.libs/libfmt-677b7a5c.so.8.1.1,sha256=rN3uzEn_limS_u6DV-BxdTEbs2GrhlicD_OjyAlKYpA,140649
15
- franky_control.libs/libfranka-fb54b5c1.so.0.15.0,sha256=eiTTbOOF0NaYmy96v0i0y9e5zQqJ5nW9j2_z1-rd3uI,973625
15
+ franky_control.libs/libfranka-fb54b5c1.so.0.15.0,sha256=_32_SS3EebthvOxPb5ajzCdQ1VC4w3l2b3dxy3UM1cI,973625
16
16
  franky_control.libs/libpcre2-8-b77f698a.so.0.11.0,sha256=hQ2wPgk-6gm4ZYWGy6wPDCt46HtNTpYIRBUyH9Fq-9U,642033
17
- franky_control.libs/libpinocchio_default-eb97a09e.so.3.4.0,sha256=D9EyoBnWWkQU3tfT44JbRHn0kFg0eK4zV4wYkvrvh6c,6489713
18
- franky_control.libs/libpinocchio_parsers-9f152785.so.3.4.0,sha256=UENErOb6on3vRPeP-NNrV-z1CvNlYBLBtMoxBYQt_DM,593433
17
+ franky_control.libs/libpinocchio_default-14a4da3b.so.3.4.0,sha256=-2BBoUEpCtCaA9t9u6D79NGBW-f_jJVOTHoFYb3Pljw,6489713
18
+ franky_control.libs/libpinocchio_parsers-9083fe76.so.3.4.0,sha256=CUcLmKVCVW1YCgVL73Zd0XMHAawOBITPUFIUdR3MnHM,593433
19
19
  franky_control.libs/libtinyxml-69e5f0dd.so.0.2.6.2,sha256=V45jOzaljaUrtOAYBS20QBFHn0qPFHTEcWxdcOBoJNA,118121
20
20
  franky_control.libs/liburdfdom_model-9ec0392f.so.1.0,sha256=Kwlq8DuENLdEX5URKcwUC06sl9rxUYoRjGx3EI-uRiY,146081
21
21
  franky_control.libs/liburdfdom_model_state-01125232.so.1.0,sha256=LNMEG27nv_6BYvelpjXjr0YsBl-6IsGQfg3uG0DvTQQ,20857
22
22
  franky_control.libs/liburdfdom_sensor-011819fa.so.1.0,sha256=LzFH_sfeyWcV042TmgSEXTQL1c0teyYg3veA8sTn_EM,20857
23
23
  franky_control.libs/liburdfdom_world-4d53bc81.so.1.0,sha256=IziPhPYdFfZTgKDOnUMGLYSCsZRxYfC1rEKWjvzrpb4,146081
24
- franky_control-1.0.0.dist-info/METADATA,sha256=e3rweixvplNxQ32s1hxB74CFTBhDQloDE9Zok4bxQwo,33770
25
- franky_control-1.0.0.dist-info/WHEEL,sha256=Sc5X8hJVkMrnFAq14219oyY9VlZVCLEz5CM09-bt-14,114
26
- franky_control-1.0.0.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
27
- franky_control-1.0.0.dist-info/RECORD,,
28
- franky_control-1.0.0.dist-info/licenses/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
24
+ franky_control-1.0.1.dist-info/METADATA,sha256=_bCEyfQyvtGBmDvrA85-Z_NV8mWb4so0lQ_sSaanuRs,35098
25
+ franky_control-1.0.1.dist-info/WHEEL,sha256=Sc5X8hJVkMrnFAq14219oyY9VlZVCLEz5CM09-bt-14,114
26
+ franky_control-1.0.1.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
27
+ franky_control-1.0.1.dist-info/RECORD,,
28
+ franky_control-1.0.1.dist-info/licenses/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650