<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://trcnet.asuscomm.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mikets</id>
	<title>TrcWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://trcnet.asuscomm.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mikets"/>
	<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Special:Contributions/Mikets"/>
	<updated>2026-04-24T12:14:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=722</id>
		<title>FTC2024-2025: IntoTheDeep</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=722"/>
		<updated>2025-01-15T08:56:38Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Season Recap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Game Resources ==&lt;br /&gt;
* [[Media:Ftc2024-2025GameManual.pdf|Game Manual]]&lt;br /&gt;
* [https://github.com/trc492/Ftc2025IntoTheDeep Code Repository]&lt;br /&gt;
* [[Media:Ftc2024-2025EngineeringPortfolio.pdf|Engineering Portfolio]]&lt;br /&gt;
&lt;br /&gt;
== Season Recap ==&lt;br /&gt;
[[Media:Ftc2024-2025WrapupMeeting.pdf|Season Wrap Up Meeting]]&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=721</id>
		<title>FTC2024-2025: IntoTheDeep</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=721"/>
		<updated>2025-01-15T08:55:55Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Season Recap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Game Resources ==&lt;br /&gt;
* [[Media:Ftc2024-2025GameManual.pdf|Game Manual]]&lt;br /&gt;
* [https://github.com/trc492/Ftc2025IntoTheDeep Code Repository]&lt;br /&gt;
* [[Media:Ftc2024-2025EngineeringPortfolio.pdf|Engineering Portfolio]]&lt;br /&gt;
&lt;br /&gt;
== Season Recap ==&lt;br /&gt;
[[Media:Ftc2024-2025WrapupMeeting.pdf|Engineering Portfolio]]&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=File:Ftc2024-2025WrapupMeeting.pdf&amp;diff=720</id>
		<title>File:Ftc2024-2025WrapupMeeting.pdf</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=File:Ftc2024-2025WrapupMeeting.pdf&amp;diff=720"/>
		<updated>2025-01-15T08:54:54Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=719</id>
		<title>FTC2024-2025: IntoTheDeep</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=719"/>
		<updated>2025-01-15T08:49:55Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Season Recap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Game Resources ==&lt;br /&gt;
* [[Media:Ftc2024-2025GameManual.pdf|Game Manual]]&lt;br /&gt;
* [https://github.com/trc492/Ftc2025IntoTheDeep Code Repository]&lt;br /&gt;
* [[Media:Ftc2024-2025EngineeringPortfolio.pdf|Engineering Portfolio]]&lt;br /&gt;
&lt;br /&gt;
== Season Recap ==&lt;br /&gt;
&amp;lt;embed&amp;gt;Media:Ftc2024-2025WrapupMeeting.pptx&amp;lt;/embed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Works Well? ===&lt;br /&gt;
&lt;br /&gt;
=== What Needs Improvement? ===&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=File:Ftc2024-2025EngineeringPortfolio.pdf&amp;diff=717</id>
		<title>File:Ftc2024-2025EngineeringPortfolio.pdf</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=File:Ftc2024-2025EngineeringPortfolio.pdf&amp;diff=717"/>
		<updated>2025-01-14T08:31:54Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=716</id>
		<title>FTC2024-2025: IntoTheDeep</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=FTC2024-2025:_IntoTheDeep&amp;diff=716"/>
		<updated>2025-01-14T08:04:28Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Game Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Game Resources ==&lt;br /&gt;
* [[Media:Ftc2024-2025GameManual.pdf|Game Manual]]&lt;br /&gt;
* [https://github.com/trc492/Ftc2025IntoTheDeep Code Repository]&lt;br /&gt;
* [[Media:Ftc2024-2025EngineeringPortfolio.pdf|Engineering Portfolio]]&lt;br /&gt;
&lt;br /&gt;
== Season Recap ==&lt;br /&gt;
&lt;br /&gt;
=== What Works Well? ===&lt;br /&gt;
&lt;br /&gt;
=== What Needs Improvement? ===&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=File:Ftc2024-2025GameManual.pdf&amp;diff=715</id>
		<title>File:Ftc2024-2025GameManual.pdf</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=File:Ftc2024-2025GameManual.pdf&amp;diff=715"/>
		<updated>2025-01-14T07:59:00Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=711</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=711"/>
		<updated>2024-08-18T22:46:12Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 11: Path Following */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** '''setPrimaryMotor''': Set the characteristics of the primary motor.&lt;br /&gt;
*** '''setFollowerMotor''': Set the characteristics of the follower motor if there is one.&lt;br /&gt;
*** '''setLowerLimitSwitch''': Set the characteristics of the lower limit switch if there is one.&lt;br /&gt;
*** '''setUpperLimitSwitch''': Set the characteristics of the upper limit switch if there is one.&lt;br /&gt;
*** '''setExternalEncoder''': Set the characteristics of the external encoder if there is one.&lt;br /&gt;
*** '''setPositionScaleAndOffset''': Set motor position scale and offset for translating to real world units&lt;br /&gt;
*** '''setPositionPresets''': Set position presets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Arm scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Turret scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two shooter motors, optional pan/tilt motor actuators&lt;br /&gt;
***** Set the characteristics of the shooter motor 1&lt;br /&gt;
***** Set the characteristics of the shooter motor 2 if there is one&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Intake Subsystem (one/two motor intake with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two motor Intake with digital/analog sensor.&lt;br /&gt;
*** '''Intake.java''': Create a new class named ''Intake''.&lt;br /&gt;
**** Create the parameters for the Intake: one motor with optional follower motor and a digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set the characteristics of the sensor if there is one&lt;br /&gt;
**** Create the Intake using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Intake object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Intake status: motor power, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Intake in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoIntake ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Grabber Subsystem (one/two servo with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two servo Grabber with digital/analog sensor.&lt;br /&gt;
*** '''Grabber.java''': Create a new class named ''Grabber''.&lt;br /&gt;
**** Create the parameters for the Grabber: one/two servo with optional digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary servo&lt;br /&gt;
***** Set the characteristics of the follower servo if there is one&lt;br /&gt;
***** Set the characteristics of the sensor trigger if there is a sensor&lt;br /&gt;
**** Create the Grabber using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Grabber object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Grabber status: servo position, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Grabber in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoGrabber ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Grabber with servo-controlled claws&lt;br /&gt;
* One or two servos&lt;br /&gt;
* Sensor to detect the presence of game element grabbed&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Drive Base Subsystem ===&lt;br /&gt;
* Introduce Drive Base Subsystem.&lt;br /&gt;
** '''Differential Drive Base'''&lt;br /&gt;
*** 4/6-wheel differential drive train (West Coast Drive).&lt;br /&gt;
*** Non-holonomic drive: 2-DOF (Degrees of Freedom) - Forward/Backward and Turn.&lt;br /&gt;
*** Kinematics: Translate 2-DOF to left and right wheel power.&lt;br /&gt;
** '''Mecanum Drive Base'''&lt;br /&gt;
*** 4-wheel Mecanum wheel drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn.&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers.&lt;br /&gt;
** '''Swerve Drive Base'''&lt;br /&gt;
*** 4-swerve module drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn (all four wheels steerable).&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers as well as steering positions.&lt;br /&gt;
** Exercise: Creating and Controlling a Drive Base.&lt;br /&gt;
*** '''DifferentialDrive.java, MecanumDrive.java, SwerveDrive.java''': No need to create these because the Template code already provides them.&lt;br /&gt;
*** '''RobotParams.java''': Creates the parameters for the Drive Base. A lot of these parameters are already provided because we standardize most of them. Some parameters are specific to the robot base for the season and need to be determined.&lt;br /&gt;
**** Wheel-Base Length and Width: these must be provided for Swerve Drive kinematics&lt;br /&gt;
**** Drive Motor Names: these are standardized and should not change&lt;br /&gt;
**** Drive Motor IDs: these are standardized and should not change&lt;br /&gt;
**** Drive Motor Inverted: these should be adjusted according to the motor directions of each drive wheel&lt;br /&gt;
**** Steer Motor Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor Inverted: these should be adjusted according to the steer motor direction of each swerve module&lt;br /&gt;
**** Steer Motor Scale: these should be determined by the steering encoder resolution and gear ratio&lt;br /&gt;
**** Steer Encoder Types: these should be specified according to the steering encoders being used&lt;br /&gt;
**** Steer Encoder Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder Inverted: these should be adjusted according to the encoder directions of the swerve modules&lt;br /&gt;
**** Steer Encoder Zero Positions: these should be calibrated for each swerve module&lt;br /&gt;
**** Steer PID Coefficients: these should be tuned for the swerve modules&lt;br /&gt;
**** Steer Module Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Drive Base Kinematics Scale: X, Y and Turn scales must be calibrated&lt;br /&gt;
**** Drive Base Performance Parameters (max velocity, max acceleration, max turn rate etc.): these should be determined&lt;br /&gt;
*** '''Robot.java''': Instantiate the appropriate Drive Base for the robot.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, the Template already provided code to display the Drive Base status: drive wheel encoder values, steer encoder values, drive base odometry.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''periodic'' method, the Template already provided code to read joystick values to control the driving of the Drive Base.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''driverControllerButtonEvent'' method, the Template also provided code to react to different buttons to modify driving modes (e.g. Field vs Robot oriented driving, slow vs normal drive speed etc.).&lt;br /&gt;
*** Tune Swerve Drive Steering PID Coefficients.&lt;br /&gt;
*** Tune Drive Base Odoemetry Scales.&lt;br /&gt;
*** Tune Drive Base PID Coefficients.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* FTC Swerve Drive Base with FRC electronics&lt;br /&gt;
* Passive Odometry&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Vision Subsystem ===&lt;br /&gt;
* Introduce Robotics Vision Subsystem.&lt;br /&gt;
** Vision running on the Robot Controller&lt;br /&gt;
*** CPU intensive, may affect robot performance&lt;br /&gt;
** Vision running on Vision Coprocessor&lt;br /&gt;
*** FTC: Limelight 3A&lt;br /&gt;
*** FRC: Limelight 3, Raspberry Pi, NVidia Jetson&lt;br /&gt;
** Vision Processing&lt;br /&gt;
*** '''AprilTag Detection'''&lt;br /&gt;
**** Giant ''QR Code'' placed around the field&lt;br /&gt;
**** Identify fixed game elements around the field&lt;br /&gt;
**** Localization of the robot&lt;br /&gt;
*** '''Object Recognition'''&lt;br /&gt;
**** Neural Network based object recognition&lt;br /&gt;
**** CPU intensive, better with Vision Coprocessor&lt;br /&gt;
**** Identify scoring elements on the field&lt;br /&gt;
**** Enable auto pickup or scoring&lt;br /&gt;
*** '''Color Blob Detection'''&lt;br /&gt;
**** OpenCV based object detection by color&lt;br /&gt;
**** Does not understand object type and shape&lt;br /&gt;
**** Require result filtering to reduce false positives&lt;br /&gt;
** Vision Detected Object Information&lt;br /&gt;
*** Detected Object Raw Info: specific to the detected object type&lt;br /&gt;
*** Detected Object Rectangle: object rectangle from the camera in screen pixel coordinate&lt;br /&gt;
*** Detected Object Width, Height and Area: object dimension info for filtering if necessary&lt;br /&gt;
*** Detected Object Pose: Pose information of the detected object relative to the camera&lt;br /&gt;
*** Robot Pose: Robot Field Pose info (from AprilTag)&lt;br /&gt;
** How Vision Pipeline Works?&lt;br /&gt;
*** Vision pipeline starts with capturing a video frame for processing.&lt;br /&gt;
*** Process the frame to detect the object(s).&lt;br /&gt;
*** Compute detected object info.&lt;br /&gt;
*** Communicate the result back to the Robot Controller.&lt;br /&gt;
**** FTC: Coprocessor communicates via USB or I2C&lt;br /&gt;
**** FRC: Coprocessor communicates via Ethernet using Network Table&lt;br /&gt;
*** Vision processing is asynchronous: When calling vision to detect an object, it will return immediately either with the result of the last detected object or with a null if it is still busy processing the next frame.&lt;br /&gt;
*** When calling vision, caller must check if the returned result has the info or if it is null. If it is null, it may mean Vision is still busy processing the next frame or it doesn't find the object it is seeking. In either case, the caller needs to keep calling Vision repeatedly until either it finds the object(s) or it has reached the timeout limit. One should always set a timeout when calling Vision repeatedly to prevent the code hanging forever if Vision doesn't find anything.&lt;br /&gt;
*** Once the detected object info is obtained, the caller can use the info to determine what to do with it.&lt;br /&gt;
**** Determine the object type detected or object position so to perform the subsequent tasks accordingly (e.g. detected team prop position in FTC).&lt;br /&gt;
**** Navigate the robot towards the detected object as the scoring location or to pick the object up.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Raspberry Pi Coprocessor&lt;br /&gt;
* USB camera&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* Introduce to Path Following&lt;br /&gt;
** PID Drive&lt;br /&gt;
** Pure Pursuit Drive&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=710</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=710"/>
		<updated>2024-08-18T22:44:38Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** '''setPrimaryMotor''': Set the characteristics of the primary motor.&lt;br /&gt;
*** '''setFollowerMotor''': Set the characteristics of the follower motor if there is one.&lt;br /&gt;
*** '''setLowerLimitSwitch''': Set the characteristics of the lower limit switch if there is one.&lt;br /&gt;
*** '''setUpperLimitSwitch''': Set the characteristics of the upper limit switch if there is one.&lt;br /&gt;
*** '''setExternalEncoder''': Set the characteristics of the external encoder if there is one.&lt;br /&gt;
*** '''setPositionScaleAndOffset''': Set motor position scale and offset for translating to real world units&lt;br /&gt;
*** '''setPositionPresets''': Set position presets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Arm scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Turret scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two shooter motors, optional pan/tilt motor actuators&lt;br /&gt;
***** Set the characteristics of the shooter motor 1&lt;br /&gt;
***** Set the characteristics of the shooter motor 2 if there is one&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Intake Subsystem (one/two motor intake with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two motor Intake with digital/analog sensor.&lt;br /&gt;
*** '''Intake.java''': Create a new class named ''Intake''.&lt;br /&gt;
**** Create the parameters for the Intake: one motor with optional follower motor and a digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set the characteristics of the sensor if there is one&lt;br /&gt;
**** Create the Intake using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Intake object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Intake status: motor power, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Intake in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoIntake ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Grabber Subsystem (one/two servo with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two servo Grabber with digital/analog sensor.&lt;br /&gt;
*** '''Grabber.java''': Create a new class named ''Grabber''.&lt;br /&gt;
**** Create the parameters for the Grabber: one/two servo with optional digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary servo&lt;br /&gt;
***** Set the characteristics of the follower servo if there is one&lt;br /&gt;
***** Set the characteristics of the sensor trigger if there is a sensor&lt;br /&gt;
**** Create the Grabber using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Grabber object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Grabber status: servo position, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Grabber in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoGrabber ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Grabber with servo-controlled claws&lt;br /&gt;
* One or two servos&lt;br /&gt;
* Sensor to detect the presence of game element grabbed&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Drive Base Subsystem ===&lt;br /&gt;
* Introduce Drive Base Subsystem.&lt;br /&gt;
** '''Differential Drive Base'''&lt;br /&gt;
*** 4/6-wheel differential drive train (West Coast Drive).&lt;br /&gt;
*** Non-holonomic drive: 2-DOF (Degrees of Freedom) - Forward/Backward and Turn.&lt;br /&gt;
*** Kinematics: Translate 2-DOF to left and right wheel power.&lt;br /&gt;
** '''Mecanum Drive Base'''&lt;br /&gt;
*** 4-wheel Mecanum wheel drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn.&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers.&lt;br /&gt;
** '''Swerve Drive Base'''&lt;br /&gt;
*** 4-swerve module drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn (all four wheels steerable).&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers as well as steering positions.&lt;br /&gt;
** Exercise: Creating and Controlling a Drive Base.&lt;br /&gt;
*** '''DifferentialDrive.java, MecanumDrive.java, SwerveDrive.java''': No need to create these because the Template code already provides them.&lt;br /&gt;
*** '''RobotParams.java''': Creates the parameters for the Drive Base. A lot of these parameters are already provided because we standardize most of them. Some parameters are specific to the robot base for the season and need to be determined.&lt;br /&gt;
**** Wheel-Base Length and Width: these must be provided for Swerve Drive kinematics&lt;br /&gt;
**** Drive Motor Names: these are standardized and should not change&lt;br /&gt;
**** Drive Motor IDs: these are standardized and should not change&lt;br /&gt;
**** Drive Motor Inverted: these should be adjusted according to the motor directions of each drive wheel&lt;br /&gt;
**** Steer Motor Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor Inverted: these should be adjusted according to the steer motor direction of each swerve module&lt;br /&gt;
**** Steer Motor Scale: these should be determined by the steering encoder resolution and gear ratio&lt;br /&gt;
**** Steer Encoder Types: these should be specified according to the steering encoders being used&lt;br /&gt;
**** Steer Encoder Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder Inverted: these should be adjusted according to the encoder directions of the swerve modules&lt;br /&gt;
**** Steer Encoder Zero Positions: these should be calibrated for each swerve module&lt;br /&gt;
**** Steer PID Coefficients: these should be tuned for the swerve modules&lt;br /&gt;
**** Steer Module Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Drive Base Kinematics Scale: X, Y and Turn scales must be calibrated&lt;br /&gt;
**** Drive Base Performance Parameters (max velocity, max acceleration, max turn rate etc.): these should be determined&lt;br /&gt;
*** '''Robot.java''': Instantiate the appropriate Drive Base for the robot.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, the Template already provided code to display the Drive Base status: drive wheel encoder values, steer encoder values, drive base odometry.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''periodic'' method, the Template already provided code to read joystick values to control the driving of the Drive Base.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''driverControllerButtonEvent'' method, the Template also provided code to react to different buttons to modify driving modes (e.g. Field vs Robot oriented driving, slow vs normal drive speed etc.).&lt;br /&gt;
*** Tune Swerve Drive Steering PID Coefficients.&lt;br /&gt;
*** Tune Drive Base Odoemetry Scales.&lt;br /&gt;
*** Tune Drive Base PID Coefficients.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* FTC Swerve Drive Base with FRC electronics&lt;br /&gt;
* Passive Odometry&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Vision Subsystem ===&lt;br /&gt;
* Introduce Robotics Vision Subsystem.&lt;br /&gt;
** Vision running on the Robot Controller&lt;br /&gt;
*** CPU intensive, may affect robot performance&lt;br /&gt;
** Vision running on Vision Coprocessor&lt;br /&gt;
*** FTC: Limelight 3A&lt;br /&gt;
*** FRC: Limelight 3, Raspberry Pi, NVidia Jetson&lt;br /&gt;
** Vision Processing&lt;br /&gt;
*** '''AprilTag Detection'''&lt;br /&gt;
**** Giant ''QR Code'' placed around the field&lt;br /&gt;
**** Identify fixed game elements around the field&lt;br /&gt;
**** Localization of the robot&lt;br /&gt;
*** '''Object Recognition'''&lt;br /&gt;
**** Neural Network based object recognition&lt;br /&gt;
**** CPU intensive, better with Vision Coprocessor&lt;br /&gt;
**** Identify scoring elements on the field&lt;br /&gt;
**** Enable auto pickup or scoring&lt;br /&gt;
*** '''Color Blob Detection'''&lt;br /&gt;
**** OpenCV based object detection by color&lt;br /&gt;
**** Does not understand object type and shape&lt;br /&gt;
**** Require result filtering to reduce false positives&lt;br /&gt;
** Vision Detected Object Information&lt;br /&gt;
*** Detected Object Raw Info: specific to the detected object type&lt;br /&gt;
*** Detected Object Rectangle: object rectangle from the camera in screen pixel coordinate&lt;br /&gt;
*** Detected Object Width, Height and Area: object dimension info for filtering if necessary&lt;br /&gt;
*** Detected Object Pose: Pose information of the detected object relative to the camera&lt;br /&gt;
*** Robot Pose: Robot Field Pose info (from AprilTag)&lt;br /&gt;
** How Vision Pipeline Works?&lt;br /&gt;
*** Vision pipeline starts with capturing a video frame for processing.&lt;br /&gt;
*** Process the frame to detect the object(s).&lt;br /&gt;
*** Compute detected object info.&lt;br /&gt;
*** Communicate the result back to the Robot Controller.&lt;br /&gt;
**** FTC: Coprocessor communicates via USB or I2C&lt;br /&gt;
**** FRC: Coprocessor communicates via Ethernet using Network Table&lt;br /&gt;
*** Vision processing is asynchronous: When calling vision to detect an object, it will return immediately either with the result of the last detected object or with a null if it is still busy processing the next frame.&lt;br /&gt;
*** When calling vision, caller must check if the returned result has the info or if it is null. If it is null, it may mean Vision is still busy processing the next frame or it doesn't find the object it is seeking. In either case, the caller needs to keep calling Vision repeatedly until either it finds the object(s) or it has reached the timeout limit. One should always set a timeout when calling Vision repeatedly to prevent the code hanging forever if Vision doesn't find anything.&lt;br /&gt;
*** Once the detected object info is obtained, the caller can use the info to determine what to do with it.&lt;br /&gt;
**** Determine the object type detected or object position so to perform the subsequent tasks accordingly (e.g. detected team prop position in FTC).&lt;br /&gt;
**** Navigate the robot towards the detected object as the scoring location or to pick the object up.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Raspberry Pi Coprocessor&lt;br /&gt;
* USB camera&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=709</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=709"/>
		<updated>2024-08-18T22:43:56Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 10: Vision Subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** '''setPrimaryMotor''': Set the characteristics of the primary motor.&lt;br /&gt;
*** '''setFollowerMotor''': Set the characteristics of the follower motor if there is one.&lt;br /&gt;
*** '''setLowerLimitSwitch''': Set the characteristics of the lower limit switch if there is one.&lt;br /&gt;
*** '''setUpperLimitSwitch''': Set the characteristics of the upper limit switch if there is one.&lt;br /&gt;
*** '''setExternalEncoder''': Set the characteristics of the external encoder if there is one.&lt;br /&gt;
*** '''setPositionScaleAndOffset''': Set motor position scale and offset for translating to real world units&lt;br /&gt;
*** '''setPositionPresets''': Set position presets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Arm scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Turret scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two shooter motors, optional pan/tilt motor actuators&lt;br /&gt;
***** Set the characteristics of the shooter motor 1&lt;br /&gt;
***** Set the characteristics of the shooter motor 2 if there is one&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Intake Subsystem (one/two motor intake with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two motor Intake with digital/analog sensor.&lt;br /&gt;
*** '''Intake.java''': Create a new class named ''Intake''.&lt;br /&gt;
**** Create the parameters for the Intake: one motor with optional follower motor and a digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set the characteristics of the sensor if there is one&lt;br /&gt;
**** Create the Intake using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Intake object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Intake status: motor power, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Intake in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoIntake ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Grabber Subsystem (one/two servo with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two servo Grabber with digital/analog sensor.&lt;br /&gt;
*** '''Grabber.java''': Create a new class named ''Grabber''.&lt;br /&gt;
**** Create the parameters for the Grabber: one/two servo with optional digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary servo&lt;br /&gt;
***** Set the characteristics of the follower servo if there is one&lt;br /&gt;
***** Set the characteristics of the sensor trigger if there is a sensor&lt;br /&gt;
**** Create the Grabber using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Grabber object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Grabber status: servo position, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Grabber in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoGrabber ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Grabber with servo-controlled claws&lt;br /&gt;
* One or two servos&lt;br /&gt;
* Sensor to detect the presence of game element grabbed&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Drive Base Subsystem ===&lt;br /&gt;
* Introduce Drive Base Subsystem.&lt;br /&gt;
** '''Differential Drive Base'''&lt;br /&gt;
*** 4/6-wheel differential drive train (West Coast Drive).&lt;br /&gt;
*** Non-holonomic drive: 2-DOF (Degrees of Freedom) - Forward/Backward and Turn.&lt;br /&gt;
*** Kinematics: Translate 2-DOF to left and right wheel power.&lt;br /&gt;
** '''Mecanum Drive Base'''&lt;br /&gt;
*** 4-wheel Mecanum wheel drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn.&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers.&lt;br /&gt;
** '''Swerve Drive Base'''&lt;br /&gt;
*** 4-swerve module drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn (all four wheels steerable).&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers as well as steering positions.&lt;br /&gt;
** Exercise: Creating and Controlling a Drive Base.&lt;br /&gt;
*** '''DifferentialDrive.java, MecanumDrive.java, SwerveDrive.java''': No need to create these because the Template code already provides them.&lt;br /&gt;
*** '''RobotParams.java''': Creates the parameters for the Drive Base. A lot of these parameters are already provided because we standardize most of them. Some parameters are specific to the robot base for the season and need to be determined.&lt;br /&gt;
**** Wheel-Base Length and Width: these must be provided for Swerve Drive kinematics&lt;br /&gt;
**** Drive Motor Names: these are standardized and should not change&lt;br /&gt;
**** Drive Motor IDs: these are standardized and should not change&lt;br /&gt;
**** Drive Motor Inverted: these should be adjusted according to the motor directions of each drive wheel&lt;br /&gt;
**** Steer Motor Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor Inverted: these should be adjusted according to the steer motor direction of each swerve module&lt;br /&gt;
**** Steer Motor Scale: these should be determined by the steering encoder resolution and gear ratio&lt;br /&gt;
**** Steer Encoder Types: these should be specified according to the steering encoders being used&lt;br /&gt;
**** Steer Encoder Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder Inverted: these should be adjusted according to the encoder directions of the swerve modules&lt;br /&gt;
**** Steer Encoder Zero Positions: these should be calibrated for each swerve module&lt;br /&gt;
**** Steer PID Coefficients: these should be tuned for the swerve modules&lt;br /&gt;
**** Steer Module Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Drive Base Kinematics Scale: X, Y and Turn scales must be calibrated&lt;br /&gt;
**** Drive Base Performance Parameters (max velocity, max acceleration, max turn rate etc.): these should be determined&lt;br /&gt;
*** '''Robot.java''': Instantiate the appropriate Drive Base for the robot.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, the Template already provided code to display the Drive Base status: drive wheel encoder values, steer encoder values, drive base odometry.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''periodic'' method, the Template already provided code to read joystick values to control the driving of the Drive Base.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''driverControllerButtonEvent'' method, the Template also provided code to react to different buttons to modify driving modes (e.g. Field vs Robot oriented driving, slow vs normal drive speed etc.).&lt;br /&gt;
*** Tune Swerve Drive Steering PID Coefficients.&lt;br /&gt;
*** Tune Drive Base Odoemetry Scales.&lt;br /&gt;
*** Tune Drive Base PID Coefficients.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* FTC Swerve Drive Base with FRC electronics&lt;br /&gt;
* Passive Odometry&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Vision Subsystem ===&lt;br /&gt;
* Introduce Robotics Vision Subsystem.&lt;br /&gt;
** Vision running on the Robot Controller&lt;br /&gt;
*** CPU intensive, may affect robot performance&lt;br /&gt;
** Vision running on Vision Coprocessor&lt;br /&gt;
*** FTC: Limelight 3A&lt;br /&gt;
*** FRC: Limelight 3, Raspberry Pi, NVidia Jetson&lt;br /&gt;
** Vision Processing&lt;br /&gt;
*** '''AprilTag Detection'''&lt;br /&gt;
**** Giant ''QR Code'' placed around the field&lt;br /&gt;
**** Identify fixed game elements around the field&lt;br /&gt;
**** Localization of the robot&lt;br /&gt;
*** '''Object Recognition'''&lt;br /&gt;
**** Neural Network based object recognition&lt;br /&gt;
**** CPU intensive, better with Vision Coprocessor&lt;br /&gt;
**** Identify scoring elements on the field&lt;br /&gt;
**** Enable auto pickup or scoring&lt;br /&gt;
*** '''Color Blob Detection'''&lt;br /&gt;
**** OpenCV based object detection by color&lt;br /&gt;
**** Does not understand object type and shape&lt;br /&gt;
**** Require result filtering to reduce false positives&lt;br /&gt;
** Vision Detected Object Information&lt;br /&gt;
*** Detected Object Raw Info: specific to the detected object type&lt;br /&gt;
*** Detected Object Rectangle: object rectangle from the camera in screen pixel coordinate&lt;br /&gt;
*** Detected Object Width, Height and Area: object dimension info for filtering if necessary&lt;br /&gt;
*** Detected Object Pose: Pose information of the detected object relative to the camera&lt;br /&gt;
*** Robot Pose: Robot Field Pose info (from AprilTag)&lt;br /&gt;
** How Vision Pipeline Works?&lt;br /&gt;
*** Vision pipeline starts with capturing a video frame for processing.&lt;br /&gt;
*** Process the frame to detect the object(s).&lt;br /&gt;
*** Compute detected object info.&lt;br /&gt;
*** Communicate the result back to the Robot Controller.&lt;br /&gt;
**** FTC: Coprocessor communicates via USB or I2C&lt;br /&gt;
**** FRC: Coprocessor communicates via Ethernet using Network Table&lt;br /&gt;
*** Vision processing is asynchronous: When calling vision to detect an object, it will return immediately either with the result of the last detected object or with a null if it is still busy processing the next frame.&lt;br /&gt;
*** When calling vision, caller must check if the returned result has the info or if it is null. If it is null, it may mean Vision is still busy processing the next frame or it doesn't find the object it is seeking. In either case, the caller needs to keep calling Vision repeatedly until either it finds the object(s) or it has reached the timeout limit. One should always set a timeout when calling Vision repeatedly to prevent the code hanging forever if Vision doesn't find anything.&lt;br /&gt;
*** Once the detected object info is obtained, the caller can use the info to determine what to do with it.&lt;br /&gt;
**** Determine the object type detected or object position so to perform the subsequent tasks accordingly (e.g. detected team prop position in FTC).&lt;br /&gt;
**** Navigate the robot towards the detected object as the scoring location or to pick the object up.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Raspberry Pi Coprocessor&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=708</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=708"/>
		<updated>2024-08-13T17:13:32Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Class Curriculum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** '''setPrimaryMotor''': Set the characteristics of the primary motor.&lt;br /&gt;
*** '''setFollowerMotor''': Set the characteristics of the follower motor if there is one.&lt;br /&gt;
*** '''setLowerLimitSwitch''': Set the characteristics of the lower limit switch if there is one.&lt;br /&gt;
*** '''setUpperLimitSwitch''': Set the characteristics of the upper limit switch if there is one.&lt;br /&gt;
*** '''setExternalEncoder''': Set the characteristics of the external encoder if there is one.&lt;br /&gt;
*** '''setPositionScaleAndOffset''': Set motor position scale and offset for translating to real world units&lt;br /&gt;
*** '''setPositionPresets''': Set position presets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Arm scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Turret scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two shooter motors, optional pan/tilt motor actuators&lt;br /&gt;
***** Set the characteristics of the shooter motor 1&lt;br /&gt;
***** Set the characteristics of the shooter motor 2 if there is one&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Intake Subsystem (one/two motor intake with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two motor Intake with digital/analog sensor.&lt;br /&gt;
*** '''Intake.java''': Create a new class named ''Intake''.&lt;br /&gt;
**** Create the parameters for the Intake: one motor with optional follower motor and a digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set the characteristics of the sensor if there is one&lt;br /&gt;
**** Create the Intake using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Intake object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Intake status: motor power, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Intake in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoIntake ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Grabber Subsystem (one/two servo with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two servo Grabber with digital/analog sensor.&lt;br /&gt;
*** '''Grabber.java''': Create a new class named ''Grabber''.&lt;br /&gt;
**** Create the parameters for the Grabber: one/two servo with optional digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary servo&lt;br /&gt;
***** Set the characteristics of the follower servo if there is one&lt;br /&gt;
***** Set the characteristics of the sensor trigger if there is a sensor&lt;br /&gt;
**** Create the Grabber using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Grabber object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Grabber status: servo position, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Grabber in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoGrabber ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Grabber with servo-controlled claws&lt;br /&gt;
* One or two servos&lt;br /&gt;
* Sensor to detect the presence of game element grabbed&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Drive Base Subsystem ===&lt;br /&gt;
* Introduce Drive Base Subsystem.&lt;br /&gt;
** '''Differential Drive Base'''&lt;br /&gt;
*** 4/6-wheel differential drive train (West Coast Drive).&lt;br /&gt;
*** Non-holonomic drive: 2-DOF (Degrees of Freedom) - Forward/Backward and Turn.&lt;br /&gt;
*** Kinematics: Translate 2-DOF to left and right wheel power.&lt;br /&gt;
** '''Mecanum Drive Base'''&lt;br /&gt;
*** 4-wheel Mecanum wheel drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn.&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers.&lt;br /&gt;
** '''Swerve Drive Base'''&lt;br /&gt;
*** 4-swerve module drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn (all four wheels steerable).&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers as well as steering positions.&lt;br /&gt;
** Exercise: Creating and Controlling a Drive Base.&lt;br /&gt;
*** '''DifferentialDrive.java, MecanumDrive.java, SwerveDrive.java''': No need to create these because the Template code already provides them.&lt;br /&gt;
*** '''RobotParams.java''': Creates the parameters for the Drive Base. A lot of these parameters are already provided because we standardize most of them. Some parameters are specific to the robot base for the season and need to be determined.&lt;br /&gt;
**** Wheel-Base Length and Width: these must be provided for Swerve Drive kinematics&lt;br /&gt;
**** Drive Motor Names: these are standardized and should not change&lt;br /&gt;
**** Drive Motor IDs: these are standardized and should not change&lt;br /&gt;
**** Drive Motor Inverted: these should be adjusted according to the motor directions of each drive wheel&lt;br /&gt;
**** Steer Motor Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor Inverted: these should be adjusted according to the steer motor direction of each swerve module&lt;br /&gt;
**** Steer Motor Scale: these should be determined by the steering encoder resolution and gear ratio&lt;br /&gt;
**** Steer Encoder Types: these should be specified according to the steering encoders being used&lt;br /&gt;
**** Steer Encoder Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder Inverted: these should be adjusted according to the encoder directions of the swerve modules&lt;br /&gt;
**** Steer Encoder Zero Positions: these should be calibrated for each swerve module&lt;br /&gt;
**** Steer PID Coefficients: these should be tuned for the swerve modules&lt;br /&gt;
**** Steer Module Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Drive Base Kinematics Scale: X, Y and Turn scales must be calibrated&lt;br /&gt;
**** Drive Base Performance Parameters (max velocity, max acceleration, max turn rate etc.): these should be determined&lt;br /&gt;
*** '''Robot.java''': Instantiate the appropriate Drive Base for the robot.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, the Template already provided code to display the Drive Base status: drive wheel encoder values, steer encoder values, drive base odometry.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''periodic'' method, the Template already provided code to read joystick values to control the driving of the Drive Base.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''driverControllerButtonEvent'' method, the Template also provided code to react to different buttons to modify driving modes (e.g. Field vs Robot oriented driving, slow vs normal drive speed etc.).&lt;br /&gt;
*** Tune Swerve Drive Steering PID Coefficients.&lt;br /&gt;
*** Tune Drive Base Odoemetry Scales.&lt;br /&gt;
*** Tune Drive Base PID Coefficients.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* FTC Swerve Drive Base with FRC electronics&lt;br /&gt;
* Passive Odometry&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Vision Subsystem ===&lt;br /&gt;
* Introduce Robotics Vision Subsystem.&lt;br /&gt;
** Vision running on the Robot Controller&lt;br /&gt;
*** CPU intensive, may affect robot performance&lt;br /&gt;
** Vision running on Vision Coprocessor&lt;br /&gt;
*** FTC: Limelight 3A&lt;br /&gt;
*** FRC: Limelight 3, Raspberry Pi, NVidia Jetson&lt;br /&gt;
** Vision Processing&lt;br /&gt;
*** '''AprilTag Detection'''&lt;br /&gt;
**** Giant ''QR Code'' placed around the field&lt;br /&gt;
**** Identify fixed game elements around the field&lt;br /&gt;
**** Localization of the robot&lt;br /&gt;
*** '''Object Recognition'''&lt;br /&gt;
**** Neural Network based object recognition&lt;br /&gt;
**** CPU intensive, better with Vision Coprocessor&lt;br /&gt;
**** Identify scoring elements on the field&lt;br /&gt;
**** Enable auto pickup or scoring&lt;br /&gt;
*** '''Color Blob Detection'''&lt;br /&gt;
**** OpenCV based object detection by color&lt;br /&gt;
**** Does not understand object type and shape&lt;br /&gt;
**** Require result filtering to reduce false positives&lt;br /&gt;
** Vision Detected Object Information&lt;br /&gt;
*** Detected Object Raw Info: specific to the detected object type&lt;br /&gt;
*** Detected Object Rectangle: object rectangle from the camera in screen pixel coordinate&lt;br /&gt;
*** Detected Object Width, Height and Area: object dimension info for filtering if necessary&lt;br /&gt;
*** Detected Object Pose: Pose information of the detected object relative to the camera&lt;br /&gt;
*** Robot Pose: Robot Field Pose info (from AprilTag)&lt;br /&gt;
** How Vision Works: Vision processing is asynchronous&lt;br /&gt;
*** Capture video frame for processing&lt;br /&gt;
*** Process the frame to detect the object&lt;br /&gt;
*** Compute detected object info&lt;br /&gt;
*** Communicate the result back to the Robot Controller&lt;br /&gt;
**** FTC: Coprocessor communicates via USB or I2C&lt;br /&gt;
**** FRC: Coprocessor communicates via Ethernet using Network Table&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Raspberry Pi Coprocessor&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=707</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=707"/>
		<updated>2024-08-12T01:34:03Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Class Curriculum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** '''setPrimaryMotor''': Set the characteristics of the primary motor.&lt;br /&gt;
*** '''setFollowerMotor''': Set the characteristics of the follower motor if there is one.&lt;br /&gt;
*** '''setLowerLimitSwitch''': Set the characteristics of the lower limit switch if there is one.&lt;br /&gt;
*** '''setUpperLimitSwitch''': Set the characteristics of the upper limit switch if there is one.&lt;br /&gt;
*** '''setExternalEncoder''': Set the characteristics of the external encoder if there is one.&lt;br /&gt;
*** '''setPositionScaleAndOffset''': Set motor position scale and offset for translating to real world units&lt;br /&gt;
*** '''setPositionPresets''': Set position presets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Arm scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Turret scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two shooter motors, optional pan/tilt motor actuators&lt;br /&gt;
***** Set the characteristics of the shooter motor 1&lt;br /&gt;
***** Set the characteristics of the shooter motor 2 if there is one&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Intake Subsystem (one/two motor intake with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two motor Intake with digital/analog sensor.&lt;br /&gt;
*** '''Intake.java''': Create a new class named ''Intake''.&lt;br /&gt;
**** Create the parameters for the Intake: one motor with optional follower motor and a digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set the characteristics of the sensor if there is one&lt;br /&gt;
**** Create the Intake using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Intake object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Intake status: motor power, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Intake in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoIntake ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Grabber Subsystem (one/two servo with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two servo Grabber with digital/analog sensor.&lt;br /&gt;
*** '''Grabber.java''': Create a new class named ''Grabber''.&lt;br /&gt;
**** Create the parameters for the Grabber: one/two servo with optional digital/analog sensor&lt;br /&gt;
***** Set the characteristics of the primary servo&lt;br /&gt;
***** Set the characteristics of the follower servo if there is one&lt;br /&gt;
***** Set the characteristics of the sensor trigger if there is a sensor&lt;br /&gt;
**** Create the Grabber using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Grabber object.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Grabber status: servo position, sensor state and hasObject.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Grabber in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoGrabber ON and release to cancel the operation.&lt;br /&gt;
*** Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Grabber with servo-controlled claws&lt;br /&gt;
* One or two servos&lt;br /&gt;
* Sensor to detect the presence of game element grabbed&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Drive Base Subsystem ===&lt;br /&gt;
* Introduce Drive Base Subsystem.&lt;br /&gt;
** '''Differential Drive Base'''&lt;br /&gt;
*** 4/6-wheel differential drive train (West Coast Drive).&lt;br /&gt;
*** Non-holonomic drive: 2-DOF (Degrees of Freedom) - Forward/Backward and Turn.&lt;br /&gt;
*** Kinematics: Translate 2-DOF to left and right wheel power.&lt;br /&gt;
** '''Mecanum Drive Base'''&lt;br /&gt;
*** 4-wheel Mecanum wheel drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn.&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers.&lt;br /&gt;
** '''Swerve Drive Base'''&lt;br /&gt;
*** 4-swerve module drive train.&lt;br /&gt;
*** Holonomic drive: 3-DOF (Degrees of Freedom) - Forward/Backward, Strafe Left/Right, Turn (all four wheels steerable).&lt;br /&gt;
*** Kinematics: Translate 3-DOF to four independent wheel powers as well as steering positions.&lt;br /&gt;
** Exercise: Creating and Controlling a Drive Base.&lt;br /&gt;
*** '''DifferentialDrive.java, MecanumDrive.java, SwerveDrive.java''': No need to create these because the Template code already provides them.&lt;br /&gt;
*** '''RobotParams.java''': Creates the parameters for the Drive Base. A lot of these parameters are already provided because we standardize most of them. Some parameters are specific to the robot base for the season and need to be determined.&lt;br /&gt;
**** Wheel-Base Length and Width: these must be provided for Swerve Drive kinematics&lt;br /&gt;
**** Drive Motor Names: these are standardized and should not change&lt;br /&gt;
**** Drive Motor IDs: these are standardized and should not change&lt;br /&gt;
**** Drive Motor Inverted: these should be adjusted according to the motor directions of each drive wheel&lt;br /&gt;
**** Steer Motor Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Motor Inverted: these should be adjusted according to the steer motor direction of each swerve module&lt;br /&gt;
**** Steer Motor Scale: these should be determined by the steering encoder resolution and gear ratio&lt;br /&gt;
**** Steer Encoder Types: these should be specified according to the steering encoders being used&lt;br /&gt;
**** Steer Encoder Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder IDs: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Steer Encoder Inverted: these should be adjusted according to the encoder directions of the swerve modules&lt;br /&gt;
**** Steer Encoder Zero Positions: these should be calibrated for each swerve module&lt;br /&gt;
**** Steer PID Coefficients: these should be tuned for the swerve modules&lt;br /&gt;
**** Steer Module Names: these are standardized for Swerve Drive only and should not change&lt;br /&gt;
**** Drive Base Kinematics Scale: X, Y and Turn scales must be calibrated&lt;br /&gt;
**** Drive Base Performance Parameters (max velocity, max acceleration, max turn rate etc.): these should be determined&lt;br /&gt;
*** '''Robot.java''': Instantiate the appropriate Drive Base for the robot.&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, the Template already provided code to display the Drive Base status: drive wheel encoder values, steer encoder values, drive base odometry.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''periodic'' method, the Template already provided code to read joystick values to control the driving of the Drive Base.&lt;br /&gt;
*** '''FrcTeleOp.java''': In the ''driverControllerButtonEvent'' method, the Template also provided code to react to different buttons to modify driving modes (e.g. Field vs Robot oriented driving, slow vs normal drive speed etc.).&lt;br /&gt;
*** Tune Swerve Drive Steering PID Coefficients.&lt;br /&gt;
*** Tune Drive Base Odoemetry Scales.&lt;br /&gt;
*** Tune Drive Base PID Coefficients.&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Vision Subsystem ===&lt;br /&gt;
* Introduce Robotics Vision Subsystem.&lt;br /&gt;
** AprilTag Detection&lt;br /&gt;
** Object Recognition&lt;br /&gt;
** Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=706</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=706"/>
		<updated>2024-08-11T22:57:46Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Class Curriculum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** '''setPrimaryMotor''': Set the characteristics of the primary motor.&lt;br /&gt;
*** '''setFollowerMotor''': Set the characteristics of the follower motor if there is one.&lt;br /&gt;
*** '''setLowerLimitSwitch''': Set the characteristics of the lower limit switch if there is one.&lt;br /&gt;
*** '''setUpperLimitSwitch''': Set the characteristics of the upper limit switch if there is one.&lt;br /&gt;
*** '''setExternalEncoder''': Set the characteristics of the external encoder if there is one.&lt;br /&gt;
*** '''setPositionScaleAndOffset''': Set motor position scale and offset for translating to real world units&lt;br /&gt;
*** '''setPositionPresets''': Set position presets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Arm scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
***** Set the characteristics of the primary motor&lt;br /&gt;
***** Set the characteristics of the follower motor if there is one&lt;br /&gt;
***** Set Turret scale and offset to real world unit in degrees&lt;br /&gt;
***** Set position presets if appropriate&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two motors, optional pan/tilt motor actuators&lt;br /&gt;
***** Set the characteristics of the shooter motor 1&lt;br /&gt;
***** Set the characteristics of the shooter motor 2 if there is one&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Smart Intake Subsystem (one/two motor intake with optional digital/analog sensor).&lt;br /&gt;
** Exercise: Creating and Controlling a one/two motor Intake with digital sensor.&lt;br /&gt;
*** '''Intake.java''': Create a new class named ''Intake''.&lt;br /&gt;
**** Create the parameters for the Intake: one motor with optional follower motor and a digital sensor&lt;br /&gt;
**** Create the Intake using the parameters&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Intake object.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Intake in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to press a button to turn AutoIntake ON and release to cancel the operation.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
** Ex&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=705</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=705"/>
		<updated>2024-08-11T17:58:21Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Lesson Videos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:CADTrainingDay1.pptx|Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Extrude (Cont.)&lt;br /&gt;
* Hole&lt;br /&gt;
* Fillet&lt;br /&gt;
* Chamfer&lt;br /&gt;
* Github Source control&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* Videos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=UKsTL-268RM&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Assembly Constraints ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=3H0giE13fZc&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=704</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=704"/>
		<updated>2024-08-06T22:44:46Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Session 0: Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator with optional preset positions&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Set Elevator scale and offset to real world unit in inches&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Set Arm scale and offset to real world units in degrees&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Turret Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling a Turret as a Motor Actuator.&lt;br /&gt;
*** '''Turret.java''': Create a new class named ''Turret''.&lt;br /&gt;
**** Create the parameters for the Turret&lt;br /&gt;
**** Create the Turret as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set Turret scale and offset to real world units in degrees&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Turret Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Turret object. Add code to zero calibrate the Turret.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Turret in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Turret power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Turret left and right of the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Turret status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Turret Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Shooter Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Shooter Subsystem (one/two-motor shooter with optional pan/tilt motor actuators).&lt;br /&gt;
** Exercise: Creating and Controlling a Shooter.&lt;br /&gt;
*** '''Shooter.java''': Create a new class named ''Shooter''.&lt;br /&gt;
**** Create the parameters for the Shooter: one or two motors, optional pan/tilt motor actuators&lt;br /&gt;
**** Create the Shooter using the parameters&lt;br /&gt;
**** Set Shooter scale to real world units in RPM&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Optionally set Shooter Preset Velocities&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Shooter object.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Shooter in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to increment/decrement the Shooter velocities&lt;br /&gt;
**** In the ''periodic'' method, add code to set the shooter velocity with the value set by the DPad&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Shooter motor status: power, vel/target&lt;br /&gt;
*** Tune Shooter velocity PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Shooter with two motors&lt;br /&gt;
* DC motor with built-in encoder as the shooter motors&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=703</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=703"/>
		<updated>2024-07-28T18:06:16Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcCANTalonSRX''&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create ''FrcServo''&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''PID Control'''.&lt;br /&gt;
* Introduce to the '''Motor Actuator''' class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator with optional preset positions&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=702</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=702"/>
		<updated>2024-07-28T18:03:58Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 2: Simple Servo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Simple Servo'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator with optional preset positions&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=701</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=701"/>
		<updated>2024-07-28T18:03:31Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 1: Simple Motor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to '''Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to '''Simple Motor'''.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator with optional preset positions&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=700</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=700"/>
		<updated>2024-07-28T18:02:30Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* '''Introduce to Visual Studio Code'''.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator with optional preset positions&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=699</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=699"/>
		<updated>2024-07-28T17:43:58Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo in the ''robotInit'' method.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator with optional preset positions&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator in Preferences.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object in the ''robotInit'' method.&lt;br /&gt;
**** Create Elevator object&lt;br /&gt;
**** Add code to zero calibrate the Elevator&lt;br /&gt;
*** '''Robot.java''': In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=698</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=698"/>
		<updated>2024-07-27T20:05:34Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 1: Simple Motor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=697</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=697"/>
		<updated>2024-07-27T20:04:20Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 1: Simple Motor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=696</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=696"/>
		<updated>2024-07-27T19:44:49Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press and back on a button release&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''RobotParams.java''': Add a switch for the Elevator.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=695</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=695"/>
		<updated>2024-07-27T07:04:14Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 3: Elevator Subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Elevator position PID control.&lt;br /&gt;
*** Tune Elevator gravity compensation.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=694</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=694"/>
		<updated>2024-07-27T07:03:33Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 4: Arm Subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce Arm Subsystem as a Motor Actuator.&lt;br /&gt;
** Exercise: Creating and Controlling an Arm as a Motor Actuator.&lt;br /&gt;
*** '''Arm.java''': Create a new class named ''Arm''.&lt;br /&gt;
**** Create the parameters for the Arm&lt;br /&gt;
**** Create the Arm as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Arm Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Arm object. Add code to zero calibrate the Arm.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Arm in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Arm power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Arm up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Arm status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Arm Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune Arm position PID control.&lt;br /&gt;
*** Tune Arm gravity compensation.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=693</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=693"/>
		<updated>2024-07-27T06:39:58Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 3: Elevator Subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=692</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=692"/>
		<updated>2024-07-27T06:38:35Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 9: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 10: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 14: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=691</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=691"/>
		<updated>2024-07-27T00:51:00Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo and Elevator Subsystems ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Servo&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=690</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=690"/>
		<updated>2024-07-27T00:50:04Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert Motor Direction (if appropriate)&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo and Elevator Subsystems ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=689</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=689"/>
		<updated>2024-07-27T00:48:27Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Introduce to Visual Studio Code.&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
* Introduce to Simple Motor.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Simple Servo and Elevator Subsystems ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to Simple Servo.&lt;br /&gt;
** Exercise: Creating and Controlling a Simple Servo.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Servo.&lt;br /&gt;
**** Create FrcServo&lt;br /&gt;
**** Set Logical Range&lt;br /&gt;
**** Set Physical Range&lt;br /&gt;
**** Set Maximum Step Rate&lt;br /&gt;
**** Add Servo Follower (if appropriate)&lt;br /&gt;
**** Invert Servo Direction (if appropriate)&lt;br /&gt;
**** Set Servo to initial position&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Simple Servo in TeleOp.&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to move servo to a set position on a button press&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set the servo power with the value&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the servo status: servo power, servo position.&lt;br /&gt;
* Introduce to PID Control.&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
**** Optionally set Elevator Preset Positions&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object. Add code to zero calibrate the Elevator.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower)&lt;br /&gt;
**** In the ''driverControllerButtonEvent'' method, add code to use the DPad to move the Elevator up and down the preset positions&lt;br /&gt;
**** In the ''updateStatus'' method, add code to display the Elevator status: power, pos/target, state of limit switches&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=688</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=688"/>
		<updated>2024-07-26T22:45:50Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Demo and students follow along:&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
** Exercise: Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the simple motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Introduce to PID Control&lt;br /&gt;
* Introduce to the Motor Actuator class.&lt;br /&gt;
** Motor Actuator Parameters:&lt;br /&gt;
*** setMotorInverted&lt;br /&gt;
*** setFollowerMotor&lt;br /&gt;
*** setLowerLimitSwitch&lt;br /&gt;
*** setUpperLimitSwitch&lt;br /&gt;
*** setExternalEncoder&lt;br /&gt;
*** setVoltageCompensationEnabled&lt;br /&gt;
*** setPositionScaleAndOffset&lt;br /&gt;
*** setPositionPresets&lt;br /&gt;
** Exercise: Creating and Controlling an Elevator as a Motor Actuator.&lt;br /&gt;
*** '''Elevator.java''': Create a new class named ''Elevator''.&lt;br /&gt;
**** Create the parameters for the Elevator&lt;br /&gt;
**** Create the Elevator as a Motor Actuator using the parameters&lt;br /&gt;
**** Enable software PID control&lt;br /&gt;
**** Set PID Coefficients and Tolerance&lt;br /&gt;
**** Set PID Power Compensation&lt;br /&gt;
**** Optionally set Stall Protection&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize the Elevator object.&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the Elevator in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set Elevator power with the value (setPower and setPidPower).&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the Elevator status: power, pos/target, state of limit switches.&lt;br /&gt;
*** Calibrate Elevator Scale, Offset and Position Limits.&lt;br /&gt;
*** Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=687</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=687"/>
		<updated>2024-07-22T17:36:38Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Day 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:CADTrainingDay1.pptx|Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Extrude (Cont.)&lt;br /&gt;
* Hole&lt;br /&gt;
* Fillet&lt;br /&gt;
* Chamfer&lt;br /&gt;
* Github Source control&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* Videos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=UKsTL-268RM&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=686</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=686"/>
		<updated>2024-07-22T17:35:28Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Day 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:CADTrainingDay1.pptx|Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Extrude (Cont.)&lt;br /&gt;
* Hole&lt;br /&gt;
* Fillet&lt;br /&gt;
* Chamfer&lt;br /&gt;
* Github Source control&lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=685</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=685"/>
		<updated>2024-07-21T21:13:52Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 1: Simple Motor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Demo and students follow along:&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
** Exercise: Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the simple motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=684</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=684"/>
		<updated>2024-07-21T19:57:12Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:CADTrainingDay1.pptx|Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=File:CADTrainingDay1.pptx&amp;diff=683</id>
		<title>File:CADTrainingDay1.pptx</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=File:CADTrainingDay1.pptx&amp;diff=683"/>
		<updated>2024-07-21T19:55:47Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=682</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=682"/>
		<updated>2024-07-21T19:40:06Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:CADTrainingDay1.pdf|Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=681</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=681"/>
		<updated>2024-07-21T19:39:04Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:CADTrainingDay1|Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=680</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=680"/>
		<updated>2024-07-21T19:33:34Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
* [[Media:https:CADTrainingDay1 Class slides]]&lt;br /&gt;
* Videos&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=678</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=678"/>
		<updated>2024-07-21T19:20:40Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=677</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=677"/>
		<updated>2024-07-21T19:20:11Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Day 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
==== Resources ====&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2XI6vPDATQ0&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=naJ_iy-H5BM&amp;amp;list=PLROUP1bV8REQNj5I6vyydhaAUO6IdgfXU&amp;amp;index=3&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ODBUG6SKNSw&amp;amp;list=PLtakexwsjr-A7v36qlffbzK1VelyP5c3c&amp;amp;index=2&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=676</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=676"/>
		<updated>2024-07-21T19:15:52Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Day 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=675</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=675"/>
		<updated>2024-07-21T19:15:06Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Day 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: 90-deg Gusset Plate&lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=674</id>
		<title>CAD Training</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=CAD_Training&amp;diff=674"/>
		<updated>2024-07-21T19:13:55Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Class Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this class is to provide enough skill to help you not get frustrated when working through the online tutorials, and to give you a forum to ask questions as you are working through the tutorials.&lt;br /&gt;
* This is a set of Tutorials that cover Basic use of the Software &lt;br /&gt;
** The most basic of features needed to do modeling and drawing of parts and assemblies.  &lt;br /&gt;
** Additional details, good to understand prior to doing advanced work &lt;br /&gt;
* The material presented here is not intended to cover all functionality &lt;br /&gt;
**Utilizes basic shapes / widgets &lt;br /&gt;
**Emphasis is on understanding the software, not complicated geometry &lt;br /&gt;
* This material together to help students that want additional practice from tutorials. &lt;br /&gt;
* This material helps the students focus on the important fundamentals relating to:  &lt;br /&gt;
** Parts: Modeling and Drawing &lt;br /&gt;
** Assemblies: Modeling and Drawing &lt;br /&gt;
&lt;br /&gt;
== CAD Software Installation ==&lt;br /&gt;
Before you can CAD robot parts, you need to install Source Control Software as well as CAD Software Components.&lt;br /&gt;
&lt;br /&gt;
=== Source Control Software ===&lt;br /&gt;
We use GitHub Desktop as our [https://en.wikipedia.org/wiki/Source_Code_Control_System source control] software that accesses our CAD files stored on the Internet at GitHub.com (GitHub repositories). Follow these instructions to set up and install software to access our GitHub repositories.&lt;br /&gt;
* Create a GitHub account if you do not already have one ([https://GitHub.com link here]).&lt;br /&gt;
* Our CAD repositories are private, so you need to send us your GitHub account ID so that we can grant you the access to them.&lt;br /&gt;
* Once we grant you the access, you should receive an invitation from your registered email to be a collaborator to the CAD repositories. Accept the invitation before continuing with the next steps.&lt;br /&gt;
* Download and install the GitHub Desktop software from [https://desktop.github.com here].&lt;br /&gt;
* Start GitHub Desktop, click ''File-&amp;gt;Clone repository...''&lt;br /&gt;
 [[File:GitHubDesktopFileClone.jpg|400px]]&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/Inventor.git''&lt;br /&gt;
* Enter the local path to clone the repository into. Please note that Windows may suggest cloning into your OneDrive folder. Unless you pay for huge storage on OneDrive, we recommend you change it to your local hard drive. For example:&lt;br /&gt;
 C:\Users\&amp;lt;You&amp;gt;\Document\GitHub&lt;br /&gt;
&lt;br /&gt;
 [[File:GitHubDesktopCloneRepo.jpg|600px]]&lt;br /&gt;
* Click the Clone button. This clones the Inventor container repository which includes a massive CADLibrary that contains all the vendor defined parts.&lt;br /&gt;
* Next step is to clone the CADTraining repository by clicking ''File-&amp;gt;Clone repository...''&lt;br /&gt;
* Select the URL tab and enter the repository URL: ''https://github.com/TitanRoboticsClub/CADTraining.git''&lt;br /&gt;
* Enter the local path to clone the repository into. This must be inside the Inventory project you cloned previously.&lt;br /&gt;
For example:&lt;br /&gt;
 C:\User\&amp;lt;You&amp;gt;\Document\GitHub\Inventor&lt;br /&gt;
* Click the Clone button.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have now successfully cloned the CADTraining repository.&lt;br /&gt;
&lt;br /&gt;
=== CAD Software Components ===&lt;br /&gt;
We use Autodesk Inventor as our CAD software. Autodesk provides free license for FIRST robotics teams. In general, CAD software requires relatively powerful computer hardware to run, especially in Computer Graphics. Our robot models will have less than 500 parts, so you can get by with minimum requirements as outlined below:&lt;br /&gt;
&lt;br /&gt;
[https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/System-requirements-for-Autodesk-Inventor-2025.html Autodesk Inventor System Requirements]&lt;br /&gt;
&lt;br /&gt;
To set up CAD software, you need to perform the following steps. A more in-depth software installation guide can be found [https://scribehow.com/shared/Create_an_Autodesk_student_account_and_installing_Inventor_Professional_2025__NhTNbqz-SyuEkXwDdiH26Q?referrer=documents here]&lt;br /&gt;
* Get an education account with Autodesk in order to obtain the proper education license [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here].&lt;br /&gt;
 [[File:Autodesk Login Page.jpg|800x800px]]&lt;br /&gt;
* Installing the latest Autodesk Inventor Pro [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here]. If you want to install Inventor on a Mac, follow this [https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/Can-I-install-Autodesk-Inventor-on-a-Mac.html link].&lt;br /&gt;
 [[File:Inventor Download for Edu.jpg|800x800px]]&lt;br /&gt;
* Optionally installing the latest Autodesk Inventor CAM [https://www.autodesk.com/education/gateway?sorting=featured&amp;amp;filters=individual here] if you are interested in learning CNC machining.&lt;br /&gt;
&lt;br /&gt;
== Class Syllabus ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Day 1 ===&lt;br /&gt;
* Inventor’s UI&lt;br /&gt;
* Ribbons&lt;br /&gt;
* Sketch Mode&lt;br /&gt;
** Create&lt;br /&gt;
** Modify: Trim, Extend, Split, Offset&lt;br /&gt;
** Patterns: Rectangular, Circular, Mirror&lt;br /&gt;
** Constraints (Dimension)&lt;br /&gt;
* Extrude&lt;br /&gt;
* Practice Sketching Exercise: 90 deg Gusset Plate &lt;br /&gt;
&lt;br /&gt;
=== Day 2 ===&lt;br /&gt;
* Constraints (cont)&lt;br /&gt;
* Modeling Mode&lt;br /&gt;
* Practice Sketching/Modeling exercise&lt;br /&gt;
* Vex T-Gusset Plate &lt;br /&gt;
* Modelling Mode &lt;br /&gt;
* Modify Commands (Basic Hole/Fillet/Chamfer)&lt;br /&gt;
* Model Feature Naming &lt;br /&gt;
* Hole Command &lt;br /&gt;
* Rev 15mm Corner Cube &lt;br /&gt;
&lt;br /&gt;
=== Day 3 ===&lt;br /&gt;
* Recap/Refresher&lt;br /&gt;
* Planes&lt;br /&gt;
* Intro to Revolve Command &lt;br /&gt;
* Torrid Ring &lt;br /&gt;
* (Wheel) Hub Detail &lt;br /&gt;
&lt;br /&gt;
=== Day 4 ===&lt;br /&gt;
* Modeling Best Practices&lt;br /&gt;
* Application Project&lt;br /&gt;
&lt;br /&gt;
=== Day 5 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Importing STEP files&lt;br /&gt;
* Content Center Placement&lt;br /&gt;
* Constraints &lt;br /&gt;
&lt;br /&gt;
=== Day 6 ===&lt;br /&gt;
* Assemblies&lt;br /&gt;
* Joints&lt;br /&gt;
* Design Accelerator (Potential)&lt;br /&gt;
* Project&lt;br /&gt;
&lt;br /&gt;
=== Day 7 ===&lt;br /&gt;
* Final Project (Day 1)&lt;br /&gt;
&lt;br /&gt;
=== Day 8 ===&lt;br /&gt;
&lt;br /&gt;
* Final Project (Day 2)&lt;br /&gt;
&lt;br /&gt;
== Parts Drawings ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2296-DR.pdf 90-deg Gusset Plate]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-21-2291-DR.pdf 30-deg Bracket Plate]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-3547-Drawing-20140115.PDF Vex T-Gusset]&lt;br /&gt;
* [https://content.vexrobotics.com/vexpro/pdf/217-4183-Drawing-20141111.PDF Face Bearing Mount]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1562-DR.pdf 15mm Corner Cube]&lt;br /&gt;
* [https://www.revrobotics.com/content/docs/REV-41-1479-DR.pdf 15mm Inside Corner Bracket]&lt;br /&gt;
* [https://cdn.andymark.com/media/W1siZiIsIjIwMjMvMDUvMzEvMTEvMTQvNTAvYzhiYmI0ODEtZWM2NC00MDU4LTgyZDctZThkNWIwMWVlODRkL2FtLTQ4MTkgIFR1YmUgUGx1ZyBmb3IgMXgxeC4xMjUucGRmIl1d/am-4819%20%20Tube%20Plug%20for%201x1x.125.pdf?sha=c680d6790baa3021 1x1 Tube Plug]&lt;br /&gt;
* [https://www.gobilda.com/1609-series-v-groove-bearing-4mm-id-x-13mm-od-6mm-thickness-2-pack V-Groove Bearing]&lt;br /&gt;
* [https://www.gobilda.com/3408-series-v-groove-pulley-2-pack V-Groove Bearing Pulley]&lt;br /&gt;
&lt;br /&gt;
== Lesson Videos ==&lt;br /&gt;
&lt;br /&gt;
=== Lesson 1 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=-zS30-9X7gs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 2 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LnJvxqCXtKw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 3 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hm4zqcYojhY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 4 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=zJLBLZ9QCrQ&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 5 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=gMCQE4Og4t4&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 6 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=Rlflh6WQNrE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 7 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=LdKLRd_IhVo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 8 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=JaNxjED4_9U&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 9 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=ClVxOFju8vM&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 10 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=5snvoeQqDWw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 11 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=0Sc237uvtmI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 12 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=CrWCzIjNHvY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lesson 13 ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=6wD4_tzYD58&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=673</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=673"/>
		<updated>2024-07-21T18:56:37Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class. FRC software installation instructions can be found [https://trc492.github.io/pages/FrcProgrammingSoftwareInstallation.html here].&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Demo and students follow along:&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
** Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the simple motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=672</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=672"/>
		<updated>2024-07-21T18:49:01Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Demo and students follow along:&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
** Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the simple motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;br /&gt;
&lt;br /&gt;
== Programming Software Installation ==&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class.&lt;br /&gt;
* [[FRC Programming Software Installation]]&lt;br /&gt;
* [[FTC Programming Software Installation]]&lt;br /&gt;
&lt;br /&gt;
== TeleOp Driving Your Robot Right Out-Of-The-Box ==&lt;br /&gt;
At this point, you should have installed all necessary software for developing robot code and also clone the robot template code from the GitHub repo. Since the template already contains basic code for three different kinds of robot base (Differential Drive, Mecanum Drive and Swerve Drive), it takes very few modifications to make it work with any of the three types of robots.&lt;br /&gt;
&lt;br /&gt;
* [[Driving FRC Swerve Drive Base in TeleOp]]&lt;br /&gt;
* [[Driving FTC Mecanum Drive Base in TeleOp]]&lt;br /&gt;
&lt;br /&gt;
== Creating Subsystems ==&lt;br /&gt;
Once the drive base is fully operational, the next step is to create subsystems for the robot such as Elevator, Arm, Intake, Grabber etc. It is a good practice to create subsystems as separate Java classes that encapsulate all hardware related to those subsystems. To create a subsystem, you need to determine the following:&lt;br /&gt;
* '''What hardware does the subsystem contain?''' This includes motors, actuators and sensors. For example, an elevator will most likely contain a motor to move it up and down, an encoder to keep track of its position and one or two limit switches to tell if the elevator has reached its lower or upper height limit.&lt;br /&gt;
* '''What operations does the subsystem support?''' For example, an elevator may have a method to allow the joystick to control it going up and down at various speed, a method to command the elevator to go to a certain height, and a method to command the elevator to go to next preset height up or down.&lt;br /&gt;
&lt;br /&gt;
Even though the game of each season changes, a lot of subsystems repeat themselves season after season. Therefore, our Framework Library provides generalized subsystems to handle most of the scenarios. Here are some typical subsystems you will find on a robot.&lt;br /&gt;
* '''[[Motor Actuator]]''': Motor is the most fundamental output device on a robot. It provides movements for mechanisms. Motor Actuators contain one or more motors, an encoder to keep track of its position and some limit switches to limit their movement. '''FIRST''' provided some basic motor classes (e.g. ''DcMotor/DcMotorEx'' for FTC and ''Phoenix5/Phoenix6/SparkMax'' for FRC). The Framework Library added a lot more features on top of that in the '''TrcMotor''' class. For example, it added support for a digital input sensor to reset the motor encoder automatically (limit switches). This is useful for using the motor in a complex actuator such as an arm or elevator when you may need to zero calibrate the zero position of the actuator using a lower limit switch. It also added support to provide velocity control and motor odometry. On top of the fundamental motor features, it also provided PID Controlled functionality. It can support either native motor close-loop control (position and velocity PID control) or software PID control in case some motors do not support native close-loop control (e.g. continuous servos). '''TrcMotor''' added support for lower and upper limit switches, motor stall protection for safety, multiple motors with synchronization (motor followers), zero position calibration, gravity compensation and much more. These advanced features made it trivial to implement complex subsystems such as swing arm, elevator, slide or pan and tilt. The built-in PIDF controller allows the arm or elevator to be controlled by an analog joystick to speed up or slow down the arm/elevator movement. It understands the arm/elevator position approaching the lower/upper position limits and will automatically slow down its movement. It also provides stall protection. If the PID Actuator got stuck and the motor is stalled, it can cut motor power to prevent it from burning out. It also allows a reset timeout so that the stall condition can be cleared after a certain period assuming the stall condition is caused by human temporarily. This allows the subsystem to resume its function and provides time for the motor to cool down. In addition, it also supports voltage compensation. It understands battery voltage drop and can compensate the power level sent to the motor.&lt;br /&gt;
* '''[[Servo Actuator]]''':&lt;br /&gt;
* '''[[Pneumatic Actuator]]''':&lt;br /&gt;
* '''[[Intake]]''':&lt;br /&gt;
* '''[[Conveyor]]''':&lt;br /&gt;
* '''[[Shooter]]''':&lt;br /&gt;
* '''[[Grabber]]''':&lt;br /&gt;
&lt;br /&gt;
== Connecting Subsystems to the Robot ==&lt;br /&gt;
* Instantiate the subsystems&lt;br /&gt;
* TeleOp control of the subsystems&lt;br /&gt;
* Display subsystem status&lt;br /&gt;
&lt;br /&gt;
== Writing Autonomous Code ==&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=671</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=671"/>
		<updated>2024-07-21T18:48:16Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Session 1: Simple Motor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Demo and students follow along:&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
** Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the simple motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
*** Create code to display the state of the simple motor on the Dashboard.&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;br /&gt;
&lt;br /&gt;
== Programming Software Installation ==&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class.&lt;br /&gt;
* [[FRC Programming Software Installation]]&lt;br /&gt;
* [[FTC Programming Software Installation]]&lt;br /&gt;
&lt;br /&gt;
== TeleOp Driving Your Robot Right Out-Of-The-Box ==&lt;br /&gt;
At this point, you should have installed all necessary software for developing robot code and also clone the robot template code from the GitHub repo. Since the template already contains basic code for three different kinds of robot base (Differential Drive, Mecanum Drive and Swerve Drive), it takes very few modifications to make it work with any of the three types of robots.&lt;br /&gt;
&lt;br /&gt;
* [[Driving FRC Swerve Drive Base in TeleOp]]&lt;br /&gt;
* [[Driving FTC Mecanum Drive Base in TeleOp]]&lt;br /&gt;
&lt;br /&gt;
== Creating Subsystems ==&lt;br /&gt;
Once the drive base is fully operational, the next step is to create subsystems for the robot such as Elevator, Arm, Intake, Grabber etc. It is a good practice to create subsystems as separate Java classes that encapsulate all hardware related to those subsystems. To create a subsystem, you need to determine the following:&lt;br /&gt;
* '''What hardware does the subsystem contain?''' This includes motors, actuators and sensors. For example, an elevator will most likely contain a motor to move it up and down, an encoder to keep track of its position and one or two limit switches to tell if the elevator has reached its lower or upper height limit.&lt;br /&gt;
* '''What operations does the subsystem support?''' For example, an elevator may have a method to allow the joystick to control it going up and down at various speed, a method to command the elevator to go to a certain height, and a method to command the elevator to go to next preset height up or down.&lt;br /&gt;
&lt;br /&gt;
Even though the game of each season changes, a lot of subsystems repeat themselves season after season. Therefore, our Framework Library provides generalized subsystems to handle most of the scenarios. Here are some typical subsystems you will find on a robot.&lt;br /&gt;
* '''[[Motor Actuator]]''': Motor is the most fundamental output device on a robot. It provides movements for mechanisms. Motor Actuators contain one or more motors, an encoder to keep track of its position and some limit switches to limit their movement. '''FIRST''' provided some basic motor classes (e.g. ''DcMotor/DcMotorEx'' for FTC and ''Phoenix5/Phoenix6/SparkMax'' for FRC). The Framework Library added a lot more features on top of that in the '''TrcMotor''' class. For example, it added support for a digital input sensor to reset the motor encoder automatically (limit switches). This is useful for using the motor in a complex actuator such as an arm or elevator when you may need to zero calibrate the zero position of the actuator using a lower limit switch. It also added support to provide velocity control and motor odometry. On top of the fundamental motor features, it also provided PID Controlled functionality. It can support either native motor close-loop control (position and velocity PID control) or software PID control in case some motors do not support native close-loop control (e.g. continuous servos). '''TrcMotor''' added support for lower and upper limit switches, motor stall protection for safety, multiple motors with synchronization (motor followers), zero position calibration, gravity compensation and much more. These advanced features made it trivial to implement complex subsystems such as swing arm, elevator, slide or pan and tilt. The built-in PIDF controller allows the arm or elevator to be controlled by an analog joystick to speed up or slow down the arm/elevator movement. It understands the arm/elevator position approaching the lower/upper position limits and will automatically slow down its movement. It also provides stall protection. If the PID Actuator got stuck and the motor is stalled, it can cut motor power to prevent it from burning out. It also allows a reset timeout so that the stall condition can be cleared after a certain period assuming the stall condition is caused by human temporarily. This allows the subsystem to resume its function and provides time for the motor to cool down. In addition, it also supports voltage compensation. It understands battery voltage drop and can compensate the power level sent to the motor.&lt;br /&gt;
* '''[[Servo Actuator]]''':&lt;br /&gt;
* '''[[Pneumatic Actuator]]''':&lt;br /&gt;
* '''[[Intake]]''':&lt;br /&gt;
* '''[[Conveyor]]''':&lt;br /&gt;
* '''[[Shooter]]''':&lt;br /&gt;
* '''[[Grabber]]''':&lt;br /&gt;
&lt;br /&gt;
== Connecting Subsystems to the Robot ==&lt;br /&gt;
* Instantiate the subsystems&lt;br /&gt;
* TeleOp control of the subsystems&lt;br /&gt;
* Display subsystem status&lt;br /&gt;
&lt;br /&gt;
== Writing Autonomous Code ==&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=670</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=670"/>
		<updated>2024-07-21T18:46:56Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Create GitHub account if not already have one.&lt;br /&gt;
* Download and install GitHub Desktop.&lt;br /&gt;
* Clone FrcTemplate project.&lt;br /&gt;
* Download and install WPILib with Visual Studio Code.&lt;br /&gt;
* Download and install Git Command Line tools.&lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Demo and students follow along:&lt;br /&gt;
** Start Visual Studio Code.&lt;br /&gt;
** Open FrcTemplate project in Visual Studio Code.&lt;br /&gt;
** Brief walk through of FrcTemplate code: Code organization (team492, trclib, frclib)&lt;br /&gt;
*** '''autocommands''': contains Autonomous code&lt;br /&gt;
*** '''autotasks''': contains Auto-Assist tasks&lt;br /&gt;
*** '''commandbased''': contains commandbased code (not used)&lt;br /&gt;
*** '''drivebases''': contains standard supported drive bases (Differential, Mecanum, Swerve)&lt;br /&gt;
*** '''subsystems''': contains code for all upper subsystems&lt;br /&gt;
*** '''Main.java''': main entry point of robot code (provided by ''FIRST'', do not change)&lt;br /&gt;
*** '''Robot.java''': top level robot object&lt;br /&gt;
*** '''RobotParams.java''': contains robot configurations and subsystem parameters&lt;br /&gt;
*** '''FrcAuto.java, FrcTeleOp.java, FrcTest.java, FrcDisabled.java''': contain code for respective robot run mode&lt;br /&gt;
** Brief walk through of Visual Studio Code.&lt;br /&gt;
*** WPILib Plug-in (commonly used operations)&lt;br /&gt;
**** '''Set Team Number''': set our team number 492 (Very important: team number is used to find our robot for pushing code)&lt;br /&gt;
**** '''Build Robot Code''': Compile your robot code&lt;br /&gt;
**** '''Depoloy Robot Code''': Compile and push code to robot&lt;br /&gt;
**** '''Debug Robot Code''': Compile, push code to robot and start real time debugger&lt;br /&gt;
**** '''Check for WPILib Updates''': Check for latest WPILib from the Internet&lt;br /&gt;
**** '''Manage Vendor Libraries''': Install/Remove/CheckUpdate of various 3rd party vendor libraries&lt;br /&gt;
*** Common Source Control Operations&lt;br /&gt;
**** '''Branches''': Create/Remove/Switch code branches&lt;br /&gt;
**** '''Fetch''': Sync latest changes from GitHub&lt;br /&gt;
**** '''Discard''': Discard changes to a file and revert back to last committed version&lt;br /&gt;
**** '''Stage''': Stage the changed file for commit&lt;br /&gt;
**** '''Compare changes''': Compare the changes with last committed version&lt;br /&gt;
**** '''Commit''': Commit changes to your local repository&lt;br /&gt;
**** '''Push''': Push changes from your local repository to GitHub&lt;br /&gt;
** Controlling a Simple Motor.&lt;br /&gt;
*** '''Robot.java''': Instantiate and initialize a Simple Motor.&lt;br /&gt;
**** Create FrcCANTalonSRX&lt;br /&gt;
**** Reset to factory default&lt;br /&gt;
**** Enable Voltage Compensation&lt;br /&gt;
**** Enable Brake Mode&lt;br /&gt;
**** Invert motor direction&lt;br /&gt;
*** '''FrcTeleOp.java''': Create code to control the simple motor in TeleOp.&lt;br /&gt;
**** In the ''periodic'' method, add code to read the gamepad joystick and set motor power with the value.&lt;br /&gt;
**** In the '''updateStatus''' method, add code to display the motor status: joystick value, actual motor power.&lt;br /&gt;
** Create code to display the state of the simple motor on the Dashboard.&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;br /&gt;
&lt;br /&gt;
== Programming Software Installation ==&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class.&lt;br /&gt;
* [[FRC Programming Software Installation]]&lt;br /&gt;
* [[FTC Programming Software Installation]]&lt;br /&gt;
&lt;br /&gt;
== TeleOp Driving Your Robot Right Out-Of-The-Box ==&lt;br /&gt;
At this point, you should have installed all necessary software for developing robot code and also clone the robot template code from the GitHub repo. Since the template already contains basic code for three different kinds of robot base (Differential Drive, Mecanum Drive and Swerve Drive), it takes very few modifications to make it work with any of the three types of robots.&lt;br /&gt;
&lt;br /&gt;
* [[Driving FRC Swerve Drive Base in TeleOp]]&lt;br /&gt;
* [[Driving FTC Mecanum Drive Base in TeleOp]]&lt;br /&gt;
&lt;br /&gt;
== Creating Subsystems ==&lt;br /&gt;
Once the drive base is fully operational, the next step is to create subsystems for the robot such as Elevator, Arm, Intake, Grabber etc. It is a good practice to create subsystems as separate Java classes that encapsulate all hardware related to those subsystems. To create a subsystem, you need to determine the following:&lt;br /&gt;
* '''What hardware does the subsystem contain?''' This includes motors, actuators and sensors. For example, an elevator will most likely contain a motor to move it up and down, an encoder to keep track of its position and one or two limit switches to tell if the elevator has reached its lower or upper height limit.&lt;br /&gt;
* '''What operations does the subsystem support?''' For example, an elevator may have a method to allow the joystick to control it going up and down at various speed, a method to command the elevator to go to a certain height, and a method to command the elevator to go to next preset height up or down.&lt;br /&gt;
&lt;br /&gt;
Even though the game of each season changes, a lot of subsystems repeat themselves season after season. Therefore, our Framework Library provides generalized subsystems to handle most of the scenarios. Here are some typical subsystems you will find on a robot.&lt;br /&gt;
* '''[[Motor Actuator]]''': Motor is the most fundamental output device on a robot. It provides movements for mechanisms. Motor Actuators contain one or more motors, an encoder to keep track of its position and some limit switches to limit their movement. '''FIRST''' provided some basic motor classes (e.g. ''DcMotor/DcMotorEx'' for FTC and ''Phoenix5/Phoenix6/SparkMax'' for FRC). The Framework Library added a lot more features on top of that in the '''TrcMotor''' class. For example, it added support for a digital input sensor to reset the motor encoder automatically (limit switches). This is useful for using the motor in a complex actuator such as an arm or elevator when you may need to zero calibrate the zero position of the actuator using a lower limit switch. It also added support to provide velocity control and motor odometry. On top of the fundamental motor features, it also provided PID Controlled functionality. It can support either native motor close-loop control (position and velocity PID control) or software PID control in case some motors do not support native close-loop control (e.g. continuous servos). '''TrcMotor''' added support for lower and upper limit switches, motor stall protection for safety, multiple motors with synchronization (motor followers), zero position calibration, gravity compensation and much more. These advanced features made it trivial to implement complex subsystems such as swing arm, elevator, slide or pan and tilt. The built-in PIDF controller allows the arm or elevator to be controlled by an analog joystick to speed up or slow down the arm/elevator movement. It understands the arm/elevator position approaching the lower/upper position limits and will automatically slow down its movement. It also provides stall protection. If the PID Actuator got stuck and the motor is stalled, it can cut motor power to prevent it from burning out. It also allows a reset timeout so that the stall condition can be cleared after a certain period assuming the stall condition is caused by human temporarily. This allows the subsystem to resume its function and provides time for the motor to cool down. In addition, it also supports voltage compensation. It understands battery voltage drop and can compensate the power level sent to the motor.&lt;br /&gt;
* '''[[Servo Actuator]]''':&lt;br /&gt;
* '''[[Pneumatic Actuator]]''':&lt;br /&gt;
* '''[[Intake]]''':&lt;br /&gt;
* '''[[Conveyor]]''':&lt;br /&gt;
* '''[[Shooter]]''':&lt;br /&gt;
* '''[[Grabber]]''':&lt;br /&gt;
&lt;br /&gt;
== Connecting Subsystems to the Robot ==&lt;br /&gt;
* Instantiate the subsystems&lt;br /&gt;
* TeleOp control of the subsystems&lt;br /&gt;
* Display subsystem status&lt;br /&gt;
&lt;br /&gt;
== Writing Autonomous Code ==&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=669</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=669"/>
		<updated>2024-07-21T16:59:47Z</updated>

		<summary type="html">&lt;p&gt;Mikets: /* Topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup.&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Import FrcTemplate into Visual Studio Code and compile it.&lt;br /&gt;
* Create code to instantiate a Simple Motor.&lt;br /&gt;
* Create code to control the simple motor in TeleOp.&lt;br /&gt;
* Create code to display the state of the simple motor on the Dashboard.&lt;br /&gt;
May introduce ''Elevator'' if time permits.&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;br /&gt;
&lt;br /&gt;
== Programming Software Installation ==&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class.&lt;br /&gt;
* [[FRC Programming Software Installation]]&lt;br /&gt;
* [[FTC Programming Software Installation]]&lt;br /&gt;
&lt;br /&gt;
== TeleOp Driving Your Robot Right Out-Of-The-Box ==&lt;br /&gt;
At this point, you should have installed all necessary software for developing robot code and also clone the robot template code from the GitHub repo. Since the template already contains basic code for three different kinds of robot base (Differential Drive, Mecanum Drive and Swerve Drive), it takes very few modifications to make it work with any of the three types of robots.&lt;br /&gt;
&lt;br /&gt;
* [[Driving FRC Swerve Drive Base in TeleOp]]&lt;br /&gt;
* [[Driving FTC Mecanum Drive Base in TeleOp]]&lt;br /&gt;
&lt;br /&gt;
== Creating Subsystems ==&lt;br /&gt;
Once the drive base is fully operational, the next step is to create subsystems for the robot such as Elevator, Arm, Intake, Grabber etc. It is a good practice to create subsystems as separate Java classes that encapsulate all hardware related to those subsystems. To create a subsystem, you need to determine the following:&lt;br /&gt;
* '''What hardware does the subsystem contain?''' This includes motors, actuators and sensors. For example, an elevator will most likely contain a motor to move it up and down, an encoder to keep track of its position and one or two limit switches to tell if the elevator has reached its lower or upper height limit.&lt;br /&gt;
* '''What operations does the subsystem support?''' For example, an elevator may have a method to allow the joystick to control it going up and down at various speed, a method to command the elevator to go to a certain height, and a method to command the elevator to go to next preset height up or down.&lt;br /&gt;
&lt;br /&gt;
Even though the game of each season changes, a lot of subsystems repeat themselves season after season. Therefore, our Framework Library provides generalized subsystems to handle most of the scenarios. Here are some typical subsystems you will find on a robot.&lt;br /&gt;
* '''[[Motor Actuator]]''': Motor is the most fundamental output device on a robot. It provides movements for mechanisms. Motor Actuators contain one or more motors, an encoder to keep track of its position and some limit switches to limit their movement. '''FIRST''' provided some basic motor classes (e.g. ''DcMotor/DcMotorEx'' for FTC and ''Phoenix5/Phoenix6/SparkMax'' for FRC). The Framework Library added a lot more features on top of that in the '''TrcMotor''' class. For example, it added support for a digital input sensor to reset the motor encoder automatically (limit switches). This is useful for using the motor in a complex actuator such as an arm or elevator when you may need to zero calibrate the zero position of the actuator using a lower limit switch. It also added support to provide velocity control and motor odometry. On top of the fundamental motor features, it also provided PID Controlled functionality. It can support either native motor close-loop control (position and velocity PID control) or software PID control in case some motors do not support native close-loop control (e.g. continuous servos). '''TrcMotor''' added support for lower and upper limit switches, motor stall protection for safety, multiple motors with synchronization (motor followers), zero position calibration, gravity compensation and much more. These advanced features made it trivial to implement complex subsystems such as swing arm, elevator, slide or pan and tilt. The built-in PIDF controller allows the arm or elevator to be controlled by an analog joystick to speed up or slow down the arm/elevator movement. It understands the arm/elevator position approaching the lower/upper position limits and will automatically slow down its movement. It also provides stall protection. If the PID Actuator got stuck and the motor is stalled, it can cut motor power to prevent it from burning out. It also allows a reset timeout so that the stall condition can be cleared after a certain period assuming the stall condition is caused by human temporarily. This allows the subsystem to resume its function and provides time for the motor to cool down. In addition, it also supports voltage compensation. It understands battery voltage drop and can compensate the power level sent to the motor.&lt;br /&gt;
* '''[[Servo Actuator]]''':&lt;br /&gt;
* '''[[Pneumatic Actuator]]''':&lt;br /&gt;
* '''[[Intake]]''':&lt;br /&gt;
* '''[[Conveyor]]''':&lt;br /&gt;
* '''[[Shooter]]''':&lt;br /&gt;
* '''[[Grabber]]''':&lt;br /&gt;
&lt;br /&gt;
== Connecting Subsystems to the Robot ==&lt;br /&gt;
* Instantiate the subsystems&lt;br /&gt;
* TeleOp control of the subsystems&lt;br /&gt;
* Display subsystem status&lt;br /&gt;
&lt;br /&gt;
== Writing Autonomous Code ==&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
	<entry>
		<id>http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=668</id>
		<title>Advanced Robotics Programming</title>
		<link rel="alternate" type="text/html" href="http://trcnet.asuscomm.com/mediawiki/index.php?title=Advanced_Robotics_Programming&amp;diff=668"/>
		<updated>2024-07-21T16:59:07Z</updated>

		<summary type="html">&lt;p&gt;Mikets: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Advanced Robotics Programming Class focuses on teaching our ''Titan Robotics Framework'' (TRC Library). The target audience is for students who already know the Java language. Titan Robotics Framework is designed for both FTC and FRC. After finishing this class, you should be able to write code for both FTC and FRC robots with minimal platform specific changes.&lt;br /&gt;
&lt;br /&gt;
== Titan Robotics Framework ==&lt;br /&gt;
You can read about our Framework Library [https://trc492.github.io/pages/AdvancedRoboticsProgramming.html here]&lt;br /&gt;
&lt;br /&gt;
== Class Curriculum ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Work ===&lt;br /&gt;
* Software Downloads / Setup &lt;br /&gt;
* GitHub Setup &lt;br /&gt;
&lt;br /&gt;
=== Session 1: Simple Motor ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Simple DC motor&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Verify software setup. ￼&lt;br /&gt;
** Visual Studio Code with WPILib&lt;br /&gt;
** FrcTemplate project cloned&lt;br /&gt;
* Import FrcTemplate into Visual Studio Code and compile it. ￼&lt;br /&gt;
* Create code to instantiate a Simple Motor.&lt;br /&gt;
* Create code to control the simple motor in TeleOp.&lt;br /&gt;
* Create code to display the state of the simple motor on the Dashboard.&lt;br /&gt;
May introduce ''Elevator'' if time permits.&lt;br /&gt;
&lt;br /&gt;
=== Session 2: Elevator Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Screw-driven elevator&lt;br /&gt;
* DC motor with built-in encoder&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Elevator class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Elevator subsystem.&lt;br /&gt;
* Create code to control the elevator in TeleOp.&lt;br /&gt;
* Create code to display the state of elevator on the Dashboard.&lt;br /&gt;
* Calibrate elevator scale, offset and position limits.&lt;br /&gt;
* Tune elevator position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 3: Arm Subsystem ===&lt;br /&gt;
===== Hardware =====&lt;br /&gt;
* Swing Arm with elbow&lt;br /&gt;
* DC motor with built-in encoder to drive the elbow&lt;br /&gt;
* Lower limit switch (optional)&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Arm class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate an Arm subsystem.&lt;br /&gt;
* Create code to control the arm in TeleOp.&lt;br /&gt;
* Create code to display the state of the arm on the Dashboard.&lt;br /&gt;
* Calibrate arm scale, offset and position limits.&lt;br /&gt;
* Tune gravity compensation.&lt;br /&gt;
* Tune arm position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 4: Turret Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Turret with rotating base (Old FRC turret stored on the shop shelf?)&lt;br /&gt;
* DC motor with built-in encoder to drive the rotating base&lt;br /&gt;
* Zero position limit switch&lt;br /&gt;
* Rotation direction limit switch&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Turret class as a Motor Actuator.&lt;br /&gt;
* Create code to instantiate a Turret subsystem.&lt;br /&gt;
* Create code to control the turret in TeleOp.&lt;br /&gt;
* Create code to display the state of the turret on the Dashboard.&lt;br /&gt;
* Determine the turret rotation scale.&lt;br /&gt;
* Tune turret position PID control.&lt;br /&gt;
May continue to the next session if time runs out.&lt;br /&gt;
&lt;br /&gt;
=== Session 5: Intake Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* Intake with rotating brushes or rollers (Build one based on FTC Centerstage Intake)&lt;br /&gt;
* DC motor (no encoder needed) to drive the intake&lt;br /&gt;
* Sensor to detect the presence of game element taken in&lt;br /&gt;
* Robot-In-A-Box&lt;br /&gt;
* Driver Station with a Gamepad&lt;br /&gt;
==== Topics ====&lt;br /&gt;
* Create the Intake class.&lt;br /&gt;
* Create code to instantiate an Intake subsystem.&lt;br /&gt;
* Create code to control the intake in TeleOp.&lt;br /&gt;
* Create code to display the state of the intake on the Dashboard.&lt;br /&gt;
* Tune the analog threshold value if it is an analog sensor.&lt;br /&gt;
&lt;br /&gt;
=== Session 6: Grabber Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 7: Shooter Subsystem ===&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
==== Topics ====&lt;br /&gt;
&lt;br /&gt;
=== Session 8: Vision Subsystem ===&lt;br /&gt;
* AprilTag Detection&lt;br /&gt;
* Object Detection&lt;br /&gt;
* Color Blob Detection&lt;br /&gt;
&lt;br /&gt;
=== Session 9: DriveBase Subsystem ===&lt;br /&gt;
* Swerve PID Tuning&lt;br /&gt;
* Odometry Tuning&lt;br /&gt;
* DriveBase PID Tuning&lt;br /&gt;
&lt;br /&gt;
=== Session 10: Path Following ===&lt;br /&gt;
* PurePursuit&lt;br /&gt;
&lt;br /&gt;
=== Session 11: Auto-Assist Pickup ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Intake&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 12: Auto-Assist Shoot ===&lt;br /&gt;
* DriveBase&lt;br /&gt;
* Shooter&lt;br /&gt;
* Vision&lt;br /&gt;
&lt;br /&gt;
=== Session 13: Autonomous ===&lt;br /&gt;
* Asynchronous operations&lt;br /&gt;
* Synchronization&lt;br /&gt;
* State machine&lt;br /&gt;
&lt;br /&gt;
== Programming Software Installation ==&lt;br /&gt;
Before coming to the programming class, you need to install the required software on your laptop. Please do this at home before coming to class. We do not want to dedicate class time to install software because they are time consuming and require downloading gigabytes of data from the Internet which would overwhelm our Internet bandwidth if all students were downloading at the same time. Therefore, please make sure you finish these tasks at home before coming to class.&lt;br /&gt;
* [[FRC Programming Software Installation]]&lt;br /&gt;
* [[FTC Programming Software Installation]]&lt;br /&gt;
&lt;br /&gt;
== TeleOp Driving Your Robot Right Out-Of-The-Box ==&lt;br /&gt;
At this point, you should have installed all necessary software for developing robot code and also clone the robot template code from the GitHub repo. Since the template already contains basic code for three different kinds of robot base (Differential Drive, Mecanum Drive and Swerve Drive), it takes very few modifications to make it work with any of the three types of robots.&lt;br /&gt;
&lt;br /&gt;
* [[Driving FRC Swerve Drive Base in TeleOp]]&lt;br /&gt;
* [[Driving FTC Mecanum Drive Base in TeleOp]]&lt;br /&gt;
&lt;br /&gt;
== Creating Subsystems ==&lt;br /&gt;
Once the drive base is fully operational, the next step is to create subsystems for the robot such as Elevator, Arm, Intake, Grabber etc. It is a good practice to create subsystems as separate Java classes that encapsulate all hardware related to those subsystems. To create a subsystem, you need to determine the following:&lt;br /&gt;
* '''What hardware does the subsystem contain?''' This includes motors, actuators and sensors. For example, an elevator will most likely contain a motor to move it up and down, an encoder to keep track of its position and one or two limit switches to tell if the elevator has reached its lower or upper height limit.&lt;br /&gt;
* '''What operations does the subsystem support?''' For example, an elevator may have a method to allow the joystick to control it going up and down at various speed, a method to command the elevator to go to a certain height, and a method to command the elevator to go to next preset height up or down.&lt;br /&gt;
&lt;br /&gt;
Even though the game of each season changes, a lot of subsystems repeat themselves season after season. Therefore, our Framework Library provides generalized subsystems to handle most of the scenarios. Here are some typical subsystems you will find on a robot.&lt;br /&gt;
* '''[[Motor Actuator]]''': Motor is the most fundamental output device on a robot. It provides movements for mechanisms. Motor Actuators contain one or more motors, an encoder to keep track of its position and some limit switches to limit their movement. '''FIRST''' provided some basic motor classes (e.g. ''DcMotor/DcMotorEx'' for FTC and ''Phoenix5/Phoenix6/SparkMax'' for FRC). The Framework Library added a lot more features on top of that in the '''TrcMotor''' class. For example, it added support for a digital input sensor to reset the motor encoder automatically (limit switches). This is useful for using the motor in a complex actuator such as an arm or elevator when you may need to zero calibrate the zero position of the actuator using a lower limit switch. It also added support to provide velocity control and motor odometry. On top of the fundamental motor features, it also provided PID Controlled functionality. It can support either native motor close-loop control (position and velocity PID control) or software PID control in case some motors do not support native close-loop control (e.g. continuous servos). '''TrcMotor''' added support for lower and upper limit switches, motor stall protection for safety, multiple motors with synchronization (motor followers), zero position calibration, gravity compensation and much more. These advanced features made it trivial to implement complex subsystems such as swing arm, elevator, slide or pan and tilt. The built-in PIDF controller allows the arm or elevator to be controlled by an analog joystick to speed up or slow down the arm/elevator movement. It understands the arm/elevator position approaching the lower/upper position limits and will automatically slow down its movement. It also provides stall protection. If the PID Actuator got stuck and the motor is stalled, it can cut motor power to prevent it from burning out. It also allows a reset timeout so that the stall condition can be cleared after a certain period assuming the stall condition is caused by human temporarily. This allows the subsystem to resume its function and provides time for the motor to cool down. In addition, it also supports voltage compensation. It understands battery voltage drop and can compensate the power level sent to the motor.&lt;br /&gt;
* '''[[Servo Actuator]]''':&lt;br /&gt;
* '''[[Pneumatic Actuator]]''':&lt;br /&gt;
* '''[[Intake]]''':&lt;br /&gt;
* '''[[Conveyor]]''':&lt;br /&gt;
* '''[[Shooter]]''':&lt;br /&gt;
* '''[[Grabber]]''':&lt;br /&gt;
&lt;br /&gt;
== Connecting Subsystems to the Robot ==&lt;br /&gt;
* Instantiate the subsystems&lt;br /&gt;
* TeleOp control of the subsystems&lt;br /&gt;
* Display subsystem status&lt;br /&gt;
&lt;br /&gt;
== Writing Autonomous Code ==&lt;/div&gt;</summary>
		<author><name>Mikets</name></author>
	</entry>
</feed>