diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index bb5ae31..86e675d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -3,18 +3,18 @@ The [LBR-Stack](https://github.com/lbr-stack/) thrives to build a friendly commu We **encourage** everyone to open issues for questions / problems / features. For additional information, we would like to provide some links below. ### Knowledge Sources -- [Open issues](https://github.com/lbr-stack/pyFRI/issues) -- [Closed issues](https://github.com/lbr-stack/pyFRI/issues?q=is%3Aissue+is%3Aclosed) +- [Open issues](https://github.com/lbr-stack/pyfri/issues) +- [Closed issues](https://github.com/lbr-stack/pyfri/issues?q=is%3Aissue+is%3Aclosed) ## Contributing -### pyFRI +### pyfri Contributions are vital to this project. If you want to contribute a feature / fix proceed as follows 1. Open an issue: - Explain the issue and your solution - Request a new branch: `dev-feature`, e.g. `dev-my-new-demo` 2. Fork this repository -3. Create a [pull request](https://github.com/lbr-stack/pyFRI/pulls) against `dev-` +3. Create a [pull request](https://github.com/lbr-stack/pyfri/pulls) against `dev-` ### New FRI version Refer [README](https://github.com/lbr-stack/fri#contributing) for instructions. diff --git a/CMakeLists.txt b/CMakeLists.txt index f4c830d..4b05314 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.16.3) -project(_pyFRI) +project(_pyfri) include(FetchContent) @@ -27,12 +27,12 @@ FetchContent_MakeAvailable(FRI) add_subdirectory(pybind) -pybind11_add_module(_pyFRI ${CMAKE_CURRENT_SOURCE_DIR}/pyFRI/src/wrapper.cpp) +pybind11_add_module(_pyfri ${CMAKE_CURRENT_SOURCE_DIR}/pyfri/src/wrapper.cpp) target_include_directories( - _pyFRI + _pyfri PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/pyFRI/src + ${CMAKE_CURRENT_SOURCE_DIR}/pyfri/src ) -target_link_libraries(_pyFRI PRIVATE FRIClient) +target_link_libraries(_pyfri PRIVATE FRIClient) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 6174f35..533a05c 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at -https://github.com/lbr-stack/pyFRI/issues. +https://github.com/lbr-stack/pyfri/issues. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the diff --git a/README.md b/README.md index ee3547c..4f562db 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -# pyFRI +# pyfri -[![License](https://img.shields.io/github/license/lbr-stack/pyFRI)](https://github.com/lbr-stack/pyFRI/tree/main?tab=Apache-2.0-1-ov-file#readme) +[![Build](https://github.com/lbr-stack/pyfri/actions/workflows/build.yaml/badge.svg)](https://github.com/lbr-stack/pyfri/actions/workflows/build.yaml) +[![License](https://img.shields.io/github/license/lbr-stack/pyfri)](https://github.com/lbr-stack/pyfri/tree/main?tab=Apache-2.0-1-ov-file#readme) +[![JOSS](https://joss.theoj.org/papers/c43c82bed833c02503dd47f2637192ef/status.svg)](https://joss.theoj.org/papers/c43c82bed833c02503dd47f2637192ef) [![Code Style: Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) KUKA Fast Robot Interface Python SDK. -The code in this repository, provides Python bindings for the FRI Client SDK C++. +The code in this repository, provides Python bindings for the FRI Client SDK C++ through [pybind11](https://github.com/pybind/pybind11). The interface has been designed to be as similar as possible to the documentation provided by KUKA. There is one difference users of the Python bindings should be aware. @@ -24,7 +26,7 @@ ClientApplication app(connection, client); In Python, the equivalent code is as follows. ```python -import pyFRI as fri +import pyfri as fri # ..setup client.. @@ -35,32 +37,15 @@ Since UDP is the only supported connection type and the connection object is not See the [examples](examples/). -# Important notice - -**THIS IS NOT A KUKA PRODUCT.** - -[@cmower](https://github.com/cmower) and [@mhubii](https://github.com/mhubii) are not affiliated with KUKA. - -# Support - -The following versions of FRI are currently supported: -* 1.15 -* 2.5 - -Note, whilst FRI version 2.5 is supported some functionality is not. -Currently, FRI Cartesian Overlay is not supported by FRI-Client-SDK_Python. - -If you have a different version, please consider [forking](https://github.com/lbr-stack/pyFRI/fork) and [submitting a pull request](https://github.com/lbr-stack/pyFRI/pulls). - -# Install +## Quickstart 1. Clone repository (make sure you include `--recursive`): ```shell - git clone --recursive https://github.com/lbr-stack/pyFRI.git + git clone --recursive https://github.com/lbr-stack/pyfri.git ``` 2. Change directory: ```shell - cd pyFRI + cd pyfri ``` 3. Install: ```shell @@ -68,66 +53,15 @@ If you have a different version, please consider [forking](https://github.com/lb pip3 install . ``` -## Upgrading/switching between FRI Versions - -If you upgrade your FRI version or want to switch between them, you need to manually remove the `build/` directory before running `pip install`. - -# Usage - -## Data types - -You can pass NumPy arrays to the "set" methods (e.g. `setJointPosition`) in order to command the robot. -However, you **must** ensure the format of the array is correct. - -Arrays that have a `dtype` of `np.float32` are the only ones that can be accepted. -See how the commands are set in the the examples. - -## Collecting data from the robot - -We provide additional functionality to the LBR client application class that enables data collection to a text file. -In Python, simply add the following - -```python -app = fri.ClientApplication(client) -app.collect_data(file_name) -``` - -The string `file_name` should contain the file name for the data file. -We use the comma-separated values format for the data file, and so the file name should end with the extension `.csv` - *note*, if this isn't the case then `.csv` is automatically appended to the given file name. - -The columns in the recorded csv file are as follows: -* `index`: the index of the recorded data, starts at 0, and is incremented by 1 at each call to the `step` method. -* `time`: the time of the command, starts at 0.0, then is incremented by the sample time at each call to the `step` method. -* `record_time_nsec`: the epoch time collected when the data in the current time step is recorded. -* `tsec`: controller time as specified by the FRI in seconds. See FRI documentation for `getTimestampSec`. -* `tnsec`: controller time as specified by the FRI in nanoseconds. See FRI documentation for `getTimestampNanoSec`. -* `mp1, ..., mp7`: The measured joint position for the robot. -* `ip1, ..., ip7`: The ipo joint position for the robot. -* `mt1, ..., mt7`: The measured torque for the robot. -* `et1, ..., et7`: The external torque for the robot. -* `dt`: The sample time specified on the KUKA controller. - -See the [examples/LBRJointSineOverlay.py](examples/LBRJointSineOverlay.py) example that demonstrates how to easily collect data from the robot. - -# Examples - -First, ensure the corresponding Java applications for each example are installed (these were supplied with KUKA Sunrise). -Then turn on the robot, connect your laptop via ethernet, and follow these steps on your laptop. - -1. Change directory: `cd /path/to/FRI-Client-SDK_Python/examples` -2. Run examples - - `$ python LBRJointSineOverlay.py # based on examples provided by KUKA` - - `$ python LBRTorqueSineOverlay.py # based on examples provided by KUKA` - - `$ python LBRWrenchSineOverlay.py # based on examples provided by KUKA` - - `$ python joint_teleop.py` - - `$ python task_teleop.py` +> [!NOTE] +> FRI client is fetched from [fri](https://github.com/lbr-stack/fri) and must be available as branch, refer [README](https://github.com/lbr-stack/fri?tab=readme-ov-file#contributing). -# Documentation +4. Setup the hardware, see [Hardware Setup](https://lbr-stack.readthedocs.io/en/latest/lbr_fri_ros2_stack/lbr_fri_ros2_stack/doc/hardware_setup.html). -You can find documentation for `pyFRI` in the [wiki](https://github.com/cmower/FRI-Client-SDK_Python/wiki). +5. Checkout the [Example Applications](https://lbr-stack.readthedocs.io/en/latest/pyfri/doc/example_applications.html#example-applications). -# Citation -If you enjoyed using this repository for your work, we would really appreciate ❤️ if you could cite it, as it helps us to continue offering support. +## Citation +If you enjoyed using this repository for your work, we would really appreciate ❤️ if you could leave a ⭐ and / or cite it, as it helps us to continue offering support. ``` @misc{huber2023lbrstack, diff --git a/doc/example_applications.rst b/doc/example_applications.rst new file mode 100644 index 0000000..1320edd --- /dev/null +++ b/doc/example_applications.rst @@ -0,0 +1,218 @@ +Usage +----- +.. contents:: Table of Contents + :depth: 3 + :local: + :backlinks: none + +Data Types +~~~~~~~~~~ + +You can pass NumPy arrays to the "set" methods (e.g. ``setJointPosition``) in order to command the robot. +However, you **must** ensure the format of the array is correct. + +Arrays that have a ``dtype`` of ``np.float32`` are the only ones that can be accepted. +See how the commands are set in the the examples. + +Collecting Data from the Robot +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We provide additional functionality to the LBR client application class that enables data collection to a text file. +In Python, simply add the following + +.. code-block:: python + + app = fri.ClientApplication(client) + app.collect_data(file_name) + +The string ``file_name`` should contain the file name for the data file. +We use the comma-separated values format for the data file, and so the file name should end with the extension ``.csv`` - *note*, if this isn't the case then ``.csv`` is automatically appended to the given file name. + +The columns in the recorded csv file are as follows: + +- ``index``: the index of the recorded data, starts at 0, and is incremented by 1 at each call to the ``step`` method. +- ``time``: the time of the command, starts at 0.0, then is incremented by the sample time at each call to the ``step`` method. +- ``record_time_nsec``: the epoch time collected when the data in the current time step is recorded. +- ``tsec``: controller time as specified by the FRI in seconds. See FRI documentation for ``getTimestampSec``. +- ``tnsec``: controller time as specified by the FRI in nanoseconds. See FRI documentation for ``getTimestampNanoSec``. +- ``mp1, ..., mp7``: The measured joint position for the robot. +- ``ip1, ..., ip7``: The ipo joint position for the robot. +- ``mt1, ..., mt7``: The measured torque for the robot. +- ``et1, ..., et7``: The external torque for the robot. +- ``dt``: The sample time specified on the KUKA controller. + +See the `LBRJointSineOverlay.py `_:octicon:`link-external` example that demonstrates how to easily collect data from the robot. + +Example Applications +~~~~~~~~~~~~~~~~~~~~ +.. note:: + Make sure you followed :doc:`Hardware Setup <../../../lbr_fri_ros2_stack/lbr_fri_ros2_stack/doc/hardware_setup>` first. + +.. warning:: + Do always execute in ``T1`` mode first. + +First, ensure the corresponding Java applications for each example are installed (these were supplied with KUKA Sunrise). +Then turn on the robot, connect your laptop via ethernet, and follow these steps on your laptop. + +1. Change directory: ``cd /path/to/FRI-Client-SDK_Python/examples`` +2. Run examples + +Hand-guiding +^^^^^^^^^^^^ +Source code: `hand_guide.py `_:octicon:`link-external` + +This demos allows the user to hand-guide the robot's end-effector through estimating applied forces via the external joint torques. + +#. Remote side configurations: + + #. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD`` + + .. thumbnail:: img/applications_lbr_server.png + + #. Select + + - ``FRI send period``: ``10 ms`` + - ``IP address``: ``your configuration`` + - ``FRI control mode``: ``POSITION_CONTROL`` + - ``FRI client command mode``: ``POSITION`` + +#. Client side: + + .. code-block:: bash + + python3 hand_guide.py --lbr-ver 7 + +Now gently move the robot's end-effector to see the robot follow your movements. + +Joint Teleoperation +^^^^^^^^^^^^^^^^^^^ +Source code: `joint_teleop.py `_:octicon:`link-external` + +This example application lets users control individual joints via the keyboard. + +#. Remote side configurations: + + #. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD`` + + .. thumbnail:: img/applications_lbr_server.png + + #. Select + + - ``FRI send period``: ``10 ms`` + - ``IP address``: ``your configuration`` + - ``FRI control mode``: ``POSITION_CONTROL`` + - ``FRI client command mode``: ``POSITION`` + +#. On the client side, run: + + .. code-block:: bash + + python3 joint_teleop.py + +Press ``1-7`` to enable / disable the corresponding joint. Press ``left`` / ``right`` arrow keys to move the joint. + +Task Teleoperation +^^^^^^^^^^^^^^^^^^ +Source code: `task_teleop.py `_:octicon:`link-external` + +This example application lets users control the end-effector of the robot via the keyboard. + +#. Remote side configurations: + + #. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD`` + + .. thumbnail:: img/applications_lbr_server.png + + #. Select + + - ``FRI send period``: ``10 ms`` + - ``IP address``: ``your configuration`` + - ``FRI control mode``: ``POSITION_CONTROL`` + - ``FRI client command mode``: ``POSITION`` + +#. On the client side, run: + + .. code-block:: bash + + python3 task_teleop.py --lbr-ver 7 # or 14 if you are using med14 / iiwa14 + +Press ``x, y, z, r, p, a`` to enable the a specific axis. Press ``left`` / ``right`` arrow keys to move the axis. + +KUKA Default Demos +^^^^^^^^^^^^^^^^^^ +These demos mirror the demos that are provided with the C++ FRI client SDK from KUKA, only using the Python bindings instead. + +LBR Joint Sine Overlay +"""""""""""""""""""""" +Source code: `LBRJointSineOverlay.py `_:octicon:`link-external` + +#. Remote side configurations: + + #. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD`` + + .. thumbnail:: img/applications_lbr_server.png + + #. Select + + - ``FRI send period``: ``10 ms`` + - ``IP address``: ``your configuration`` + - ``FRI control mode``: ``POSITION_CONTROL`` + - ``FRI client command mode``: ``POSITION`` + +#. Client side: + + .. code-block:: bash + + python3 LBRJointSineOverlay.py # based on examples provided by KUKA + +You should see joint ``A4`` moving in a sine wave. + +LBR Torque Sine Overlay +""""""""""""""""""""""" +Source code: `LBRTorqueSineOverlay.py `_:octicon:`link-external` + +#. Remote side configurations: + + #. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD`` + + .. thumbnail:: img/applications_lbr_server.png + + #. Select + + - ``FRI send period``: ``2 ms`` + - ``IP address``: ``your configuration`` + - ``FRI control mode``: ``JOINT_IMPEDANCE_CONTROL`` + - ``FRI client command mode``: ``TORQUE`` + +#. Client side: + + .. code-block:: bash + + python3 LBRTorqueSineOverlay.py # based on examples provided by KUKA + +You should see joint ``A4`` moving in a sine wave. + +LBR Wrench Sine Overlay +""""""""""""""""""""""" +Source code: `LBRWrenchSineOverlay.py `_:octicon:`link-external` + +#. Remote side configurations: + + #. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD`` + + .. thumbnail:: img/applications_lbr_server.png + + #. Select + + - ``FRI send period``: ``2 ms`` + - ``IP address``: ``your configuration`` + - ``FRI control mode``: ``CARTESIAN_IMPEDANCE_CONTROL`` + - ``FRI client command mode``: ``WRENCH`` + +#. Client side: + + .. code-block:: bash + + python3 LBRWrenchSineOverlay.py # based on examples provided by KUKA + +You should see the end-effector circulating. diff --git a/doc/img/applications_lbr_server.png b/doc/img/applications_lbr_server.png new file mode 100644 index 0000000..6588f6a Binary files /dev/null and b/doc/img/applications_lbr_server.png differ diff --git a/doc/pyfri.rst b/doc/pyfri.rst new file mode 100644 index 0000000..1df0d0f --- /dev/null +++ b/doc/pyfri.rst @@ -0,0 +1,8 @@ +.. include:: ../README.md + :parser: myst_parser.sphinx_ + +.. toctree:: + :hidden: + + software_architecture + example_applications diff --git a/examples/LBRJointSineOverlay.py b/examples/LBRJointSineOverlay.py index 611c648..8fc10e3 100644 --- a/examples/LBRJointSineOverlay.py +++ b/examples/LBRJointSineOverlay.py @@ -6,7 +6,7 @@ import numpy as np import pandas as pd -import pyFRI as fri +import pyfri as fri class LBRJointSineOverlayClient(fri.LBRClient): @@ -50,7 +50,7 @@ def command(self): self.robotCommand().setJointPosition(joint_pos.astype(np.float32)) -def get_arguments(): +def args_factory(): def cvt_joint_mask(value): int_value = int(value) if 0 <= int_value < 7: @@ -114,7 +114,7 @@ def cvt_joint_mask(value): def main(): print("Running FRI Version:", fri.FRI_CLIENT_VERSION) - args = get_arguments() + args = args_factory() client = LBRJointSineOverlayClient( args.joint_mask, args.freq_hz, args.ampl_rad, args.filter_coeff ) diff --git a/examples/LBRTorqueSineOverlay.py b/examples/LBRTorqueSineOverlay.py index 31e872f..7ad3204 100644 --- a/examples/LBRTorqueSineOverlay.py +++ b/examples/LBRTorqueSineOverlay.py @@ -4,7 +4,7 @@ import numpy as np -import pyFRI as fri +import pyfri as fri class LBRTorqueSineOverlayClient(fri.LBRClient): @@ -51,7 +51,7 @@ def command(self): self.robotCommand().setTorque(self.torques) -def get_arguments(): +def args_factory(): def cvt_joint_mask(value): int_value = int(value) if 0 <= int_value < 7: @@ -101,7 +101,7 @@ def cvt_joint_mask(value): def main(): print("Running FRI Version:", fri.FRI_CLIENT_VERSION) - args = get_arguments() + args = args_factory() client = LBRTorqueSineOverlayClient( args.joint_mask, args.freq_hz, args.torque_amplitude ) diff --git a/examples/LBRWrenchSineOverlay.py b/examples/LBRWrenchSineOverlay.py index 912cfe6..2fdfc69 100644 --- a/examples/LBRWrenchSineOverlay.py +++ b/examples/LBRWrenchSineOverlay.py @@ -4,7 +4,7 @@ import numpy as np -import pyFRI as fri +import pyfri as fri class LBRWrenchSineOverlayClient(fri.LBRClient): @@ -57,7 +57,7 @@ def command(self): self.robotCommand().setWrench(self.wrench) -def get_arguments(): +def args_factory(): parser = argparse.ArgumentParser(description="LRBJointSineOverlay example.") parser.add_argument( "--hostname", @@ -107,7 +107,7 @@ def get_arguments(): def main(): print("Running FRI Version:", fri.FRI_CLIENT_VERSION) - args = get_arguments() + args = args_factory() print(args) client = LBRWrenchSineOverlayClient( args.frequencyX, args.frequencyY, args.amplitudeX, args.amplitudeY diff --git a/examples/hand_guide.py b/examples/hand_guide.py index 8786063..5b1a6fe 100644 --- a/examples/hand_guide.py +++ b/examples/hand_guide.py @@ -4,9 +4,9 @@ import numpy as np from admittance import AdmittanceController -import pyFRI as fri -from pyFRI.tools.filters import ExponentialStateFilter -from pyFRI.tools.state_estimators import ( +import pyfri as fri +from pyfri.tools.filters import ExponentialStateFilter +from pyfri.tools.state_estimators import ( FRIExternalTorqueEstimator, JointStateEstimator, WrenchEstimatorTaskOffset, @@ -49,7 +49,6 @@ def waitForCommand(self): ) raise SystemExit - self.wrench_estimator.update() self.q = self.robotState().getIpoJointPosition() self.command_position() @@ -73,7 +72,7 @@ def command(self): self.command_position() -def get_arguments(): +def args_factory(): parser = argparse.ArgumentParser(description="LRBJointSineOverlay example.") parser.add_argument( "--hostname", @@ -103,7 +102,7 @@ def get_arguments(): def main(): print("Running FRI Version:", fri.FRI_CLIENT_VERSION) - args = get_arguments() + args = args_factory() client = HandGuideClient(args.lbr_ver) app = fri.ClientApplication(client) success = app.connect(args.port, args.hostname) diff --git a/examples/joint_teleop.py b/examples/joint_teleop.py index bcb0282..0e884f4 100644 --- a/examples/joint_teleop.py +++ b/examples/joint_teleop.py @@ -1,11 +1,12 @@ +import argparse import sys +# FRI Client: https://github.com/cmower/FRI-Client-SDK_Python +import pyfri as fri + # PyGame: https://www.pygame.org/news import pygame -# FRI Client: https://github.com/cmower/FRI-Client-SDK_Python -import pyFRI as fri - pygame.init() # NumPy: https://numpy.org/ @@ -118,7 +119,7 @@ def command(self): self.robotCommand().setTorque(self.torques.astype(np.float32)) -def get_arguments(): +def args_factory(): parser = argparse.ArgumentParser(description="LRBJointSineOverlay example.") parser.add_argument( "--hostname", @@ -140,7 +141,7 @@ def get_arguments(): def main(): print("Running FRI Version:", fri.FRI_CLIENT_VERSION) - args = get_arguments() + args = args_factory() keyboard = Keyboard() client = TeleopClient(keyboard) app = fri.ClientApplication(client) diff --git a/examples/task_teleop.py b/examples/task_teleop.py index adca75d..40e416a 100644 --- a/examples/task_teleop.py +++ b/examples/task_teleop.py @@ -6,7 +6,7 @@ import pygame # FRI Client: https://github.com/cmower/FRI-Client-SDK_Python -import pyFRI as fri +import pyfri as fri pygame.init() @@ -129,7 +129,7 @@ def command(self): self.robotCommand().setTorque(self.torques.astype(np.float32)) -def get_arguments(): +def args_factory(): parser = argparse.ArgumentParser(description="LRBJointSineOverlay example.") parser.add_argument( "--hostname", @@ -159,7 +159,7 @@ def get_arguments(): def main(): print("Running FRI Version:", fri.FRI_CLIENT_VERSION) - args = get_arguments() + args = args_factory() ik = IK(args.lbr_ver) keyboard = Keyboard() client = TeleopClient(ik, keyboard) diff --git a/pyFRI/__init__.py b/pyFRI/__init__.py deleted file mode 100644 index 14fae8a..0000000 --- a/pyFRI/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from _pyFRI import * diff --git a/pyfri/__init__.py b/pyfri/__init__.py new file mode 100644 index 0000000..2e8d77b --- /dev/null +++ b/pyfri/__init__.py @@ -0,0 +1 @@ +from _pyfri import * diff --git a/pyFRI/src/wrapper.cpp b/pyfri/src/wrapper.cpp similarity index 99% rename from pyFRI/src/wrapper.cpp rename to pyfri/src/wrapper.cpp index 042d44d..3e0b270 100644 --- a/pyFRI/src/wrapper.cpp +++ b/pyfri/src/wrapper.cpp @@ -199,7 +199,7 @@ class PyClientApplication { // Python bindings namespace py = pybind11; -PYBIND11_MODULE(_pyFRI, m) { +PYBIND11_MODULE(_pyfri, m) { m.doc() = "Python bindings for the KUKA FRI Client SDK. THIS IS NOT A KUKA " "PRODUCT."; diff --git a/pyFRI/tools/__init__.py b/pyfri/tools/__init__.py similarity index 100% rename from pyFRI/tools/__init__.py rename to pyfri/tools/__init__.py diff --git a/pyFRI/tools/filters.py b/pyfri/tools/filters.py similarity index 100% rename from pyFRI/tools/filters.py rename to pyfri/tools/filters.py diff --git a/pyFRI/tools/state_estimators.py b/pyfri/tools/state_estimators.py similarity index 99% rename from pyFRI/tools/state_estimators.py rename to pyfri/tools/state_estimators.py index dccf71d..b30d721 100644 --- a/pyFRI/tools/state_estimators.py +++ b/pyfri/tools/state_estimators.py @@ -1,6 +1,6 @@ import abc import numpy as np -from pyFRI import LBRState +from pyfri import LBRState from collections import deque diff --git a/setup.py b/setup.py index 5534f41..c723f1c 100644 --- a/setup.py +++ b/setup.py @@ -142,14 +142,14 @@ def build_extension(self, ext: CMakeExtension) -> None: setup( - name="pyFRI", - version="1.2.0", + name="pyfri", + version="1.2.1", author="Christopher E. Mower, Martin Huber", author_email="christopher.mower@kcl.ac.uk, m.huber_1994@hotmail.de", description="Python bindings for the FRI Client SDK library.", long_description="", packages=find_packages(), - ext_modules=[CMakeExtension("_pyFRI")], + ext_modules=[CMakeExtension("_pyfri")], install_requires=["numpy", "pygame", "pyoptas", "pandas", "matplotlib"], cmdclass={"build_ext": CMakeBuild}, python_requires=">=3.8",