franky-control 1.0.0__cp37-cp37m-manylinux_2_34_x86_64.whl → 1.0.1__cp37-cp37m-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.1
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
@@ -46,16 +46,16 @@ Requires-Dist: numpy
46
46
 
47
47
  Franky is a high-level control library for Franka robots offering Python and C++ support.
48
48
  By providing a high-level control interface, Franky eliminates the need for strict real-time programming at 1 kHz,
49
- making control from non-real time environments, such as Python programs, feasible.
49
+ making control from non-real-time environments, such as Python programs, feasible.
50
50
  Instead of relying on low-level control commands, Franky expects high-level position or velocity targets and
51
- uses [Ruckig](https://github.com/pantor/ruckig) to plan time-optimal trajectories in real time.
51
+ uses [Ruckig](https://github.com/pantor/ruckig) to plan time-optimal trajectories in real-time.
52
52
 
53
53
  Although Python does not provide real-time guarantees, Franky strives to maintain as much real-time control as possible.
54
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 dynamically update motion commands.
57
- Furthermore, most non-real time functionality of [libfranka](https://frankaemika.github.io/docs/libfranka.html), such as
58
- Gripper control, is made directly available in Python.
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
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)
61
61
  for an introduction.
@@ -67,41 +67,67 @@ at [https://timschneider42.github.io/franky/](https://timschneider42.github.io/f
67
67
  - **Control your Franka robot directly from Python in just a few lines!**
68
68
  No more endless hours setting up ROS, juggling packages, or untangling dependencies. Just `pip install` — no ROS at all.
69
69
 
70
- - **[Four control modes](#-motion-types)**:
71
- - [Cartesian position](#cartesian-position-control)
72
- - [Cartesian velocity](#cartesian-velocity-control)
73
- - [Joint position](#joint-position-control)
74
- - [Joint velocity](#joint-velocity-control)
75
-
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)
76
71
  Franky uses [Ruckig](https://github.com/pantor/ruckig) to generate smooth, time-optimal trajectories while respecting velocity, acceleration, and jerk limits.
77
72
 
78
- - **[Real-time control from Python and C++](#-real-time-motions)**:
79
- 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.
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.
80
75
 
81
- - **[Reactive behavior](#-real-time-reactions)**:
82
- 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.
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.
83
78
 
84
- - **[Motion and reaction callbacks](#motion-callbacks)**:
79
+ - **[Motion and reaction callbacks](#motion-callbacks)**
85
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.
86
81
 
87
- - **Things are moving too fast? [Tune the robot's dynamics to your needs](#-robot)**:
82
+ - **Things are moving too fast? [Tune the robot's dynamics to your needs](#-robot)**
88
83
  Adjust max velocity, acceleration, and jerk to match your setup or task. Fine control for smooth, safe operation.
89
84
 
90
- - **Full Python access to the libfranka API**:
91
- 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.
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.
92
87
 
88
+ ## 📖 Python Quickstart Guide
93
89
 
94
- ## ⚙️ Setup
90
+ Real-time kernel already installed and real-time permissions granted? Just install Franky via
95
91
 
96
- To install franky, you have to follow three steps:
92
+ ```bash
93
+ pip install franky-control
94
+ ```
95
+
96
+ otherwise, follow the [setup instructions](#setup) first.
97
+
98
+ Now we are already ready to go!
99
+ Unlock the brakes in the web interface, activate FCI, and start coding:
100
+ ```python
101
+ from franky import *
102
+
103
+ robot = Robot("172.16.0.2") # Replace this with your robot's IP
104
+
105
+ # Let's start slow (this lets the robot use a maximum of 5% of its velocity, acceleration, and jerk limits)
106
+ robot.relative_dynamics_factor = 0.05
107
+
108
+ # Move the robot 20cm along the relative X-axis of its end-effector
109
+ motion = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
110
+ robot.move(motion)
111
+ ```
112
+
113
+ If you are seeing server version mismatch errors, such as
114
+ ```
115
+ franky.IncompatibleVersionException: libfranka: Incompatible library version (server version: 5, library version: 9)
116
+ ```
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.
119
+
120
+ ## <a id="setup" /> ⚙️ Setup
121
+
122
+ To install Franky, you have to follow three steps:
97
123
 
98
124
  1. Ensure that you are using a realtime kernel
99
125
  2. Ensure that the executing user has permission to run real-time applications
100
- 3. Install franky via pip or build it from source
126
+ 3. Install Franky via pip or build it from source
101
127
 
102
128
  ### Installing a real-time kernel
103
129
 
104
- In order for franky to function properly, it requires the underlying OS to use a realtime kernel.
130
+ In order for Franky to function properly, it requires the underlying OS to use a realtime kernel.
105
131
  Otherwise, you might see `communication_constrains_violation` errors.
106
132
 
107
133
  To check whether your system is currently using a real-time kernel, type `uname -a`.
@@ -121,7 +147,7 @@ or, if you are using Ubuntu, it can be [enabled through Ubuntu Pro](https://ubun
121
147
 
122
148
  ### Allowing the executing user to run real-time applications
123
149
 
124
- First, create a group `realtime` and add your user (or whoever is running franky) to this group:
150
+ First, create a group `realtime` and add your user (or whoever is running Franky) to this group:
125
151
 
126
152
  ```bash
127
153
  sudo addgroup realtime
@@ -150,9 +176,9 @@ $ groups
150
176
 
151
177
  If realtime is not listed in your groups, try rebooting.
152
178
 
153
- ### Installing franky
179
+ ### Installing Franky
154
180
 
155
- To start using franky with Python and libfranka *0.15.0*, just install it via
181
+ To start using Franky with Python and libfranka *0.15.0*, just install it via
156
182
 
157
183
  ```bash
158
184
  pip install franky-control
@@ -173,10 +199,10 @@ pip install --no-index --find-links=./dist franky-control
173
199
  Franky is based on [libfranka](https://github.com/frankaemika/libfranka), [Eigen](https://eigen.tuxfamily.org) for
174
200
  transformation calculations and [pybind11](https://github.com/pybind/pybind11) for the Python bindings.
175
201
  As the Franka is sensitive to acceleration discontinuities, it requires jerk-constrained motion generation, for which
176
- franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
202
+ Franky uses the [Ruckig](https://ruckig.com) community version for Online Trajectory Generation (OTG).
177
203
 
178
204
  After installing the dependencies (the exact versions can be found [here](#-development)), you can build and install
179
- franky via
205
+ Franky via
180
206
 
181
207
  ```bash
182
208
  git clone --recurse-submodules git@github.com:timschneider42/franky.git
@@ -188,10 +214,10 @@ make
188
214
  make install
189
215
  ```
190
216
 
191
- To use franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
217
+ To use Franky, you can also include it as a subproject in your parent CMake via `add_subdirectory(franky)` and then
192
218
  `target_link_libraries(<target> franky)`.
193
219
 
194
- If you need only the Python module, you can install franky via
220
+ If you need only the Python module, you can install Franky via
195
221
 
196
222
  ```bash
197
223
  pip install .
@@ -202,7 +228,7 @@ Make sure that the built library `_franky.cpython-3**-****-linux-gnu.so` is in t
202
228
 
203
229
  #### Using Docker
204
230
 
205
- To use franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
231
+ To use Franky within Docker we provide a [Dockerfile](docker/run/Dockerfile) and
206
232
  accompanying [docker-compose](docker-compose.yml) file.
207
233
 
208
234
  ```bash
@@ -226,9 +252,9 @@ docker compose run franky-run bash
226
252
  The container requires access to the host machines network *and* elevated user rights to allow the docker user to set RT
227
253
  capabilities of the processes run from within it.
228
254
 
229
- #### Building franky with Docker
255
+ #### Building Franky with Docker
230
256
 
231
- For building franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
257
+ For building Franky and its wheels, we provide another Docker container that can also be launched using docker-compose:
232
258
 
233
259
  ```bash
234
260
  docker compose build franky-build
@@ -337,7 +363,7 @@ print(robot.joint_jerk_limit.max)
337
363
 
338
364
  #### Robot State
339
365
 
340
- The robot state can be retrieved by calling the following methods:
366
+ The robot state can be retrieved by accessing the following properties:
341
367
 
342
368
  * `state`: Object of type `franky.RobotState`, which extends the
343
369
  libfranka [franka::RobotState](https://frankaemika.github.io/libfranka/structfranka_1_1RobotState.html) structure by
@@ -363,7 +389,7 @@ state = robot.state
363
389
  cartesian_state = robot.current_cartesian_state
364
390
  robot_pose = cartesian_state.pose # Contains end-effector pose and elbow position
365
391
  ee_pose = robot_pose.end_effector_pose
366
- elbow_pos = robot_pose.elbow_position
392
+ elbow_pos = robot_pose.elbow_state
367
393
  robot_velocity = cartesian_state.velocity # Contains end-effector twist and elbow velocity
368
394
  ee_twist = robot_velocity.end_effector_twist
369
395
  elbow_vel = robot_velocity.elbow_velocity
@@ -390,7 +416,7 @@ For a full list of state-related features, check
390
416
  the [Robot](https://timschneider42.github.io/franky/classfranky_1_1_robot.html)
391
417
  and [Model](https://timschneider42.github.io/franky/classfranky_1_1_model.html) sections of the documentation.
392
418
 
393
- ### 🏃‍♂️ Motion Types
419
+ ### <a id="motion-types" /> 🏃‍♂️ Motion Types
394
420
 
395
421
  Franky currently supports four different impedance control modes: **joint position control**, **joint velocity control
396
422
  **, **cartesian position control**, and **cartesian velocity control**.
@@ -688,7 +714,7 @@ motion
688
714
  robot.move(motion)
689
715
  ```
690
716
 
691
- ### ⏱️ Real-Time Motions
717
+ ### <a id="real-time-motions" /> ⏱️ Real-Time Motions
692
718
 
693
719
  By setting the `asynchronous` parameter of `Robot.move` to `True`, the function does not block until the motion
694
720
  finishes.
@@ -813,7 +839,7 @@ Franky is currently tested against following versions
813
839
  ## 📜 License
814
840
 
815
841
  For non-commercial applications, this software is licensed under the LGPL v3.0.
816
- If you want to use franky within commercial applications or under a different license, please contact us for individual
842
+ If you want to use Franky within commercial applications or under a different license, please contact us for individual
817
843
  agreements.
818
844
 
819
845
  ## 🔍 Differences to frankx
@@ -1,9 +1,9 @@
1
1
  franky/__init__.py,sha256=lmRG8cc4eX-0gZgCkxxVCOrmuUEGJsppWl7DDURib-Y,293
2
- franky/_franky.cpython-37m-x86_64-linux-gnu.so,sha256=rT0UqaxnI-wd0s6kC9nzp6D2b3z4EKsZI9DWoUpwlZA,3206217
3
- franky/_franky.pyi,sha256=jp1xC8uvF4A6GBC-8B5JlWfp-N7mdm3OYsCYFWRTnek,60055
2
+ franky/_franky.cpython-37m-x86_64-linux-gnu.so,sha256=cNuVzo-ctOuWpc_YuCV18z8I08k9eYjXFwTYJh5Ho7M,3184305
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/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
25
- franky_control-1.0.0.dist-info/METADATA,sha256=E-4lCrLH9IIWD7wmlAiL3761hON4pOTKJf2ciKsLWS4,33516
26
- franky_control-1.0.0.dist-info/WHEEL,sha256=rG4Bvm5zLDpqeo3wOBsCvFjLdsxmbeMwBx3pVkh3DVA,113
27
- franky_control-1.0.0.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
28
- franky_control-1.0.0.dist-info/RECORD,,
24
+ franky_control-1.0.1.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
25
+ franky_control-1.0.1.dist-info/METADATA,sha256=JEpRTuhqTZyh5uVi5FuhsGUvX1tW7FIoUHfPW4a9YLk,34844
26
+ franky_control-1.0.1.dist-info/WHEEL,sha256=rG4Bvm5zLDpqeo3wOBsCvFjLdsxmbeMwBx3pVkh3DVA,113
27
+ franky_control-1.0.1.dist-info/top_level.txt,sha256=LdDKRvHTODs6ll6Ow5b-gmWqt4NJffHxL83MRTCv_Ag,22
28
+ franky_control-1.0.1.dist-info/RECORD,,