From d620ded37720b4a18cb2234deb5eb2ea6ec951f7 Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Tue, 12 Sep 2023 22:56:45 -0400 Subject: [PATCH 1/7] Python for FRC getting started information --- source/docs/zero-to-robot/introduction.rst | 8 +++++++- source/docs/zero-to-robot/step-2/index.rst | 1 + source/docs/zero-to-robot/step-2/labview-setup.rst | 2 +- .../step-2/offline-installation-preparations.rst | 7 ++++++- source/docs/zero-to-robot/step-2/wpilib-setup.rst | 2 +- source/docs/zero-to-robot/step-4/index.rst | 1 + source/index.rst | 1 + source/stubs/programming-basics-stub.rst | 1 + 8 files changed, 19 insertions(+), 4 deletions(-) diff --git a/source/docs/zero-to-robot/introduction.rst b/source/docs/zero-to-robot/introduction.rst index 72e09943e2..851a1d663c 100644 --- a/source/docs/zero-to-robot/introduction.rst +++ b/source/docs/zero-to-robot/introduction.rst @@ -30,7 +30,13 @@ LabVIEW - `NI Learn LabVIEW `__ + +Python +^^^^^^ + +- `W3Schools `__ + Zero to Robot ------------- -The remaining pages in this tutorial are designed to be completed in order to go from zero to a working basic robot. The documents will walk you through wiring your robot, installation of all needed software, configuration of hardware, and loading a basic example program that should allow your robot to operate. When you complete a page, simply click **Next** to navigate to the next page and continue with the process. When you're done, you can click **Next** to continue to an overview of WPILib in C++/Java or jump back to the home page using the logo at the top left to explore the rest of the content. +The remaining pages in this tutorial are designed to be completed in order to go from zero to a working basic robot. The documents will walk you through wiring your robot, installation of all needed software, configuration of hardware, and loading a basic example program that should allow your robot to operate. When you complete a page, simply click **Next** to navigate to the next page and continue with the process. When you're done, you can click **Next** to continue to an overview of WPILib in C++/Java/Python or jump back to the home page using the logo at the top left to explore the rest of the content. diff --git a/source/docs/zero-to-robot/step-2/index.rst b/source/docs/zero-to-robot/step-2/index.rst index 55b496ed57..08d022bd49 100644 --- a/source/docs/zero-to-robot/step-2/index.rst +++ b/source/docs/zero-to-robot/step-2/index.rst @@ -10,4 +10,5 @@ An overview of the available control system software can be found :doc:`here `. +.. note:: This installation is for teams programming in LabVIEW or using NI Vision Assistant only. C++, Java and Python teams not using these features do not need to install LabVIEW and should proceed to :doc:`Installing the FRC Game Tools `. Download and installation times will vary widely with computer and internet connection specifications, however note that this process involves a large file download and installation and will likely take at least an hour to complete. diff --git a/source/docs/zero-to-robot/step-2/offline-installation-preparations.rst b/source/docs/zero-to-robot/step-2/offline-installation-preparations.rst index 11b7e6517d..543cde44d3 100644 --- a/source/docs/zero-to-robot/step-2/offline-installation-preparations.rst +++ b/source/docs/zero-to-robot/step-2/offline-installation-preparations.rst @@ -7,7 +7,7 @@ This article contains instructions/links to components you will want to gather i .. tip:: This document compiles all the download links from the following documents to make it easier to install on offline computers or on multiple computers. If you are you installing on a single computer that is connected to the internet, you can skip this page. -.. note:: The order in which these tools are installed does not matter for Java and C++ teams. LabVIEW should be installed before the FRC Game Tools or 3rd Party Libraries. +.. note:: The order in which these tools are installed does not matter for Java, C++ and Python teams. LabVIEW should be installed before the FRC Game Tools or 3rd Party Libraries. Documentation ------------- @@ -47,6 +47,11 @@ Then click on the correct binary for your OS and architecture to begin the downl .. note:: After downloading the Java/C++ WPILib installer, run it once while connected to the internet and select :guilabel:`Install for this User` then :guilabel:`Create VS Code zip to share with other computers/OSes for offline install` and save the downloaded VS Code zip file for future offline installations. +Python Teams +^^^^^^^^^^^^ + +There is no offline installation yet for the Python teams, please skip to :doc:`Installing the FRC Game Tools `. + 3rd Party Libraries/Software ---------------------------- diff --git a/source/docs/zero-to-robot/step-2/wpilib-setup.rst b/source/docs/zero-to-robot/step-2/wpilib-setup.rst index cbb68c00bc..a59f97ad11 100644 --- a/source/docs/zero-to-robot/step-2/wpilib-setup.rst +++ b/source/docs/zero-to-robot/step-2/wpilib-setup.rst @@ -1,7 +1,7 @@ WPILib Installation Guide ========================= -This guide is intended for Java and C++ teams. LabVIEW teams can skip to :doc:`labview-setup`. Additionally, the below tutorial shows Windows 10, but the steps are identical for all operating systems. Notes differentiating operating systems will be shown. +This guide is intended for Java and C++ teams. LabVIEW teams can skip to :doc:`labview-setup` and Python teams can skip to :doc:`python-setup`. Additionally, the below tutorial shows Windows 10, but the steps are identical for all operating systems. Notes differentiating operating systems will be shown. Prerequisites ------------- diff --git a/source/docs/zero-to-robot/step-4/index.rst b/source/docs/zero-to-robot/step-4/index.rst index 678e8cd82c..e781cf0c54 100644 --- a/source/docs/zero-to-robot/step-4/index.rst +++ b/source/docs/zero-to-robot/step-4/index.rst @@ -6,4 +6,5 @@ Step 4: Programming your Robot creating-test-drivetrain-program-labview creating-test-drivetrain-program-cpp-java + creating-test-drivetrain-program-python running-test-program diff --git a/source/index.rst b/source/index.rst index 4dff0f9525..79771f7195 100644 --- a/source/index.rst +++ b/source/index.rst @@ -331,6 +331,7 @@ Community translations can be found in a variety of languages in the bottom-left docs/software/dashboards/index docs/software/telemetry/index docs/software/labview/index + docs/software/python/index docs/software/hardware-apis/index docs/software/can-devices/index docs/software/basic-programming/index diff --git a/source/stubs/programming-basics-stub.rst b/source/stubs/programming-basics-stub.rst index fc02ca5e77..cac51169ad 100644 --- a/source/stubs/programming-basics-stub.rst +++ b/source/stubs/programming-basics-stub.rst @@ -13,6 +13,7 @@ Documentation that is useful throughout a team’s programming process. /docs/software/vscode-overview/index /docs/software/dashboards/index /docs/software/labview/index + /docs/software/python/index /docs/software/hardware-apis/index /docs/software/can-devices/index /docs/software/basic-programming/index From 410b022e6cb669443a7dec000f74be47bae06c9c Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Tue, 12 Sep 2023 22:56:54 -0400 Subject: [PATCH 2/7] Python for FRC getting started information --- .../software/python/deploying-robot-code.rst | 75 +++++++++ source/docs/software/python/index.rst | 9 ++ .../python/installing-robotpy-on-roborio.rst | 103 ++++++++++++ .../docs/software/python/robot-simulator.rst | 77 +++++++++ .../zero-to-robot/step-2/python-setup.rst | 87 ++++++++++ ...reating-test-drivetrain-program-python.rst | 153 ++++++++++++++++++ 6 files changed, 504 insertions(+) create mode 100644 source/docs/software/python/deploying-robot-code.rst create mode 100644 source/docs/software/python/index.rst create mode 100644 source/docs/software/python/installing-robotpy-on-roborio.rst create mode 100644 source/docs/software/python/robot-simulator.rst create mode 100644 source/docs/zero-to-robot/step-2/python-setup.rst create mode 100644 source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst diff --git a/source/docs/software/python/deploying-robot-code.rst b/source/docs/software/python/deploying-robot-code.rst new file mode 100644 index 0000000000..4d69ef242f --- /dev/null +++ b/source/docs/software/python/deploying-robot-code.rst @@ -0,0 +1,75 @@ + +Deploying Robot Code +==================== + +.. note:: Before deploying the code to your robot, you must start by :ref:`installing RobotPy on your roboRIO ` + +To deploy code to your robot, you can just run the following command and it will upload the code and start it immediately. + +.. tabs:: + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py deploy + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py deploy + +You can watch your robot code's output (and see any problems) by using the netconsole program (you can either use NI's tool, or `pynetconsole `__. You can use netconsole and the normal FRC tools to interact with the running robot code. + +If you're having problems deploying code to the robot, you can `join the Discord channel `__ and ask for help! + +Immediate feedback via Netconsole +--------------------------------- + +Note that when you run the deploy command like that, you won't get any feedback from the robot whether your code actually worked or not. If you want to see the feedback from your robot without launching a separate NetConsole window, a really useful option is :guilabel:`--nc`. This will cause the deploy command to show your program's console output, by launching a netconsole listener. + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py deploy --nc + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py deploy --nc + +Note: This requires the driver station software to be connected to your robot + +Skipping Tests +-------------- + +Now perhaps your tests are failing, but you really need to upload the code, and don't care about the tests. That's OK, you can still upload code to the robot: + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py deploy --skip-tests + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py deploy --skip-tests + +Starting deployed code at boot +------------------------------ + +If you wish for the deployed code to be started up when the roboRIO boots up, you need to make sure that "Disable RT Startup App" is not checked in the roboRIO's web configuration. See the :ref:`FIRST documentation ` for more information. + + +Next Steps +---------- + +Let's talk about the :ref:`robot simulator ` next. diff --git a/source/docs/software/python/index.rst b/source/docs/software/python/index.rst new file mode 100644 index 0000000000..6adc842880 --- /dev/null +++ b/source/docs/software/python/index.rst @@ -0,0 +1,9 @@ +FRC Python Programming +====================== + +.. toctree:: + :maxdepth: 1 + + installing-robotpy-on-roborio + deploying-robot-code + robot-simulator diff --git a/source/docs/software/python/installing-robotpy-on-roborio.rst b/source/docs/software/python/installing-robotpy-on-roborio.rst new file mode 100644 index 0000000000..65ded38de8 --- /dev/null +++ b/source/docs/software/python/installing-robotpy-on-roborio.rst @@ -0,0 +1,103 @@ + +RobotPy installation on roboRIO +=============================== + +Python libraries are not installed on the roboRIO by default. Each time you format the robotRIO or that you install/update a Python module with :guilabel:`pip install robotpy....`, make sure to run these steps again. + +If you install RobotPy on your roboRIO, you are still able to deploy C++ and Java programs without any conflicts. + +.. warning:: This guide assumes that your roboRIO has the current legal roboRIO image installed. If you haven't done this yet, see :ref:`the WPILib documentation ` for imaging instructions. To image the roboRIO for RobotPy, you only need to have the latest FRC Game Tools installed. + +RobotPy is truly cross platform, and can be installed from Windows, most Linux distributions, and from Mac macOS also. To install/use the installer, you must have Python 3.7+ installed. You should install the installer via pip (requires internet access) by installing the core RobotPy components (see the :ref:`Python Installation Guide ` for more details). + +Install process +--------------- + +The roboRIO robot controller is typically not connected to a network that has internet access, so there are two stages to installing RobotPy. + +* First, you need to connect your computer to the internet and use the installer to download the packages to your computer. +* Second, disconnect from the internet and connect to the network that the RoboRIO is on. + +The details for each stage will be discussed below. You can run the installer via Python. This is slightly different on Windows/macOS/Linux. + +Install Python on a roboRIO +--------------------------- + +.. note:: This step only needs to be done once. + +Installing Python and the RobotPy packages are separated into two different steps. Once you are connected to the internet, you can run this to download Python for roboRIO onto your computer. + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 -m robotpy_installer download-python + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + robotpy-installer download-python + +Once everything has downloaded, you can switch to your Robot's network, and use the following commands to install. + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 -m robotpy_installer install-python + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + robotpy-installer install-python + +It will ask you a few questions, and copy the right files over to your robot and set things up for you. + +Installing RobotPy on a roboRIO +------------------------------- + +The RobotPy installer takes care of downloading and installing the Python modules compatible for the roboRIO. The :guilabel:`download` and :guilabel:`install` commands behave similar to the pip command, including allowing use of a 'requirements.txt' file if desired. + +As mentioned above, installation needs to be done in two steps (download then install). Once you are connected to the internet: + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 -m robotpy_installer download robotpy[all] + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + robotpy-installer download robotpy[all] + +Once everything has downloaded, you can switch to your Robot's network, and use the following commands to install. + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 -m robotpy_installer install robotpy[all] + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + robotpy-installer install robotpy[all] + +.. note:: + + The robotpy installer uses pip to download and install packages, so you can replace robotpy above with the name of a pure python package as published on PyPI. + + If you need Python packages that require compilation, the RobotPy project distributes some commonly used packages. See the roborio-wheels project for more details. diff --git a/source/docs/software/python/robot-simulator.rst b/source/docs/software/python/robot-simulator.rst new file mode 100644 index 0000000000..d60c2553b6 --- /dev/null +++ b/source/docs/software/python/robot-simulator.rst @@ -0,0 +1,77 @@ +Robot Simulator +=============== + +An important (but often neglected) part of developing your robot code is to test it! Because we feel strongly about testing and simulation, the RobotPy project provides tools to make those types of things easier through the pyfrc project. + +Running the simulator +--------------------- + +To run the GUI simulator, run your robot.py with the following arguments: + +.. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py sim + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py sim + +User interface +-------------- + +See the :ref:`WPILib Simulation User Interface documentation ` for more details. + +2D Field Widget and Physics +--------------------------- + +The WPILib Simulation GUI has a 2D field available. This allows you to drive your robot around on a virtual field, in particular. It's very useful for testing the logic of autonomous mode movements. + +.. note:: + To enable the field view, go to the 'Window' menu, and select 2D field view. + +For the robot to move across the field, you must implement a physics module (it's a lot easier than it sounds!). Helper functions are provided to calculate robot position for common drivetrain types. + +We have a variety of examples and documentation available: + +* `RobotPy Examples Repository `_ +* `PyFRC API docs `__ +* `wpilib simulation `__ + +Communicating via NetworkTables +------------------------------- + +The simulator launches a NetworkTables server (just as the robot does), so it can be communicated with via standard NetworkTables tools (such as OutlineViewer, Shuffleboard, or SmartDashboard). + +For this to work, you need to tell the client to connect to the IP address that your simulator is listening on (this will be :guilabel:`localhost` or :guilabel:`127.0.0.1``). + +pynetworktables2js +~~~~~~~~~~~~~~~~~~ + +pynetworktables2js will automatically connect to ``localhost`` if no arguments +are given. + +OutlineViewer +~~~~~~~~~~~~~ + +You can type an address in when OutlineViewer launches, then tell it to start in +client mode. + +Shuffleboard +~~~~~~~~~~~~ + +Shuffleboard can be configured to connect to localhost in the preferences. + +SmartDashboard +~~~~~~~~~~~~~~ + +Using SmartDashboard, you need to launch the jar using the following command: + +.. code-block:: sh + + $ java -jar SmartDashboard.jar ip 127.0.0.1 diff --git a/source/docs/zero-to-robot/step-2/python-setup.rst b/source/docs/zero-to-robot/step-2/python-setup.rst new file mode 100644 index 0000000000..4e3413cdf4 --- /dev/null +++ b/source/docs/zero-to-robot/step-2/python-setup.rst @@ -0,0 +1,87 @@ +Python Installation Guide +========================= + +This guide is intended for Python teams. LabVIEW teams can skip to :doc:`labview-setup` and Java/C++ teams can skip to :doc:`wpilib-setup`. + +From now on, the Python version will be refered to as :guilabel:`RobotPy` + +Prerequisites +------------- + +Supported Operating Systems and Architectures: + * Windows 10 or higher, 32 bit or 64 bit. Arm version also supported + * Ubuntu 22.04 or higher, 64 bit. Fedora 36+ and Arch Linux are also known to work + * macOS 11 or higher + +Python 3.7 or higher must be installed + * `Python for Windows `__ + * `Python for macOS `__ + * Python should already be installed for Linux users + +Updating the RobotPy version will overwrite the previously installed one. Consider using `Virtualenv `__ if you want to keep distinct versions. + +Downloading +----------- + +.. tabs:: + + .. group-tab:: Windows 10+ + + .. warning:: On Windows, the `Visual Studio 2019 redistributable package `__ is required to be installed. + + Run the following command from cmd or Powershell to install RobotPy with all its optional and vendor packages: + + .. code-block:: sh + + py -3 -m pip install robotpy[all] + + To upgrade, you can run this: + + .. code-block:: sh + + py -3 -m pip install --upgrade robotpy[all] + + If you don't have administrative rights on your computer, either use `virtualenv/virtualenvwrapper-win `__, or you can install to the user site-packages directory: + + .. code-block:: sh + + py -3 -m pip install --user robotpy + + .. group-tab:: Linux/macOS + + On a Linux or macOS system that has pip installed, just run the following command from the Terminal application (may require admin rights): + + .. code-block:: sh + + pip3 install robotpy[all] + + This will install RobotPy with all its optional and vendor packages. + + To upgrade, you can run this: + + .. code-block:: sh + + pip3 install --upgrade robotpy[all] + + If you don't have administrative rights on your computer, either use `virtualenv/virtualenvwrapper `__, or you can install to the user site-packages directory: + + .. code-block:: sh + + pip3 install --user robotpy + + +Visual Studio Code Setup +------------------------ + +The prefered editor is Visual Studio Code, due to the ease of use and some usefull Python development tools, such as IntelliSense and Linting. +Download and install the version for your OS `here `__. + +Once installed, access the Extension menu on the left pane. Search for Python and install the official extension from Microsoft. You should restart VS Code once the installation is done. + +From this point, all should be set to create your robot code! You can also `start from a template `__. + + +Troubleshooting +--------------- + +In case the installer fails, please open an issue on the robotpy-wpilib repository. A link is available `here `__. Include the output of the terminal for the failing step. diff --git a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst new file mode 100644 index 0000000000..ea6001ec86 --- /dev/null +++ b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst @@ -0,0 +1,153 @@ +Creating your Test Drivetrain Program (Python) +============================================== + +Once everything is installed, we're ready to create a robot program. RobotPy comes with several templates for robot programs. Use of these templates is highly recommended for new users; however, advanced users are free to write their own robot code from scratch. This article walks through creating a project from one of the provided examples which has some code already written to drive a basic robot. + +.. important:: This guide includes code examples that involve vendor hardware for the convenience of the user. In this document, PWM refers to the motor controller included in the KOP. The CTRE tab references the Talon FX motor controller (Falcon 500 motor), but usage is similar for TalonSRX and VictorSPX. The REV tab references the CAN SPARK MAX controlling a brushless motor, but it's similar for brushed motor. Using the :guilabel:`pip install robotpy[all]` during installation includes all vendor Python modules. There is an assumption that the user has already configured the device(s) (update firmware, assign CAN IDs, etc) according to the manufacturer documentation (`CTRE `__ `REV `__). + +Creating a New Project +---------------------- + +Create a new folder and in this folder create a file named :guilabel:`robot.py`. +Open Visual Studio Code and from the File menu and click on Open Folder. From there, select and open the newly created folder. + +If you start from a `template `__, replace the robot.py file with the template one and add all other files. + +VS Code might show you this window: + +.. image:: /docs/software/vscode-overview/images/creating-robot-program/trusted-workspace.png + :alt: Trusted Workspace dialog in VS Code. + +Click :guilabel:`Yes I trust the authors`. + +Once opened we will see the project hierarchy on the left. Double clicking on the file will open that file in the editor. + + +Basic code structure +-------------------- + +First, here is what a simple code can look like. + +.. tabs:: + + .. group-tab:: PWM + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :linenos: + + .. group-tab:: CTRE + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-rev/main/examples/getting-started/robot.py + :language: python + :linenos: + + .. group-tab:: REV + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-ctre/main/examples/getting-started/robot.py + :language: python + :linenos: + +Now let's see the various parts of the code + +Imports +------- + +The first lines found in a Python file should be the **import** of the various needed modules. + +.. tabs:: + + .. group-tab:: PWM + + .. code-block:: python + + import wpilib # Used to get the joysticks + import wpilib.drive # Used for the DifferentialDrive class and the PWM motor + + .. group-tab:: CTRE + + .. code-block:: python + + import wpilib # Used to get the joysticks + import wpilib.drive # Used for the DifferentialDrive class + import ctre # CTRE library + + .. group-tab:: REV + + .. code-block:: python + + import wpilib # Used to get the joysticks + import wpilib.drive # Used for the DifferentialDrive class + import rev # REV library + + +The actual imports will vary depending on the needed libraries. Shoud you need to access the NAVX library, you would add the ``import navx`` line. + +Defining the variables for our sample robot +------------------------------------------- + +Your variables should be defined under the :guilabel:`def robotInit(self):` method. + +.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :linenos: + :lines: 12-29 + :lineno-start: 12 + +The sample robot in our examples will have a joystick on USB port 0 for arcade drive and two motors on PWM ports 0 and 1 (Vendor examples use CAN with IDs 1 and 2). Here we create objects of type DifferentialDrive (self.robotDrive), XboxController (self.controller) and Timer (self.timer). This section of the code does three things: + +1. Defines the variables as members of our Robot class. +2. Initializes the variables. + +.. note:: The ``Timer`` is used for the autonomous mode. + +Robot Initialization +-------------------- + +.. code-block:: python + + if __name__ == "__main__": + wpilib.run(MyRobot) + +The ``wpilib.run(MyRobot)`` method is run when the robot program is starting up, but after the constructor. + +Simple Autonomous Example +------------------------- + +.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 31-43 + :linenos: + :lineno-start: 31 + +The ``autonomousInit`` method is run once each time the robot transitions to autonomous from another mode. In this program, we restart the ``Timer`` in this method. + +``autonomousPeriodic`` is run once every period while the robot is in autonomous mode. In the ``TimedRobot`` class the period is a fixed time, which defaults to 20ms. In this example, the periodic code checks if the timer is less than 2 seconds and if so, drives forward at half speed using the ``ArcadeDrive`` method of the ``DifferentialDrive`` class. If more than 2 seconds has elapsed, the code stops the robot drive. + +Joystick Control for Teleoperation +---------------------------------- + +.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 45-52 + :linenos: + :lineno-start: 45 + + +Like in Autonomous, the Teleop mode has a ``teleopInit`` and ``teleopPeriodic`` function. In this example we don't have anything to do in ``teleopInit``, it is provided for illustration purposes only. In ``teleopPeriodic``, the code uses the ``arcadeDrive`` method to map the Y-axis of the ``Joystick`` to forward/back motion of the drive motors and the X-axis to turning motion. + +Test Mode +--------- + +.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 54-58 + :linenos: + :lineno-start: 54 + +Test Mode is used for testing robot functionality. Similar to ``teleopInit``, the ``testInit`` and ``testPeriodic`` methods are provided here for illustrative purposes only. + +Deploying the Project to a Robot +-------------------------------- + +Please see the instructions :ref:`here ` for deploying the program onto a robot. From 0979886252bccf6ec2b7f1852ca2908cf07f804c Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Wed, 13 Sep 2023 15:01:03 -0400 Subject: [PATCH 3/7] Some Linting on the new docs --- .../software/python/installing-robotpy-on-roborio.rst | 6 +++--- source/docs/zero-to-robot/step-2/python-setup.rst | 10 +++++----- .../step-4/creating-test-drivetrain-program-python.rst | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/docs/software/python/installing-robotpy-on-roborio.rst b/source/docs/software/python/installing-robotpy-on-roborio.rst index 65ded38de8..77de9fa306 100644 --- a/source/docs/software/python/installing-robotpy-on-roborio.rst +++ b/source/docs/software/python/installing-robotpy-on-roborio.rst @@ -25,7 +25,7 @@ Install Python on a roboRIO .. note:: This step only needs to be done once. -Installing Python and the RobotPy packages are separated into two different steps. Once you are connected to the internet, you can run this to download Python for roboRIO onto your computer. +Installing Python and the RobotPy packages are separated into two different steps. Once you are connected to the internet, you can run this to download Python for roboRIO onto your computer. .. tabs:: @@ -96,8 +96,8 @@ Once everything has downloaded, you can switch to your Robot's network, and use robotpy-installer install robotpy[all] -.. note:: - +.. note:: + The robotpy installer uses pip to download and install packages, so you can replace robotpy above with the name of a pure python package as published on PyPI. If you need Python packages that require compilation, the RobotPy project distributes some commonly used packages. See the roborio-wheels project for more details. diff --git a/source/docs/zero-to-robot/step-2/python-setup.rst b/source/docs/zero-to-robot/step-2/python-setup.rst index 4e3413cdf4..27dc357208 100644 --- a/source/docs/zero-to-robot/step-2/python-setup.rst +++ b/source/docs/zero-to-robot/step-2/python-setup.rst @@ -28,15 +28,15 @@ Downloading .. group-tab:: Windows 10+ .. warning:: On Windows, the `Visual Studio 2019 redistributable package `__ is required to be installed. - + Run the following command from cmd or Powershell to install RobotPy with all its optional and vendor packages: - + .. code-block:: sh py -3 -m pip install robotpy[all] To upgrade, you can run this: - + .. code-block:: sh py -3 -m pip install --upgrade robotpy[all] @@ -50,7 +50,7 @@ Downloading .. group-tab:: Linux/macOS On a Linux or macOS system that has pip installed, just run the following command from the Terminal application (may require admin rights): - + .. code-block:: sh pip3 install robotpy[all] @@ -58,7 +58,7 @@ Downloading This will install RobotPy with all its optional and vendor packages. To upgrade, you can run this: - + .. code-block:: sh pip3 install --upgrade robotpy[all] diff --git a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst index ea6001ec86..a6b8235b0c 100644 --- a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst +++ b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst @@ -53,7 +53,7 @@ Now let's see the various parts of the code Imports ------- -The first lines found in a Python file should be the **import** of the various needed modules. +The first lines found in a Python file should be the **import** of the various needed modules. .. tabs:: From 613949f2652216a561b8c72f5bfc0f60e536a4c4 Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Wed, 13 Sep 2023 16:57:29 -0400 Subject: [PATCH 4/7] Spell check --- source/docs/zero-to-robot/step-2/python-setup.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/docs/zero-to-robot/step-2/python-setup.rst b/source/docs/zero-to-robot/step-2/python-setup.rst index 27dc357208..229c83aa82 100644 --- a/source/docs/zero-to-robot/step-2/python-setup.rst +++ b/source/docs/zero-to-robot/step-2/python-setup.rst @@ -3,7 +3,7 @@ Python Installation Guide This guide is intended for Python teams. LabVIEW teams can skip to :doc:`labview-setup` and Java/C++ teams can skip to :doc:`wpilib-setup`. -From now on, the Python version will be refered to as :guilabel:`RobotPy` +From now on, the Python version will be referred to as :guilabel:`RobotPy` Prerequisites ------------- @@ -73,7 +73,7 @@ Downloading Visual Studio Code Setup ------------------------ -The prefered editor is Visual Studio Code, due to the ease of use and some usefull Python development tools, such as IntelliSense and Linting. +The preferred editor is Visual Studio Code, due to the ease of use and some useful Python development tools, such as IntelliSense and Linting. Download and install the version for your OS `here `__. Once installed, access the Extension menu on the left pane. Search for Python and install the official extension from Microsoft. You should restart VS Code once the installation is done. From 2e1e40a67559d7c51b3dbb4ecf0bd27c11f85ed4 Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Thu, 14 Sep 2023 21:08:17 -0400 Subject: [PATCH 5/7] Merging python doc into existing ones --- .../software/python/deploying-robot-code.rst | 75 --------- source/docs/software/python/index.rst | 9 - .../docs/software/python/robot-simulator.rst | 77 --------- source/docs/software/roborio-info/index.rst | 1 + .../roborio-robotpy.rst} | 4 +- .../vscode-overview/deploying-robot-code.rst | 88 ++++++++-- .../wpilib-commands-vscode.rst | 2 + .../robot-simulation/introduction.rst | 45 +++-- .../step-2/images/wpilib-setup/python-ext.png | Bin 0 -> 145392 bytes source/docs/zero-to-robot/step-2/index.rst | 1 - .../zero-to-robot/step-2/python-setup.rst | 87 ---------- .../zero-to-robot/step-2/wpilib-setup.rst | 69 +++++++- ...ating-test-drivetrain-program-cpp-java.rst | 159 +++++++++++++++--- ...reating-test-drivetrain-program-python.rst | 153 ----------------- source/docs/zero-to-robot/step-4/index.rst | 1 - .../step-4/running-test-program.rst | 2 +- source/index.rst | 11 +- source/stubs/api-docs-stub.rst | 1 + source/stubs/programming-basics-stub.rst | 1 - 19 files changed, 333 insertions(+), 453 deletions(-) delete mode 100644 source/docs/software/python/deploying-robot-code.rst delete mode 100644 source/docs/software/python/index.rst delete mode 100644 source/docs/software/python/robot-simulator.rst rename source/docs/software/{python/installing-robotpy-on-roborio.rst => roborio-info/roborio-robotpy.rst} (93%) create mode 100644 source/docs/zero-to-robot/step-2/images/wpilib-setup/python-ext.png delete mode 100644 source/docs/zero-to-robot/step-2/python-setup.rst delete mode 100644 source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst diff --git a/source/docs/software/python/deploying-robot-code.rst b/source/docs/software/python/deploying-robot-code.rst deleted file mode 100644 index 4d69ef242f..0000000000 --- a/source/docs/software/python/deploying-robot-code.rst +++ /dev/null @@ -1,75 +0,0 @@ - -Deploying Robot Code -==================== - -.. note:: Before deploying the code to your robot, you must start by :ref:`installing RobotPy on your roboRIO ` - -To deploy code to your robot, you can just run the following command and it will upload the code and start it immediately. - -.. tabs:: - .. group-tab:: Windows - - .. code-block:: sh - - py -3 robot.py deploy - - .. group-tab:: Linux/macOS - - .. code-block:: sh - - python3 robot.py deploy - -You can watch your robot code's output (and see any problems) by using the netconsole program (you can either use NI's tool, or `pynetconsole `__. You can use netconsole and the normal FRC tools to interact with the running robot code. - -If you're having problems deploying code to the robot, you can `join the Discord channel `__ and ask for help! - -Immediate feedback via Netconsole ---------------------------------- - -Note that when you run the deploy command like that, you won't get any feedback from the robot whether your code actually worked or not. If you want to see the feedback from your robot without launching a separate NetConsole window, a really useful option is :guilabel:`--nc`. This will cause the deploy command to show your program's console output, by launching a netconsole listener. - -.. tabs:: - - .. group-tab:: Windows - - .. code-block:: sh - - py -3 robot.py deploy --nc - - .. group-tab:: Linux/macOS - - .. code-block:: sh - - python3 robot.py deploy --nc - -Note: This requires the driver station software to be connected to your robot - -Skipping Tests --------------- - -Now perhaps your tests are failing, but you really need to upload the code, and don't care about the tests. That's OK, you can still upload code to the robot: - -.. tabs:: - - .. group-tab:: Windows - - .. code-block:: sh - - py -3 robot.py deploy --skip-tests - - .. group-tab:: Linux/macOS - - .. code-block:: sh - - python3 robot.py deploy --skip-tests - -Starting deployed code at boot ------------------------------- - -If you wish for the deployed code to be started up when the roboRIO boots up, you need to make sure that "Disable RT Startup App" is not checked in the roboRIO's web configuration. See the :ref:`FIRST documentation ` for more information. - - -Next Steps ----------- - -Let's talk about the :ref:`robot simulator ` next. diff --git a/source/docs/software/python/index.rst b/source/docs/software/python/index.rst deleted file mode 100644 index 6adc842880..0000000000 --- a/source/docs/software/python/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -FRC Python Programming -====================== - -.. toctree:: - :maxdepth: 1 - - installing-robotpy-on-roborio - deploying-robot-code - robot-simulator diff --git a/source/docs/software/python/robot-simulator.rst b/source/docs/software/python/robot-simulator.rst deleted file mode 100644 index d60c2553b6..0000000000 --- a/source/docs/software/python/robot-simulator.rst +++ /dev/null @@ -1,77 +0,0 @@ -Robot Simulator -=============== - -An important (but often neglected) part of developing your robot code is to test it! Because we feel strongly about testing and simulation, the RobotPy project provides tools to make those types of things easier through the pyfrc project. - -Running the simulator ---------------------- - -To run the GUI simulator, run your robot.py with the following arguments: - -.. tabs:: - - .. group-tab:: Windows - - .. code-block:: sh - - py -3 robot.py sim - - .. group-tab:: Linux/macOS - - .. code-block:: sh - - python3 robot.py sim - -User interface --------------- - -See the :ref:`WPILib Simulation User Interface documentation ` for more details. - -2D Field Widget and Physics ---------------------------- - -The WPILib Simulation GUI has a 2D field available. This allows you to drive your robot around on a virtual field, in particular. It's very useful for testing the logic of autonomous mode movements. - -.. note:: - To enable the field view, go to the 'Window' menu, and select 2D field view. - -For the robot to move across the field, you must implement a physics module (it's a lot easier than it sounds!). Helper functions are provided to calculate robot position for common drivetrain types. - -We have a variety of examples and documentation available: - -* `RobotPy Examples Repository `_ -* `PyFRC API docs `__ -* `wpilib simulation `__ - -Communicating via NetworkTables -------------------------------- - -The simulator launches a NetworkTables server (just as the robot does), so it can be communicated with via standard NetworkTables tools (such as OutlineViewer, Shuffleboard, or SmartDashboard). - -For this to work, you need to tell the client to connect to the IP address that your simulator is listening on (this will be :guilabel:`localhost` or :guilabel:`127.0.0.1``). - -pynetworktables2js -~~~~~~~~~~~~~~~~~~ - -pynetworktables2js will automatically connect to ``localhost`` if no arguments -are given. - -OutlineViewer -~~~~~~~~~~~~~ - -You can type an address in when OutlineViewer launches, then tell it to start in -client mode. - -Shuffleboard -~~~~~~~~~~~~ - -Shuffleboard can be configured to connect to localhost in the preferences. - -SmartDashboard -~~~~~~~~~~~~~~ - -Using SmartDashboard, you need to launch the jar using the following command: - -.. code-block:: sh - - $ java -jar SmartDashboard.jar ip 127.0.0.1 diff --git a/source/docs/software/roborio-info/index.rst b/source/docs/software/roborio-info/index.rst index 903c7c831f..5fe934667b 100644 --- a/source/docs/software/roborio-info/index.rst +++ b/source/docs/software/roborio-info/index.rst @@ -11,5 +11,6 @@ roboRIO roborio-ftp roborio-ssh roborio-brownouts + roborio-robotpy recovering-a-roborio-using-safe-mode Additional Help diff --git a/source/docs/software/python/installing-robotpy-on-roborio.rst b/source/docs/software/roborio-info/roborio-robotpy.rst similarity index 93% rename from source/docs/software/python/installing-robotpy-on-roborio.rst rename to source/docs/software/roborio-info/roborio-robotpy.rst index 77de9fa306..a063623437 100644 --- a/source/docs/software/python/installing-robotpy-on-roborio.rst +++ b/source/docs/software/roborio-info/roborio-robotpy.rst @@ -2,13 +2,13 @@ RobotPy installation on roboRIO =============================== -Python libraries are not installed on the roboRIO by default. Each time you format the robotRIO or that you install/update a Python module with :guilabel:`pip install robotpy....`, make sure to run these steps again. +Python libraries are not installed on the roboRIO by default. Each time you format the robotRIO or that you install/update a Python module with :guilabel:`pip install robotpy...`, make sure to run these steps again. If you install RobotPy on your roboRIO, you are still able to deploy C++ and Java programs without any conflicts. .. warning:: This guide assumes that your roboRIO has the current legal roboRIO image installed. If you haven't done this yet, see :ref:`the WPILib documentation ` for imaging instructions. To image the roboRIO for RobotPy, you only need to have the latest FRC Game Tools installed. -RobotPy is truly cross platform, and can be installed from Windows, most Linux distributions, and from Mac macOS also. To install/use the installer, you must have Python 3.7+ installed. You should install the installer via pip (requires internet access) by installing the core RobotPy components (see the :ref:`Python Installation Guide ` for more details). +RobotPy is truly cross platform, and can be installed from Windows, most Linux distributions, and from Mac macOS also. To install/use the installer, you must have Python 3.7+ installed. You should install the installer via pip (requires internet access) by installing the core RobotPy components (see the :ref:`WPILib Installation Guide ` for more details). Install process --------------- diff --git a/source/docs/software/vscode-overview/deploying-robot-code.rst b/source/docs/software/vscode-overview/deploying-robot-code.rst index d8164f7e6e..43364be76c 100644 --- a/source/docs/software/vscode-overview/deploying-robot-code.rst +++ b/source/docs/software/vscode-overview/deploying-robot-code.rst @@ -1,20 +1,88 @@ Building and Deploying Robot Code ================================= -Robot projects must be compiled ("built") and deployed in order to run on the roboRIO. Since the code is not compiled natively on the robot controller, this is known as "cross-compilation." +.. tabs:: -To build and deploy a robot project, do one of: + .. group-tab:: Java/C++ -1. Open the Command Palette and enter/select "Build Robot Code" -2. Open the shortcut menu indicated by the ellipses in the top right corner of the VS Code window and select "Build Robot Code" -3. Right-click on the build.gradle file in the project hierarchy and select "Build Robot Code" + Robot projects must be compiled ("built") and deployed in order to run on the roboRIO. Since the code is not compiled natively on the robot controller, this is known as "cross-compilation." -.. image:: images/deploying-robot-code/building-code-options.png + To build and deploy a robot project, do one of: -Deploy robot code by selecting "Deploy Robot Code" from any of the three locations from the previous instructions. That will build (if necessary) and deploy the robot program to the roboRIO. + 1. Open the Command Palette and enter/select "Build Robot Code" + 2. Open the shortcut menu indicated by the ellipses in the top right corner of the VS Code window and select "Build Robot Code" + 3. Right-click on the build.gradle file in the project hierarchy and select "Build Robot Code" -.. warning:: Avoid powering off the robot while deploying robot code. Interrupting the deployment process can corrupt the roboRIO filesystem and prevent your code from working until the roboRIO is :doc:`re-imaged `. + .. image:: images/deploying-robot-code/building-code-options.png -If successful, we will see a "Build Successful" message (1) and the RioLog will open with the console output from the robot program as it runs (2). + Deploy robot code by selecting "Deploy Robot Code" from any of the three locations from the previous instructions. That will build (if necessary) and deploy the robot program to the roboRIO. -.. image:: images/deploying-robot-code/build-successful.png + .. warning:: Avoid powering off the robot while deploying robot code. Interrupting the deployment process can corrupt the roboRIO filesystem and prevent your code from working until the roboRIO is :doc:`re-imaged `. + + If successful, we will see a "Build Successful" message (1) and the RioLog will open with the console output from the robot program as it runs (2). + + .. image:: images/deploying-robot-code/build-successful.png + + .. group-tab:: Python + + .. note:: Before deploying the code to your robot, you must start by :ref:`installing RobotPy on your roboRIO ` + + To deploy code to your robot, you can simply run the following command and it will upload the code and start it immediately. + + .. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py deploy + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py deploy + + Through VS Code, a terminal is accessible by opening your :guilabel:`robot.py` file and then clicking Terminal -> New Terminal from the top menu. + + This command will first run any unit tests on your robot code, and if they pass then it will upload the robot code to the roboRIO. Running the tests is really important, it allows you to catch errors in your code before you run it on the robot. + + You can watch your robot code's output (and see any problems) with netconsole by using the Driver Station Log Viewer or `pynetconsole `__. You can use netconsole and the normal FRC tools to interact with the running robot code. + + **Immediate feedback via Netconsole** + + When deploying the code to the roboRIO, you can have immediate feedback by adding the option :guilabel:`--nc`. This will cause the deploy command to show your program's console output, by launching a netconsole listener. + + .. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py deploy --nc + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py deploy --nc + + .. Note:: This requires the driver station software to be connected to your robot + + **Skipping Tests** + + In the event that the tests are failing but you want to upload the code anyway, you can skip them by adding the option :guilabel:`--skip-tests`. + + .. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh + + py -3 robot.py deploy --skip-tests + + .. group-tab:: Linux/macOS + + .. code-block:: sh + + python3 robot.py deploy --skip-tests diff --git a/source/docs/software/vscode-overview/wpilib-commands-vscode.rst b/source/docs/software/vscode-overview/wpilib-commands-vscode.rst index 31b3452766..8d330f1ad3 100644 --- a/source/docs/software/vscode-overview/wpilib-commands-vscode.rst +++ b/source/docs/software/vscode-overview/wpilib-commands-vscode.rst @@ -2,6 +2,8 @@ WPILib Commands in Visual Studio Code ===================================== This document contains a complete list of the commands provided by the WPILib VS Code Extension and what they do. +.. note:: The current Python integration is not compatible with the WPILib commands in VS Code. Refer to :ref:`Building and Deploying Robot Code` instead. + To access these commands, press Ctrl+Shift+P to open the Command Palette, then begin typing the command name as shown here to filter the list of commands. Click on the command name to execute it. - **WPILib: Build Robot Code** - Builds open project using GradleRIO diff --git a/source/docs/software/wpilib-tools/robot-simulation/introduction.rst b/source/docs/software/wpilib-tools/robot-simulation/introduction.rst index cbc0282a58..b5830d1c8b 100644 --- a/source/docs/software/wpilib-tools/robot-simulation/introduction.rst +++ b/source/docs/software/wpilib-tools/robot-simulation/introduction.rst @@ -3,6 +3,8 @@ Introduction to Robot Simulation Often a team may want to test their code without having an actual robot available. WPILib provides teams with the ability to simulate various robot features using simple gradle commands. +If you are using Python, you can skip to :ref:`Running Robot Simulation ` + Enabling Desktop Support ------------------------ @@ -38,21 +40,44 @@ Ensure the :guilabel:`Desktop Development with C++` option is checked in the Vis Running Robot Simulation ------------------------ -Basic robot simulation can be run using VS Code. This can be done without using any commands by using VS Code's command palette. +.. tabs:: + + .. group-tab:: Java/C++ + + Basic robot simulation can be run using VS Code. This can be done without using any commands by using VS Code's command palette. + + .. image:: images/vscode-run-simulation.png + :alt: Running robot simulation through VS Code + + Your console output in Visual Studio Code should look like the below. However, teams probably will want to actually *test* their code versus just running the simulation. This can be done using :doc:`WPILib's Simulation GUI `. + + .. code-block:: console + + ********** Robot program starting ********** + Default disabledInit() method... Override me! + Default disabledPeriodic() method... Override me! + Default robotPeriodic() method... Override me! + + .. important:: Simulation can also be run outside of VS Code using ``./gradlew simulateJava`` for Java or ``./gradlew simulateNative`` for C++. + + .. group-tab:: Python + + To run the GUI simulator, the easiest way is to open your :guilabel:`robot.py` file and start a new terminal by clicking Terminal -> New Terminal from the top menu. You can then execute the code with the :guilabel:`sim` argument. + + .. tabs:: + + .. group-tab:: Windows + + .. code-block:: sh -.. image:: images/vscode-run-simulation.png - :alt: Running robot simulation through VS Code + py -3 robot.py sim -Your console output in Visual Studio Code should look like the below. However, teams probably will want to actually *test* their code versus just running the simulation. This can be done using :doc:`WPILib's Simulation GUI `. + .. group-tab:: Linux/macOS -.. code-block:: console + .. code-block:: sh - ********** Robot program starting ********** - Default disabledInit() method... Override me! - Default disabledPeriodic() method... Override me! - Default robotPeriodic() method... Override me! + python3 robot.py sim -.. important:: Simulation can also be run outside of VS Code using ``./gradlew simulateJava`` for Java or ``./gradlew simulateNative`` for C++. Running Robot Dashboards ------------------------ diff --git a/source/docs/zero-to-robot/step-2/images/wpilib-setup/python-ext.png b/source/docs/zero-to-robot/step-2/images/wpilib-setup/python-ext.png new file mode 100644 index 0000000000000000000000000000000000000000..bee5009bbd8a07ba3c014557ecb3988417e6d543 GIT binary patch literal 145392 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 cjY{>26r;O&gAvA>u!2mWX4k}ZU|&nPP*UG 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 literal 0 HcmV?d00001 diff --git a/source/docs/zero-to-robot/step-2/index.rst b/source/docs/zero-to-robot/step-2/index.rst index 08d022bd49..55b496ed57 100644 --- a/source/docs/zero-to-robot/step-2/index.rst +++ b/source/docs/zero-to-robot/step-2/index.rst @@ -10,5 +10,4 @@ An overview of the available control system software can be found :doc:`here `__ - * `Python for macOS `__ - * Python should already be installed for Linux users - -Updating the RobotPy version will overwrite the previously installed one. Consider using `Virtualenv `__ if you want to keep distinct versions. - -Downloading ------------ - -.. tabs:: - - .. group-tab:: Windows 10+ - - .. warning:: On Windows, the `Visual Studio 2019 redistributable package `__ is required to be installed. - - Run the following command from cmd or Powershell to install RobotPy with all its optional and vendor packages: - - .. code-block:: sh - - py -3 -m pip install robotpy[all] - - To upgrade, you can run this: - - .. code-block:: sh - - py -3 -m pip install --upgrade robotpy[all] - - If you don't have administrative rights on your computer, either use `virtualenv/virtualenvwrapper-win `__, or you can install to the user site-packages directory: - - .. code-block:: sh - - py -3 -m pip install --user robotpy - - .. group-tab:: Linux/macOS - - On a Linux or macOS system that has pip installed, just run the following command from the Terminal application (may require admin rights): - - .. code-block:: sh - - pip3 install robotpy[all] - - This will install RobotPy with all its optional and vendor packages. - - To upgrade, you can run this: - - .. code-block:: sh - - pip3 install --upgrade robotpy[all] - - If you don't have administrative rights on your computer, either use `virtualenv/virtualenvwrapper `__, or you can install to the user site-packages directory: - - .. code-block:: sh - - pip3 install --user robotpy - - -Visual Studio Code Setup ------------------------- - -The preferred editor is Visual Studio Code, due to the ease of use and some useful Python development tools, such as IntelliSense and Linting. -Download and install the version for your OS `here `__. - -Once installed, access the Extension menu on the left pane. Search for Python and install the official extension from Microsoft. You should restart VS Code once the installation is done. - -From this point, all should be set to create your robot code! You can also `start from a template `__. - - -Troubleshooting ---------------- - -In case the installer fails, please open an issue on the robotpy-wpilib repository. A link is available `here `__. Include the output of the terminal for the failing step. diff --git a/source/docs/zero-to-robot/step-2/wpilib-setup.rst b/source/docs/zero-to-robot/step-2/wpilib-setup.rst index a59f97ad11..98f982cb1a 100644 --- a/source/docs/zero-to-robot/step-2/wpilib-setup.rst +++ b/source/docs/zero-to-robot/step-2/wpilib-setup.rst @@ -1,7 +1,7 @@ WPILib Installation Guide ========================= -This guide is intended for Java and C++ teams. LabVIEW teams can skip to :doc:`labview-setup` and Python teams can skip to :doc:`python-setup`. Additionally, the below tutorial shows Windows 10, but the steps are identical for all operating systems. Notes differentiating operating systems will be shown. +This guide is intended for Java, C++ and Python teams. LabVIEW teams can skip to :doc:`labview-setup`. Additionally, the below tutorial shows Windows 10, but the steps are identical for all operating systems. Notes differentiating operating systems will be shown. Prerequisites ------------- @@ -15,6 +15,16 @@ Supported Operating Systems and Architectures: WPILib is designed to install to different folders for different years, so that it is not necessary to uninstall a previous version before installing this year's WPILib. +.. note:: + **For Python users** + + Python 3.8 or higher must be installed + * `Python for Windows `__ + * `Python for macOS `__ + * Python should already be installed for Linux users + + All WPILib code is currently accessible through the Python Package :guilabel:`RobotPy`. updating the RobotPy version will overwrite the previously installed one. Consider using `venv `__ if you want to keep distinct versions. + Downloading ----------- @@ -154,6 +164,61 @@ Some operating systems require some final action to complete installation. .. note:: Installing desktop tools and rebooting will create a folder on the desktop called ``YYYY WPILib Tools``, where ``YYYY`` is the current year. Desktop tool shortcuts are not available on Linux and macOS. + +Additional Steps for Python Installation +---------------------------------------- + +.. tabs:: + + .. group-tab:: Windows 10+ + + Run the following command from cmd or Powershell to install RobotPy with all its optional and vendor packages: + + .. code-block:: sh + + py -3 -m pip install robotpy[all] + + To upgrade, you can run this: + + .. code-block:: sh + + py -3 -m pip install --upgrade robotpy[all] + + If you don't have administrative rights on your computer, either use `venv `__, or you can install to the user site-packages directory: + + .. code-block:: sh + + py -3 -m pip install --user robotpy + + .. group-tab:: Linux/macOS + + On a Linux or macOS system that has pip installed, just run the following command from the Terminal application (may require admin rights): + + .. code-block:: sh + + pip3 install robotpy[all] + + This will install RobotPy with all its optional and vendor packages. + + To upgrade, you can run this: + + .. code-block:: sh + + pip3 install --upgrade robotpy[all] + + If you don't have administrative rights on your computer, either use `venv `__, or you can install to the user site-packages directory: + + .. code-block:: sh + + pip3 install --user robotpy + +In VS Code, it is highly recommended to install the official Python extension that offers IntelliSense, Linting and more. + +Access the extension menu on the left pane. Search for Python and install the official extension from Microsoft. + +.. image:: images/wpilib-setup/python-ext.png + :alt: Access VS Code Extension menu, search for python and install the official Microsoft Python Extension. + Additional C++ Installation for Simulation ------------------------------------------ @@ -217,4 +282,4 @@ WPILib is designed to install to different folders for different years, so that Troubleshooting --------------- -In case the installer fails, please open an issue on the installer repository. A link is available `here `__. The installer should give a message on the cause of the error, please include this in the description of your issue. +In case the installer fails, please open an issue on the installer repository. Links are available `here (C++/Java) `__ and `here (Python) `__. The installer should give a message on the cause of the error, please include this in the description of your issue. diff --git a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst index e482b6f67b..30cca74a2d 100644 --- a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst +++ b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst @@ -1,37 +1,47 @@ -Creating your Test Drivetrain Program (C++/Java) -================================================ +Creating your Test Drivetrain Program (C++/Java/Python) +======================================================= -Once everything is installed, we're ready to create a robot program. WPILib comes with several templates for robot programs. Use of these templates is highly recommended for new users; however, advanced users are free to write their own robot code from scratch. This article walks through creating a project from one of the provided examples which has some code already written to drive a basic robot. +Once everything is installed, we're ready to create a robot program. WPILib comes with several templates for robot programs. Use of these templates is highly recommended for new users; however, advanced users are free to write their own robot code from scratch. This article walks through creating a project from one of the provided examples which has some code already written to drive a basic robot. -.. important:: This guide includes code examples that involve vendor hardware for the convenience of the user. In this document, PWM refers to the motor controller included in the KOP. The CTRE tab references the Talon FX motor controller (Falcon 500 motor), but usage is similar for TalonSRX and VictorSPX. The REV tab references the CAN SPARK MAX controlling a brushless motor, but it's similar for brushed motor. There is an assumption that the user has already installed the required :doc:`vendordeps ` and configured the device(s) (update firmware, assign CAN IDs, etc) according to the manufacturer documentation (`CTRE `__ `REV `__). +.. important:: This guide includes code examples that involve vendor hardware for the convenience of the user. In this document, PWM refers to the motor controller included in the KOP. The CTRE tab references the Talon FX motor controller (Falcon 500 motor), but usage is similar for TalonSRX and VictorSPX. The REV tab references the CAN SPARK MAX controlling a brushless motor, but it's similar for brushed motor. There is an assumption that the user has already installed the required :doc:`vendordeps ` (for C++ and Java) and configured the device(s) (update firmware, assign CAN IDs, etc) according to the manufacturer documentation (`CTRE `__ `REV `__). Creating a New WPILib Project ----------------------------- -Bring up the Visual Studio Code command palette with :kbd:`Ctrl+Shift+P`. Then, type "WPILib" into the prompt. Since all WPILib commands start with "WPILib", this will bring up the list of WPILib-specific VS Code commands. Now, select the "Create a new project" command: +.. tabs:: + + .. group-tab:: C++/Java + + Bring up the Visual Studio Code command palette with :kbd:`Ctrl+Shift+P`. Then, type "WPILib" into the prompt. Since all WPILib commands start with "WPILib", this will bring up the list of WPILib-specific VS Code commands. Now, select the "Create a new project" command: + + .. image:: /docs/software/vscode-overview/images/creating-robot-program/create-new-project.png + :alt: Choose "WPILib: Create a new project". -.. image:: /docs/software/vscode-overview/images/creating-robot-program/create-new-project.png - :alt: Choose "WPILib: Create a new project". + This will bring up the "New Project Creator Window:" -This will bring up the "New Project Creator Window:" + .. image:: /docs/software/vscode-overview/images/creating-robot-program/new-project-creator.png + :alt: The different parts of the new project creation window. -.. image:: /docs/software/vscode-overview/images/creating-robot-program/new-project-creator.png - :alt: The different parts of the new project creation window. + The elements of the New Project Creator Window are explained below: -The elements of the New Project Creator Window are explained below: + 1. **Project Type**: The kind of project we wish to create. For this example, select **Example** + 2. **Language**: This is the language (C++ or Java) that will be used for this project. + 3. **Project Base**: This box is used to select the base class or example to generate the project from. For this example, select **Getting Started** + 4. **Base Folder**: This determines the folder in which the robot project will be located. + 5. **Project Name**: The name of the robot project. This also specifies the name that the project folder will be given if the Create New Folder box is checked. + 6. **Create a New Folder**: If this is checked, a new folder will be created to hold the project within the previously-specified folder. If it is *not* checked, the project will be located directly in the previously-specified folder. An error will be thrown if the folder is not empty and this is not checked. project folder will be given if the Create New Folder box is checked. + 7. **Team Number**: The team number for the project, which will be used for package names within the project and to locate the robot when deploying code. + 8. **Enable Desktop Support**: Enables unit test and simulation. While WPILib supports this, third party software libraries may not. If libraries do not support desktop, then your code may not compile or may crash. It should be left unchecked unless unit testing or simulation is needed and all libraries support it. For this example, do not check this box. -1. **Project Type**: The kind of project we wish to create. For this example, select **Example** -2. **Language**: This is the language (C++ or Java) that will be used for this project. -3. **Project Base**: This box is used to select the base class or example to generate the project from. For this example, select **Getting Started** -4. **Base Folder**: This determines the folder in which the robot project will be located. -5. **Project Name**: The name of the robot project. This also specifies the name that the project folder will be given if the Create New Folder box is checked. -6. **Create a New Folder**: If this is checked, a new folder will be created to hold the project within the previously-specified folder. If it is *not* checked, the project will be located directly in the previously-specified folder. An error will be thrown if the folder is not empty and this is not checked. project folder will be given if the Create New Folder box is checked. -7. **Team Number**: The team number for the project, which will be used for package names within the project and to locate the robot when deploying code. -8. **Enable Desktop Support**: Enables unit test and simulation. While WPILib supports this, third party software libraries may not. If libraries do not support desktop, then your code may not compile or may crash. It should be left unchecked unless unit testing or simulation is needed and all libraries support it. For this example, do not check this box. + Once all the above have been configured, click "Generate Project" and the robot project will be created. -Once all the above have been configured, click "Generate Project" and the robot project will be created. + .. note:: Any errors in project generation will appear in the bottom right-hand corner of the screen. -.. note:: Any errors in project generation will appear in the bottom right-hand corner of the screen. + .. group-tab:: Python + + Create a new folder and in this folder create a file named :guilabel:`robot.py`. + + If you start from a `template `__, replace the robot.py file with the template one and add all other files. Opening The New Project ----------------------- @@ -49,7 +59,7 @@ Click :guilabel:`Yes I trust the authors`. Once opened we will see the project hierarchy on the left. Double clicking on the file will open that file in the editor. .. image:: /docs/software/vscode-overview/images/creating-robot-program/opened-robot-project.png - :alt: The robot.java code shown after opening a new project. + :alt: The robot.java code shown after opening a new project. C++ Configurations (C++ Only) ----------------------------- @@ -59,6 +69,33 @@ For C++ projects, there is one more step to set up IntelliSense. Whenever we op .. image:: /docs/software/vscode-overview/images/importing-previous-project/cpp-configurations.png :alt: You must choose "Yes" to refresh the C++ configurations. +Basic Drivetrain example +------------------------ + +First, here is what a simple code can look like for a Drivetrain with PWM controlled motors (such as SparkMax). + +.. tabs:: + + .. group-tab:: Java + + .. remoteliteralinclude:: https://raw.githubusercontent.com/wpilibsuite/allwpilib/v2023.4.3/wpilibjExamples/src/main/java/edu/wpi/first/wpilibj/examples/gettingstarted/Robot.java + :language: java + :linenos: + + .. group-tab:: C++ + + .. remoteliteralinclude:: https://raw.githubusercontent.com/wpilibsuite/allwpilib/v2023.4.3/wpilibcExamples/src/main/cpp/examples/GettingStarted/cpp/Robot.cpp + :language: c++ + :linenos: + + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :linenos: + +Now let's look at various parts of the code. + Imports/Includes ---------------- @@ -84,6 +121,14 @@ Imports/Includes :linenos: :lineno-start: 5 + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 8-9 + :linenos: + :lineno-start: 8 + .. group-tab:: CTRE .. tabs:: @@ -108,6 +153,14 @@ Imports/Includes #include #include + .. group-tab:: Python + + .. code-block:: python + + import wpilib # Used to get the joysticks + import wpilib.drive # Used for the DifferentialDrive class + import ctre # CTRE library + .. group-tab:: REV .. tabs:: @@ -136,7 +189,15 @@ Imports/Includes #include -Our code needs to reference the components of WPILib that are used. In C++ this is accomplished using ``#include`` statements; in Java it is done with ``import`` statements. The program references classes for ``Joystick`` (for driving), ``PWMSparkMax`` / ``WPI_TalonFX`` / ``CANSparkMax (for controlling motors), ``TimedRobot`` (the base class used for the example), ``Timer`` (used for autonomous), and ``DifferentialDrive`` (for connecting the joystick control to the motors). + .. group-tab:: Python + + .. code-block:: python + + import wpilib # Used to get the joysticks + import wpilib.drive # Used for the DifferentialDrive class + import rev # REV library + +Our code needs to reference the components of WPILib that are used. In C++ this is accomplished using ``#include`` statements; in Java and Python it is done with ``import`` statements. The program references classes for ``Joystick`` (for driving), ``PWMSparkMax`` / ``WPI_TalonFX`` / ``CANSparkMax (for controlling motors), ``TimedRobot`` (the base class used for the example), ``Timer`` (used for autonomous), and ``DifferentialDrive`` (for connecting the joystick control to the motors). Defining the variables for our sample robot ------------------------------------------- @@ -169,6 +230,14 @@ Defining the variables for our sample robot :linenos: :lineno-start: 50 + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :linenos: + :lines: 12-29 + :lineno-start: 12 + .. group-tab:: CTRE .. tabs:: @@ -209,6 +278,14 @@ Defining the variables for our sample robot frc::Joystick m_stick{0}; frc::Timer m_timer; + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-ctre/main/examples/getting-started/robot.py + :language: python + :linenos: + :lines: 13-30 + :lineno-start: 13 + .. group-tab:: REV .. tabs:: @@ -248,6 +325,14 @@ Defining the variables for our sample robot frc::XboxController m_controller{0}; frc::Timer m_timer; + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-rev/main/examples/getting-started/robot.py + :language: python + :linenos: + :lines: 13-30 + :lineno-start: 13 + The sample robot in our examples will have a joystick on USB port 0 for arcade drive and two motors on PWM ports 0 and 1 (Vendor examples use CAN with IDs 1 and 2). Here we create objects of type DifferentialDrive (m_robotDrive), Joystick (m_stick) and Timer (m_timer). This section of the code does three things: 1. Defines the variables as members of our Robot class. @@ -269,6 +354,10 @@ Robot Initialization void RobotInit() {} + .. code-tab:: python + + def robotInit(self): + The ``RobotInit`` method is run when the robot program is starting up, but after the constructor. The ``RobotInit`` for our sample program doesn't do anything. If we wanted to run something here we could provide the code above to override the default). @@ -293,6 +382,14 @@ Simple Autonomous Example :linenos: :lineno-start: 22 + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 31-43 + :linenos: + :lineno-start: 31 + The ``AutonomousInit`` method is run once each time the robot transitions to autonomous from another mode. In this program, we restart the ``Timer`` in this method. ``AutonomousPeriodic`` is run once every period while the robot is in autonomous mode. In the ``TimedRobot`` class the period is a fixed time, which defaults to 20ms. In this example, the periodic code checks if the timer is less than 2 seconds and if so, drives forward at half speed using the ``ArcadeDrive`` method of the ``DifferentialDrive`` class. If more than 2 seconds has elapsed, the code stops the robot drive. @@ -318,6 +415,14 @@ Joystick Control for Teleoperation :linenos: :lineno-start: 35 + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 45-52 + :linenos: + :lineno-start: 45 + Like in Autonomous, the Teleop mode has a ``TeleopInit`` and ``TeleopPeriodic`` function. In this example we don't have anything to do in ``TeleopInit``, it is provided for illustration purposes only. In ``TeleopPeriodic``, the code uses the ``ArcadeDrive`` method to map the Y-axis of the ``Joystick`` to forward/back motion of the drive motors and the X-axis to turning motion. Test Mode @@ -341,6 +446,14 @@ Test Mode :linenos: :lineno-start: 43 + .. group-tab:: Python + + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + :language: python + :lines: 54-58 + :linenos: + :lineno-start: 54 + Test Mode is used for testing robot functionality. Similar to ``TeleopInit``, the ``TestInit`` and ``TestPeriodic`` methods are provided here for illustrative purposes only. Deploying the Project to a Robot diff --git a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst deleted file mode 100644 index a6b8235b0c..0000000000 --- a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-python.rst +++ /dev/null @@ -1,153 +0,0 @@ -Creating your Test Drivetrain Program (Python) -============================================== - -Once everything is installed, we're ready to create a robot program. RobotPy comes with several templates for robot programs. Use of these templates is highly recommended for new users; however, advanced users are free to write their own robot code from scratch. This article walks through creating a project from one of the provided examples which has some code already written to drive a basic robot. - -.. important:: This guide includes code examples that involve vendor hardware for the convenience of the user. In this document, PWM refers to the motor controller included in the KOP. The CTRE tab references the Talon FX motor controller (Falcon 500 motor), but usage is similar for TalonSRX and VictorSPX. The REV tab references the CAN SPARK MAX controlling a brushless motor, but it's similar for brushed motor. Using the :guilabel:`pip install robotpy[all]` during installation includes all vendor Python modules. There is an assumption that the user has already configured the device(s) (update firmware, assign CAN IDs, etc) according to the manufacturer documentation (`CTRE `__ `REV `__). - -Creating a New Project ----------------------- - -Create a new folder and in this folder create a file named :guilabel:`robot.py`. -Open Visual Studio Code and from the File menu and click on Open Folder. From there, select and open the newly created folder. - -If you start from a `template `__, replace the robot.py file with the template one and add all other files. - -VS Code might show you this window: - -.. image:: /docs/software/vscode-overview/images/creating-robot-program/trusted-workspace.png - :alt: Trusted Workspace dialog in VS Code. - -Click :guilabel:`Yes I trust the authors`. - -Once opened we will see the project hierarchy on the left. Double clicking on the file will open that file in the editor. - - -Basic code structure --------------------- - -First, here is what a simple code can look like. - -.. tabs:: - - .. group-tab:: PWM - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py - :language: python - :linenos: - - .. group-tab:: CTRE - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-rev/main/examples/getting-started/robot.py - :language: python - :linenos: - - .. group-tab:: REV - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-ctre/main/examples/getting-started/robot.py - :language: python - :linenos: - -Now let's see the various parts of the code - -Imports -------- - -The first lines found in a Python file should be the **import** of the various needed modules. - -.. tabs:: - - .. group-tab:: PWM - - .. code-block:: python - - import wpilib # Used to get the joysticks - import wpilib.drive # Used for the DifferentialDrive class and the PWM motor - - .. group-tab:: CTRE - - .. code-block:: python - - import wpilib # Used to get the joysticks - import wpilib.drive # Used for the DifferentialDrive class - import ctre # CTRE library - - .. group-tab:: REV - - .. code-block:: python - - import wpilib # Used to get the joysticks - import wpilib.drive # Used for the DifferentialDrive class - import rev # REV library - - -The actual imports will vary depending on the needed libraries. Shoud you need to access the NAVX library, you would add the ``import navx`` line. - -Defining the variables for our sample robot -------------------------------------------- - -Your variables should be defined under the :guilabel:`def robotInit(self):` method. - -.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py - :language: python - :linenos: - :lines: 12-29 - :lineno-start: 12 - -The sample robot in our examples will have a joystick on USB port 0 for arcade drive and two motors on PWM ports 0 and 1 (Vendor examples use CAN with IDs 1 and 2). Here we create objects of type DifferentialDrive (self.robotDrive), XboxController (self.controller) and Timer (self.timer). This section of the code does three things: - -1. Defines the variables as members of our Robot class. -2. Initializes the variables. - -.. note:: The ``Timer`` is used for the autonomous mode. - -Robot Initialization --------------------- - -.. code-block:: python - - if __name__ == "__main__": - wpilib.run(MyRobot) - -The ``wpilib.run(MyRobot)`` method is run when the robot program is starting up, but after the constructor. - -Simple Autonomous Example -------------------------- - -.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py - :language: python - :lines: 31-43 - :linenos: - :lineno-start: 31 - -The ``autonomousInit`` method is run once each time the robot transitions to autonomous from another mode. In this program, we restart the ``Timer`` in this method. - -``autonomousPeriodic`` is run once every period while the robot is in autonomous mode. In the ``TimedRobot`` class the period is a fixed time, which defaults to 20ms. In this example, the periodic code checks if the timer is less than 2 seconds and if so, drives forward at half speed using the ``ArcadeDrive`` method of the ``DifferentialDrive`` class. If more than 2 seconds has elapsed, the code stops the robot drive. - -Joystick Control for Teleoperation ----------------------------------- - -.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py - :language: python - :lines: 45-52 - :linenos: - :lineno-start: 45 - - -Like in Autonomous, the Teleop mode has a ``teleopInit`` and ``teleopPeriodic`` function. In this example we don't have anything to do in ``teleopInit``, it is provided for illustration purposes only. In ``teleopPeriodic``, the code uses the ``arcadeDrive`` method to map the Y-axis of the ``Joystick`` to forward/back motion of the drive motors and the X-axis to turning motion. - -Test Mode ---------- - -.. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py - :language: python - :lines: 54-58 - :linenos: - :lineno-start: 54 - -Test Mode is used for testing robot functionality. Similar to ``teleopInit``, the ``testInit`` and ``testPeriodic`` methods are provided here for illustrative purposes only. - -Deploying the Project to a Robot --------------------------------- - -Please see the instructions :ref:`here ` for deploying the program onto a robot. diff --git a/source/docs/zero-to-robot/step-4/index.rst b/source/docs/zero-to-robot/step-4/index.rst index e781cf0c54..678e8cd82c 100644 --- a/source/docs/zero-to-robot/step-4/index.rst +++ b/source/docs/zero-to-robot/step-4/index.rst @@ -6,5 +6,4 @@ Step 4: Programming your Robot creating-test-drivetrain-program-labview creating-test-drivetrain-program-cpp-java - creating-test-drivetrain-program-python running-test-program diff --git a/source/docs/zero-to-robot/step-4/running-test-program.rst b/source/docs/zero-to-robot/step-4/running-test-program.rst index 7a7538f098..97d2c7ca80 100644 --- a/source/docs/zero-to-robot/step-4/running-test-program.rst +++ b/source/docs/zero-to-robot/step-4/running-test-program.rst @@ -8,7 +8,7 @@ Overview You should create and download a Test Program as described for your programming language: -:doc:`C++/Java ` +:doc:`C++/Java/Python ` :doc:`LabVIEW ` diff --git a/source/index.rst b/source/index.rst index 79771f7195..7a0f201938 100644 --- a/source/index.rst +++ b/source/index.rst @@ -220,6 +220,15 @@ Community translations can be found in a variety of languages in the bottom-left C++ + .. button-link:: https://robotpy.readthedocs.io/projects/wpilib/en/stable/api.html + :color: primary + :shadow: + :align: center + :expand: + :outline: + + Python + .. grid-item-card:: :class-header: sd-bg-info sd-text-white @@ -331,7 +340,6 @@ Community translations can be found in a variety of languages in the bottom-left docs/software/dashboards/index docs/software/telemetry/index docs/software/labview/index - docs/software/python/index docs/software/hardware-apis/index docs/software/can-devices/index docs/software/basic-programming/index @@ -345,6 +353,7 @@ Community translations can be found in a variety of languages in the bottom-left WPILib Java API Docs WPILib C++ API Docs + WPILib Python API Docs .. toctree:: :maxdepth: 1 diff --git a/source/stubs/api-docs-stub.rst b/source/stubs/api-docs-stub.rst index 9a1bf7fb69..373c701b40 100644 --- a/source/stubs/api-docs-stub.rst +++ b/source/stubs/api-docs-stub.rst @@ -11,3 +11,4 @@ Java and CSS class documentation. WPILib Java API Docs WPILib C++ API Docs + WPILib Python API Docs diff --git a/source/stubs/programming-basics-stub.rst b/source/stubs/programming-basics-stub.rst index cac51169ad..fc02ca5e77 100644 --- a/source/stubs/programming-basics-stub.rst +++ b/source/stubs/programming-basics-stub.rst @@ -13,7 +13,6 @@ Documentation that is useful throughout a team’s programming process. /docs/software/vscode-overview/index /docs/software/dashboards/index /docs/software/labview/index - /docs/software/python/index /docs/software/hardware-apis/index /docs/software/can-devices/index /docs/software/basic-programming/index From a725de594f5181fa6b2142faa2e19faa6eb4e2db Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Thu, 14 Sep 2023 21:35:32 -0400 Subject: [PATCH 6/7] Moved Python installation to step-3; Changed links to git hash --- source/docs/software/roborio-info/index.rst | 1 - .../vscode-overview/deploying-robot-code.rst | 2 +- source/docs/zero-to-robot/step-3/index.rst | 1 + .../step-3/installing-robotpy.rst} | 8 +++++--- ...creating-test-drivetrain-program-cpp-java.rst | 16 ++++++++-------- 5 files changed, 15 insertions(+), 13 deletions(-) rename source/docs/{software/roborio-info/roborio-robotpy.rst => zero-to-robot/step-3/installing-robotpy.rst} (87%) diff --git a/source/docs/software/roborio-info/index.rst b/source/docs/software/roborio-info/index.rst index 5fe934667b..903c7c831f 100644 --- a/source/docs/software/roborio-info/index.rst +++ b/source/docs/software/roborio-info/index.rst @@ -11,6 +11,5 @@ roboRIO roborio-ftp roborio-ssh roborio-brownouts - roborio-robotpy recovering-a-roborio-using-safe-mode Additional Help diff --git a/source/docs/software/vscode-overview/deploying-robot-code.rst b/source/docs/software/vscode-overview/deploying-robot-code.rst index 43364be76c..6cd6434adf 100644 --- a/source/docs/software/vscode-overview/deploying-robot-code.rst +++ b/source/docs/software/vscode-overview/deploying-robot-code.rst @@ -25,7 +25,7 @@ Building and Deploying Robot Code .. group-tab:: Python - .. note:: Before deploying the code to your robot, you must start by :ref:`installing RobotPy on your roboRIO ` + .. note:: Before deploying the code to your robot, you must start by :ref:`installing RobotPy on your roboRIO ` To deploy code to your robot, you can simply run the following command and it will upload the code and start it immediately. diff --git a/source/docs/zero-to-robot/step-3/index.rst b/source/docs/zero-to-robot/step-3/index.rst index d1ad0a6573..eae1e81ecc 100644 --- a/source/docs/zero-to-robot/step-3/index.rst +++ b/source/docs/zero-to-robot/step-3/index.rst @@ -7,3 +7,4 @@ Step 3: Preparing Your Robot roborio2-imaging imaging-your-roborio radio-programming + installing-robotpy diff --git a/source/docs/software/roborio-info/roborio-robotpy.rst b/source/docs/zero-to-robot/step-3/installing-robotpy.rst similarity index 87% rename from source/docs/software/roborio-info/roborio-robotpy.rst rename to source/docs/zero-to-robot/step-3/installing-robotpy.rst index a063623437..6dd6a8450e 100644 --- a/source/docs/software/roborio-info/roborio-robotpy.rst +++ b/source/docs/zero-to-robot/step-3/installing-robotpy.rst @@ -2,13 +2,15 @@ RobotPy installation on roboRIO =============================== +.. note:: Only needed if you plan to program your robot using Python. + Python libraries are not installed on the roboRIO by default. Each time you format the robotRIO or that you install/update a Python module with :guilabel:`pip install robotpy...`, make sure to run these steps again. If you install RobotPy on your roboRIO, you are still able to deploy C++ and Java programs without any conflicts. -.. warning:: This guide assumes that your roboRIO has the current legal roboRIO image installed. If you haven't done this yet, see :ref:`the WPILib documentation ` for imaging instructions. To image the roboRIO for RobotPy, you only need to have the latest FRC Game Tools installed. +.. warning:: This guide assumes that your roboRIO has the current legal roboRIO image installed. If you haven't done this yet, see the imaging instructions for the :ref:`roboRIO 1 ` or :ref:`roboRIO 2 `. To image the roboRIO for RobotPy, you only need to have the latest FRC Game Tools installed. -RobotPy is truly cross platform, and can be installed from Windows, most Linux distributions, and from Mac macOS also. To install/use the installer, you must have Python 3.7+ installed. You should install the installer via pip (requires internet access) by installing the core RobotPy components (see the :ref:`WPILib Installation Guide ` for more details). +RobotPy is truly cross platform, and can be installed from Windows, most Linux distributions, and from Mac macOS also. To install/use the installer, you must have Python 3.8+ installed. You should install the installer via pip (requires internet access) by installing the core RobotPy components (see the :ref:`WPILib Installation Guide ` for more details). Install process --------------- @@ -25,7 +27,7 @@ Install Python on a roboRIO .. note:: This step only needs to be done once. -Installing Python and the RobotPy packages are separated into two different steps. Once you are connected to the internet, you can run this to download Python for roboRIO onto your computer. +When your computer is connected to Internet, run this next step. .. tabs:: diff --git a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst index 30cca74a2d..00443f9850 100644 --- a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst +++ b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst @@ -90,7 +90,7 @@ First, here is what a simple code can look like for a Drivetrain with PWM contro .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py :language: python :linenos: @@ -123,7 +123,7 @@ Imports/Includes .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py :language: python :lines: 8-9 :linenos: @@ -232,7 +232,7 @@ Defining the variables for our sample robot .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py :language: python :linenos: :lines: 12-29 @@ -280,7 +280,7 @@ Defining the variables for our sample robot .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-ctre/main/examples/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-ctre/5b8d33f/examples/getting-started/robot.py :language: python :linenos: :lines: 13-30 @@ -327,7 +327,7 @@ Defining the variables for our sample robot .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-rev/main/examples/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-rev/bc3ebc4/examples/getting-started/robot.py :language: python :linenos: :lines: 13-30 @@ -384,7 +384,7 @@ Simple Autonomous Example .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py :language: python :lines: 31-43 :linenos: @@ -417,7 +417,7 @@ Joystick Control for Teleoperation .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py :language: python :lines: 45-52 :linenos: @@ -448,7 +448,7 @@ Test Mode .. group-tab:: Python - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/main/getting-started/robot.py + .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py :language: python :lines: 54-58 :linenos: From 20ea635f0d1bd11ba075be4f4417d48684dbf942 Mon Sep 17 00:00:00 2001 From: Martin Rioux Date: Sun, 17 Sep 2023 16:17:22 -0400 Subject: [PATCH 7/7] Moved the code examples out of this branch to focus on integrating Python's setup --- ...ating-test-drivetrain-program-cpp-java.rst | 103 ------------------ .../step-4/running-test-program.rst | 2 +- 2 files changed, 1 insertion(+), 104 deletions(-) diff --git a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst index 00443f9850..048d7dc82e 100644 --- a/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst +++ b/source/docs/zero-to-robot/step-4/creating-test-drivetrain-program-cpp-java.rst @@ -69,33 +69,6 @@ For C++ projects, there is one more step to set up IntelliSense. Whenever we op .. image:: /docs/software/vscode-overview/images/importing-previous-project/cpp-configurations.png :alt: You must choose "Yes" to refresh the C++ configurations. -Basic Drivetrain example ------------------------- - -First, here is what a simple code can look like for a Drivetrain with PWM controlled motors (such as SparkMax). - -.. tabs:: - - .. group-tab:: Java - - .. remoteliteralinclude:: https://raw.githubusercontent.com/wpilibsuite/allwpilib/v2023.4.3/wpilibjExamples/src/main/java/edu/wpi/first/wpilibj/examples/gettingstarted/Robot.java - :language: java - :linenos: - - .. group-tab:: C++ - - .. remoteliteralinclude:: https://raw.githubusercontent.com/wpilibsuite/allwpilib/v2023.4.3/wpilibcExamples/src/main/cpp/examples/GettingStarted/cpp/Robot.cpp - :language: c++ - :linenos: - - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py - :language: python - :linenos: - -Now let's look at various parts of the code. - Imports/Includes ---------------- @@ -121,14 +94,6 @@ Imports/Includes :linenos: :lineno-start: 5 - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py - :language: python - :lines: 8-9 - :linenos: - :lineno-start: 8 - .. group-tab:: CTRE .. tabs:: @@ -153,14 +118,6 @@ Imports/Includes #include #include - .. group-tab:: Python - - .. code-block:: python - - import wpilib # Used to get the joysticks - import wpilib.drive # Used for the DifferentialDrive class - import ctre # CTRE library - .. group-tab:: REV .. tabs:: @@ -189,14 +146,6 @@ Imports/Includes #include - .. group-tab:: Python - - .. code-block:: python - - import wpilib # Used to get the joysticks - import wpilib.drive # Used for the DifferentialDrive class - import rev # REV library - Our code needs to reference the components of WPILib that are used. In C++ this is accomplished using ``#include`` statements; in Java and Python it is done with ``import`` statements. The program references classes for ``Joystick`` (for driving), ``PWMSparkMax`` / ``WPI_TalonFX`` / ``CANSparkMax (for controlling motors), ``TimedRobot`` (the base class used for the example), ``Timer`` (used for autonomous), and ``DifferentialDrive`` (for connecting the joystick control to the motors). Defining the variables for our sample robot @@ -230,14 +179,6 @@ Defining the variables for our sample robot :linenos: :lineno-start: 50 - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py - :language: python - :linenos: - :lines: 12-29 - :lineno-start: 12 - .. group-tab:: CTRE .. tabs:: @@ -278,14 +219,6 @@ Defining the variables for our sample robot frc::Joystick m_stick{0}; frc::Timer m_timer; - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-ctre/5b8d33f/examples/getting-started/robot.py - :language: python - :linenos: - :lines: 13-30 - :lineno-start: 13 - .. group-tab:: REV .. tabs:: @@ -325,14 +258,6 @@ Defining the variables for our sample robot frc::XboxController m_controller{0}; frc::Timer m_timer; - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/robotpy-rev/bc3ebc4/examples/getting-started/robot.py - :language: python - :linenos: - :lines: 13-30 - :lineno-start: 13 - The sample robot in our examples will have a joystick on USB port 0 for arcade drive and two motors on PWM ports 0 and 1 (Vendor examples use CAN with IDs 1 and 2). Here we create objects of type DifferentialDrive (m_robotDrive), Joystick (m_stick) and Timer (m_timer). This section of the code does three things: 1. Defines the variables as members of our Robot class. @@ -354,10 +279,6 @@ Robot Initialization void RobotInit() {} - .. code-tab:: python - - def robotInit(self): - The ``RobotInit`` method is run when the robot program is starting up, but after the constructor. The ``RobotInit`` for our sample program doesn't do anything. If we wanted to run something here we could provide the code above to override the default). @@ -382,14 +303,6 @@ Simple Autonomous Example :linenos: :lineno-start: 22 - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py - :language: python - :lines: 31-43 - :linenos: - :lineno-start: 31 - The ``AutonomousInit`` method is run once each time the robot transitions to autonomous from another mode. In this program, we restart the ``Timer`` in this method. ``AutonomousPeriodic`` is run once every period while the robot is in autonomous mode. In the ``TimedRobot`` class the period is a fixed time, which defaults to 20ms. In this example, the periodic code checks if the timer is less than 2 seconds and if so, drives forward at half speed using the ``ArcadeDrive`` method of the ``DifferentialDrive`` class. If more than 2 seconds has elapsed, the code stops the robot drive. @@ -415,14 +328,6 @@ Joystick Control for Teleoperation :linenos: :lineno-start: 35 - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py - :language: python - :lines: 45-52 - :linenos: - :lineno-start: 45 - Like in Autonomous, the Teleop mode has a ``TeleopInit`` and ``TeleopPeriodic`` function. In this example we don't have anything to do in ``TeleopInit``, it is provided for illustration purposes only. In ``TeleopPeriodic``, the code uses the ``ArcadeDrive`` method to map the Y-axis of the ``Joystick`` to forward/back motion of the drive motors and the X-axis to turning motion. Test Mode @@ -446,14 +351,6 @@ Test Mode :linenos: :lineno-start: 43 - .. group-tab:: Python - - .. remoteliteralinclude:: https://raw.githubusercontent.com/robotpy/examples/c616f00/getting-started/robot.py - :language: python - :lines: 54-58 - :linenos: - :lineno-start: 54 - Test Mode is used for testing robot functionality. Similar to ``TeleopInit``, the ``TestInit`` and ``TestPeriodic`` methods are provided here for illustrative purposes only. Deploying the Project to a Robot diff --git a/source/docs/zero-to-robot/step-4/running-test-program.rst b/source/docs/zero-to-robot/step-4/running-test-program.rst index 97d2c7ca80..7a7538f098 100644 --- a/source/docs/zero-to-robot/step-4/running-test-program.rst +++ b/source/docs/zero-to-robot/step-4/running-test-program.rst @@ -8,7 +8,7 @@ Overview You should create and download a Test Program as described for your programming language: -:doc:`C++/Java/Python ` +:doc:`C++/Java ` :doc:`LabVIEW `