Blog - February 2017
Day 29 & 30: Getting Ready for Competition Season
Today, we worked on solving the funneling speed issue by placing a set of 4 rollers at the end of the hopper floor and above the wedges to provide a force pushing the ball forwards. This worked extremely well as our output increased to around 10 balls per second. More work needs to be done with different wheels and friction surfaces on the rollers and wedges to further increase our output.
We worked on pneumatically actuating the gear grabber by activating the solenoids individually. We are going to work on a state machine for Monday to make it more intuitive for drivers. We also deployed a sine scaling function to the driver inputs to significantly improve robot driving. We tuned the path following program by fixing some bugs and also investigated using the talon magic motion profile. We also developed the state machine for the gear grabber.
Day 28: Bag and Tag Day
Today, we started by receiving news that after visiting 3 anodizing places, we could get parts for our hopper and hanger anodized for the competition robot. After calling, we knew that we would receive parts by 4, so we had to get everything ready for that time. The first thing we did was find every screw, every tool, every part, needed to assemble those subassemblies the moment they arrived. We then, finished the side panels and assembled the hopper. As soon as the parts arrived, we built up the entire robot and cleaned it, the best we could. We proceeded to take robot photos, and then diagnose the robot.
We also spent majority of the day working on a battery tab mount to keep the battery leads away from the hopper floor. The battery tab mounts to the PDP and fastens the Andersons together.
We found the shooter to have some issues that need to be dealt with, but physically fixing them must be pushed off until SFR. The robot was bagged around 10 minutes before 9pm.
Yesterday, we worked on assembling and attaching the hopper container. While we waited for the anodized parts for the hopper floor and climber to come in, a group of students worked on assembling the main components of the hopper while carefully avoiding smudging the sponsor side panels before pictures. After prepping everything and waiting for other subsystems to be assembled and attached, we riveted and bolted on the hopper in under 10 minutes to allow media time to take pictures and then carry out any final checks before bag and tag.
Today, we worked on tuning our autonomous program some more. We discovered that the bug from yesterday was caused by two segments of the path not lining up, causing the pure pursuit controller to go out of control as it attempted to move the robot to the correct position. We managed to get a fully working autonomous mode that scored a gear, activated the hopper, then shot around 40 balls into the boiler. We noticed some inconsistencies with the gear scoring segment of the auto, most likely caused by wheel slippage. We didn't have enough time to fully resolve this issue, so we will continue to work on it this weekend.
Day 26 and 27: Continued Assembly and Programming
Today, we made sizable progress on the hopper. We made an initial prototype which we iterated upon to account for unforeseen difficulties. After getting it to deploy efficiently, we were able to store a max ball capacity of 140 balls. We are struggling with rigidity, however, as the 1/16 polycarbonate hopper flexes greatly when under stress from the balls and simultaneously driving. We will put aside fixing this problem for now as we have to finish putting together a robot for bag and tag.
We have almost completed wiring on the practice robot. We are waiting on a few competition subsystems to be assembled then we will be moving on to pneumatics. Last night, we had the robot shooting a few balls. Once we finish the hopper, we should be able to practice driving.
On Sunday build, we worked on a hopper gate latch to lock down the assembly during the match. Changes still have to be made to make the latch feasible.
Today, we worked on assembling the hopper floor and finalizing it. We completely finished construction of the hopper floor. We worked on pneumatics and fixing the pneumatic tubing on the competition robot. We made progress on the side panels, which are coming along nicely. We also worked on general parts of the robot, but we still have a lot to do before tomorrow.
Today, we worked on creating an updated version of the Waypoint maker app. This new app outputs java files to load on the robot. We also created a parser on the robot which converts these waypoints into path segments for the Adaptive Pure Pursuit Controller.
Another project we worked on was implementing a turn in place autonomous action. We also made a couple auto paths to drop gears off and activate the hopper. We ran into some problems with motion profiling that we will fix tomorrow.
We rewrote the TCP server which sends data about the robot state to a web interface to be graphed. We used a library found on GitHub to do this. Next time, we will incorporate this into the rest of the Robot code and test it with the roboRIO.
Day 24 and 25: Continued Assembly and Programming
We have almost completed wiring on the practice robot. We are waiting on a few competition subsystems to be assembled then we will be moving on to pneumatics. Last night, we had the robot shooting a few balls. Once we finish the hopper, we should be able to practice driving. The programming team finished vision tracking to auto-aim at the vision target on the goal.
We assembled the hopper floor. The hopper floor originally had a .0010 nominal distance for the pulleys. After making the plates, we found that such a small distance caused too much tension, so we had to redesign it. We then, laser cut 5 different plates ranging from .0020 – .0060 of an inch.The .0060 of an inch measurement was the best way to go. Then, we put this measurement into the CAD and remachined those plates, which were put together. But, it was still too tight and required spacers in the standoffs. We put the spacers and it improved feeder consistency and reduced feeder tension. For the feeder, we had no way to service the 775’s due to very quick design restrictions, which would not be good at competition. So, we created holes on the side and top polycarb plates on the chute itself.
Today, we worked to lock down the design of the climber for the robot. We will be using a winch which it connected to a power take-off from the shooter to use the 4x 775 pro motors there to climb. The winch starts stowed against the hood and is deployed by pneumatic cylinders to the perimeter of the robot size box after the start of the match. Note that there will be hard stops (rope or cable) so that the force of hanging does not pass through the pneumatic cylinders.
The winch is connected to the shooter shaft with a hex coupler and a pulley which rides on a one-way bearing on a shoulder bolt. When the shooter spins in forward, the bearing will clutch. When the shooter reverses direction, the bearing will lock and drive the winch. Note that the shoulder bolt is left-hand threaded so that the torque of climbing tightens the bolt.
The total gear ratio is 25.7:1 from the 775pro motors. This should give an expected current draw of around 80 amps when climbing. The 12:36 reduction is in the shooter gearbox. The 18:36 reduction is the belt between the shooter and the climber gearbox. The 14:60 reduction lives in the climber gearbox (with a 30T direction-reversing idler gear) and the 1:1 reduction is the chain from the gear box to the winch spool.
We plan to spool up a piece of velcro-coated webbing on a 1.25" diameter 1/8" wall thickness aluminum tube. FEA simulation shows that the expected bending on a 23" long tube of these dimensions should be around 1/16" in the middle (with purely elastic deformation).
Work still needs to be done on detailing the right side support plates, and the drum.
Today, we worked on building the bumpers for the robots. We made 4 bumper frames, secured pool noodles to the outside of all 4, and put sailcloth around 1. We will finish up the sailcloth tomorrow, and we plan to put on the team numbers soon as well.
We assembled and began to test the existing gear mechanism with the "fingers", but it had a few flaws. One group worked on fixing the existing gear grabber, while another prototyped another design using compliant wheels and a polycarbonate wedge on the bottom. The initial prototype was promising, but needed some work in order to be consistent. We plan to continue working on both tomorrow.
Autonomous Path Follower
We began integration of the autonomous path follower into the main framework of our code and began debugging the path follower. We discovered some issues but were able to solve most of them.
Today’s biggest accomplishment was finalizing all the state machines for the Superstructure. Because of this, we were able to automatically detected the boiler goal, align to the boiler, and shooter balls towards it. This is a major step forward since we were able to integrate across multiple subsystems.
Day 23: Continued Assembly Hopper Progress
Almost all our parts are back from anodizing and we are trying to rapidly assemble as much of the robot as possible. The team working on putting surgical tubing over the rollers is almost finished and just needs to trim the excess off of each edge. The intake team finished assembling their first subsystem and is ready to mount it to the robot and assemble the rest. They had some trouble locating the appropriate timing belts, but now are ready to assemble. The shooter team also collected all their hardware. They just need to laser cut the rest of the polycarb and delrin plates, assemble the other shooters, and mount on the robot. Superstructure wiring was set back when we had to unfish the wires and drill additional holes in the weldment, and we are not back on track and ready to terminate the shooter wires. Late in the evening, a team of students and mentors stayed late to double check our inventory to ensure that we have ordered everything that we need to complete the robot by Tuesday. We are hoping to finish assembling intakes, shooters, and feeders today and at least one conveyor assembly as well. Wiring should be able to finish the practice and comp robot shooters and begin wiring the other subsystems.
Today we have finished all the feeders for the field by attaching the tops to the base. We have all the polycarb cut for the hoppers, but need people to cut the pipe that slides in and zip tie them on. The prototyping for the driver station to boiler mount is almost finished. The final idea has been decided and is going through final stages of being designed. The 2×2 wood for the boilers net have been cut, and all that is left is to place them on and attach the netting.
We decided to scrap the PixyCam system and use two separate camera systems, the Android phone, and a webcam connected to the RoboRIO. The Android phone system is the same system that we used last year but trained for this year’s boiler targets. We worked on getting the phone mount ready to mount on the robot. The webcam will be used for the gear placement; it connects to the RoboRIO via USB and serves live video to SmartDashboard via MJPEG. We were able to view a live stream of video on SmartDashboard, and we began work on identifying the boiler targets with the webcam’s stream on the RoboRIO.
We also worked some more on the Autonomous Pathing system. First, we got the pathing system working with the new RobotState class, replacing the old Odometer class to keep track of robot position and heading. We also added linear interpolation to the lookahead point of the last segment of the path. This was in order to fix a problem where the robot would jerk sharply at the end of the path, causing its heading to end up out of place. Finally, we worked on tuning the wheel radius so the RobotState class would give a more accurate position. After making these improvements to the pathing system, we worked on tuning PID for the drivebase using the built-in talon PID control. Tuning Kf went smoothly, but we ran into some problems with tuning Kp. Even extremely small Kp values would cause the robot to turn wildly, and we weren't able to find out exactly what was causing this problem today.
Day 22: Finishing Up The Field
Today was a productive manufacturing and assembly day even though we didn't have our anodized parts back. We took off the superstructure today to make holes to run wiring from the shooter and feeder motors and encoders from the top of the superstructure to the drivebase. We began fishing wires, but were not able to finish because we have to add more holes to the superstructure to mount the feeder roller plates. Tomorrow we should have several parts back from anodizing and we can begin to assemble several subsystems including the intake, superstructure, shooter, and feeder. Manufacturing will also continue on the hopper polycarb pieces.
Today we finished up all 6 of the feeder stations for the field. We also changed all the plastic from the previously used HDPE to the new official colored plastic, which allows gears and balls to slide down it much more easily. We plan to continue with field work, with the next tasks being to finish the more complex airships and assemble the field side walls/driver stations.
We made leaps and bounds towards cleaning up our Github codebase and making work far easier Previously, our codebase had sprawled across multiple branches, each with their own versions of essential robot code, which made collaboration difficult. We merged the latest autonomous and camera code into the master branch. In the future, we will ensure that all code remains within three commits of the Master branch, and we will pull far more frequently.
We also began integrating the code for the Nexus phone camera system, as well as the robot state machine, into our codebase. The Nexus vision system was used with great success last year but is far more complicated than our PixyCam system. We will test the PixyCam again, using the central point on the top segment instead of the centroid (a far more consistent, reliable means of estimating the distance), and the accuracy/reliability will determine whether we use the PixyCam or the Nexus phone.
The drivebase PID control was tuned for our unweighted robot drivebase to compensate for mechanical differences. Previously, we set a constant voltage to the motor to control the robot’s speed, called open-loop control. This does not take into account different mechanical differences, like gearbox lubrication or bits of carpet stuck in gearboxes (a problem we saw). Now, instead of swerving, the drivebase drives in a straight line!
Finally, we began work on integrating an infrared laser distance sensor into our robot code. The sensor turns on a high-power infrared laser beam and measures the time taken for the beam to reflect back to a detector, then uses that information to calculate the distance between the sensor and the object. This “time of flight” sensor has great accuracy, and we envision using it in conjunction with our camera system to accurately measure distances and aim appropriately.
Day 20 & 21: Field and Robot Construction
We are focusing heavily on manufacturing to make sure all the parts for the robot are ready; we sent several parts to anodize this morning. We also have a shooter and intake assembled and hope to finish the feeder chute assembled in the next two days.
Today we worked on further field development. We have gotten to a point in which we are waiting for material resources to proceed. We accounted for field development mistakes, and finished the boilers. In addition, the top pieces of the airships were mismeasured, and must be recut and rewelded. We also focused on the feeder stations for the gears and balls. We laser cut the majority of the parts and manually cut the rest of them on the chop saw/bandsaw, and then assembled 6 feeder stations to make a full field. 2 are completely done, and the other 4 are all missing one piece before they are also done. We hope to finish the field by Monday night.
We have completed the CADs for the Bumper, Intake, Shooter, Superstructure, and Drive base – all of which have begun manufacturing/assembly or will be soon. The Intake is a two-roller assembly powered by two 775 Pros in a 3-1 gear ratio with a polycarbonate ramp to assist the ball path as it enters the robot. The Shooter is two 4” Fairlane Single Wheel Backspin shooters side-by-side powered by 4 775 pros. This will also power the Velcro-winch hanging system at the end of the match.
We made lots of progress on the Hopper Container and Conveyor and will hopefully be able to begin manufacturing soon. For the hopper container, the width-expansion constraint geometry needs to be finalized and the bend radius on the actual break needs to be accounted for in the bend radii on our “sheet metal” plastic parts. The conveyor at this point in time is complete, we are currently finishing up the detailing of screws and etc. This is waiting mentor approval before manufacturing. The Feeder and Chute are done for the most part, they only need to be confirmed against the final geometry of the conveyor floor which was finished today. Progress was made on the climber subsystem today, as well.
We worked on a flange for the Velcro drum/roller to displace the touch sensor on the davit with a 3-part rotating flange that stows within the frame perimeter and deploys like a fan with surgical tubing to a circular flange encompassing the roller and providing enough distance between the OD of the flange and the OD of the roller (with Velcro bundled) to displace the touchpad approximately .5” – 1.5”. Moving forward, we want to begin manufacturing on as many things as possible, while fine tuning and checking for interference in CAD. A semi-detailed list of next steps in linked above.
Day 19: Prototyping, Drivebase, and Programming
The shooter design is almost done. We are moving forward with 20 degree trajectory and tangent hood section out to 45 degree, to match the prototype. It should be ready to make this weekend.
The chute design is coming along. We will need to make it angled to fit gear grabber.
The gear grabber concept is complete and detailed design is moving along well. We should be able to make it by early next week. We need the chute mods to be able to hold the gear and fit it in the sizing box.
We worked on getting the superstructure ready for powder coating after welding. Then, we put holes in the frame to attach the superstructure to. We also then made some parts for intake well we CNC the other parts for the intake to get it ready for welding today. We also organized the metal in the shipping container.
On Tuesday, we tested our autonomous path code, which uses a web interface to plot an autonomous robot path. It worked; the robot moved along the plotted path with ~2 inches of its target! There were a few kinks that we are still resolving, though. The robot uses a NavX IMU (inertial measurement unit) to determine the robot’s heading, and the NavX board was throwing errors because there were multiple instances of the same board. This was resolved, but we still have to clean up the code to avoid these issues in the future. At the end of the path, the robot unexpectedly darted backwards; we have to fix that.. Finally, we tuned the drivebase PID constants for low gear but need to do the same for high gear, which the robot will likely operate in.
Today, we also revised the PixyCam software in order to make it more threadsafe. Rather than our current model, where we make calls to a PixyCam object, we changed the code to use a Listener interface- the PIxyCam object publishes an “event” whenever targets (aka “blocks”) are detected, on a different thread, and a listener on the main thread will handle each block when necessary. This makes the code more threadsafe- if the SPI driver crashes, it will not bring down the entire robot.
We also corrected the PixyCam distance estimation formulas to be much more accurate. Before, we were using the block height and width to calculate distance. However, the block height and width are very susceptible to noise and change minimally with distance. We switched to using the centroid of the target, which is far more evident to the PixyCam and therefore more accurate. We were able to calculate the distance to the boiler, plus-minus 10 inches, likely because of our setup and camera calibration.
For the drive code, we added in the ability to shift between low and high gear (using the pneumatics). We use the low gear mode on the robot when we need to move slower, but with more torque/power (e.g. when we’re aiming to shoot), and we use the high gear when we are barreling full speed down the field. Shifting is accomplished with pneumatics and dog collars. This is not quite a six-speed manual transmission, but two speeds is sufficient for our needs.
Day 18: Hopper Progress
Hopper / Feeder
Today we continued work on the hopper/feeder prototype. We went through a few more iterations revolving around the central design of a powered floor of rollers, but nothing seemed to stand out as notably better than what we started with. We tried putting Teflon tape on certain parts of the rollers to speed up feeding and we tried moving the ridge that creates two channels of balls higher up. We also experimented with passive back-feeder funneling methods, but realized that having a passive funnel in the back would be difficult to design with our high throughput goals in mind. None of these led to a significant improvement in the feeding rate. Going forward, we are most likely going to manufacture and use the powered floor with rollers, although it does leave some performance to be desired. Next build, we need to test the conveyor system and a center peak in the hopper itself.
Today, we made progress on assembling the bumper mounts and robot stand.
Day 17: Prototyping, Drivebase, CAD
Today was essentially our drop dead date for finalizing 90% of the hopper in CAD. We took our roller design and decided to ship it, with a center to center distance of less than 50mm, as the 55mm on the prototype was too much. While the CAD team was designing, we iterated on funneling methods and found that we could probably use a passive funneling method on the base of the hopper. This passive method worked surprisingly well. We also found that the zip-ties we added onto the rollers did their jobs too well. They acted as small 'fingers' and flung balls. While this is the intended effect, we did not want this at the end of the hopper, and removed the zip ties on half of the prototype. This solution decreased entropy and increased throughput. The design that we have now isn’t the best it could be, but has been designed with adaptability in mind for the future. After deciding on rollers, we continued to iterate on the design with wrapping cloth over the rollers rather than simply belt. We found that this solution has promise and decreases popcorning of the balls. We will continue to iterate on this method next build. We also theorized that if we create a large enough crown on parts of rollers, we might be able to have a significantly faster feeding method with little no change, that could also increase throughput. We will work on this next build as well.
Today, we finalized the intake prototype after many iterations, and it was CADed into the current robot design. It performs very effectively, being relatively light and simple, but still meeting the goal of picking up every ball in front of the robot at top speed. One improvement that led to the final design today was switching the 1/4" wall surgical tubing on the rollers for 1/8" wall surgical tubing (and adjusting the geometry accordingly), which performs the same but saves a whole pound of weight. Another key change was the ramp, which was changed to 3.5" long rather than the previous 5", and was made intentionally flexible to allow faster intaking and less bogging down as large groups of balls come in simultaneously. The plan for the future is to finalize the intake CAD and to manufacture/assemble it.
Today, we worked a lot on the gear intake. Although previous prototypes had been very successful and gave us a really good starting point, one factor we hadn’t looked into very deeply was the sizing constraint that we would have to work around. In order to figure out the geometry and work out generally how the system would work, we evaluated a bunch of different variables, including changing the bore size for the compression system, as well as modifying the rotating system so that it could package and deploy within the sizing box of the robot. Once we figure out these details, we then began designing the parts in Solidworks. The next step will be to finish the design of the the actual system itself and then look into possible mounting solutions for the rotating system that will connect the claw to the robot itself.
Today, we assembled the drivetrain of the robot including the gearboxes and chain. We finished the drivebase wiring for one robot and had it driving on the field for the first time! We also built and mounted a lasercut delrin battery box. We are waiting on a few last CAD details and a few parts to finish the drivebases of all three robots.
Today, we worked on the CAD of the hopper conveyor assembly. We are using 10 0.875" OD rollers with a center to center distance of 49.5mm. The conveyor is powered by two 775 pro motors with a 3:1 reduction. It will pivot below the intake pivot along a 0.625" OD shaft before/after the match to change batteries and service electronics. The current plan is to have it latch into place with a pin that goes between the side plate of the hopper conveyor and a .25" plate attached to the inside of the shooter uprights.
Today, we calibrated all 6 PixyCams and outputted all constants to a java file. We tested this on the roboRIO and it worked really well. We changed the lens of some of the cameras to a InfraRed (IR) lens with a narrower field of view with less distortion, which is better suited for the boiler vision detection. We are working on a distance model that based on the image finds the distance to the object is that image, using the pinhole camera model.. Unfortunately, our calculations are very noisy (fluctuate a lot) and are smaller by an order of magnitude. We have yet to refine our code and calculations.
We also tested out the autonomous routine path code, but the NavX board was running the wrong firmware and didn’t work with our code. We will troubleshoot this issue at the next build.
Day 16: Zipper Hopper and Intake
Today we solved the problems of the previous designs by removing the polycord and replacing it with chain. While disassembling the prototype, we found another link of the polycord which melted onto the delrin hub, so in the future we’ll definitely avoid using polycord in this type of situation. The chain increased efficiency so much, that we actually ran into problems with our feeder roller. As a result, we found that it needed a second CIM to drive it efficiently without burning out. After testing it, we decided to iterate on the zipper wheels themselves. Changing from an active to passive solution, we changed one side to metal wheels with little traction. Specifically, our intake wheels from 2015, without any polyurethane. On the other side, we added a second mounting hole and added two chain run rollers. We found that this worked well,and we need to continue to iterate and finalize the hopper design.
Today for the intake we worked on the side plates and made the geometry match that of the currently-functional prototype. We tried to make them look good and then we pocketed them.
We chose a piston and have a preliminary extra plate that mounts via small brackets to the 3/16" bolts in the drivebase bumper-support tubes. We had to change the motor mount plates so the standoffs would avoid hitting the many paths of belts.
We still need to finalize the packaging of the intake into the overall superstructure and integrate it with the hopper and feeder.
We also need to figure out how to get the polycarbonate ramp to deploy because currently it doesn't fit within the starting configuration when the intake is raised.
Today we began work on modifying the Android vision tracking app, used in last year’s challenge to aim at the goal, for the boiler target. The underlying thresholding code, which isolates the illuminated (green) retroreflective tape from the rest of the image, will remain the same, but the processing code will need to be changed.
We use OpenCV, the de facto open-source computer vision library. We began with a thresholded picture of the goal that shows only the retroreflective tape on the target. Then, we created a contour, or an outline of the “area of interest.” We initially experimented with this using GRIP, an application that allows one to interact with OpenCV using easy drag-and-drop blocks, but we quickly realized GRIP’s limitations. We then moved to Python for prototyping purposes, and we were able to draw an outline of the contours.
Finally, we also discussed using the pinhole camera model to determine the robot’s distance from from the goal, which determines how fast/hard we launch the ball (Wikipedia Article). Given the actual object height (in inches/cm), the camera’s focal distance (in pixels), and the height of the object in the camera (in pixels), we’re able to calculate the distance from the object. The exact means by which we implement this are to be determined.
If you’d like to help with computer vision, please set up OpenCV for Python (64 bit!) using these instructions.
Thresholded, with contours highlighted in green (by the OpenCV program):
Today we worked on cleaning up and documenting the autonomous pathing code. As part of the cleanup process, we reworked the pathing code's coordinate system. The old coordinate system was a left handed system, with positive x values to the right and positive y values moving downwards. This placed the origin at the top left hand corner of the field. However, angles still moved counterclockwise, making the whole system convoluted and confusing. The new coordinate system we implemented today is much more straightforward. Positive x is right and positive y is up, while angles increase as they move counterclockwise. This new system makes trigonometric functions far easier to use, as with the old one we would always have to invert any y values.
Day 15: Drivebase, Prototypes, and Program
Wiring for Drivebase
Today we began wiring the drivebases. We have all of the Talon SRXs done and we have installed most of the components. We have a lot more work to do, and we will be working hard to get it done as soon as possible.
We worked on developing a new zipper hopper. We disassembled the old one, and built a new one with rollers. We built the rollers using aluminum tubes with a 7/8" OD and surgical tubing around them. The hubs are VEX Pro 1/2" hex spacers malleted into the shafts. We beveled the shafts so that the 'plugs' would be as colinear as possible when stuffed into the shafts. We also ran the floor and feeder with polycord rollers. We quickly discovered that after running it for a short period of time, the polycord would break or just slip. We also found that at high RPMs, the amount of friction caused so much heat that the polycord pulleys we were using melted. We then had to transition to belts and pulleys, which fixed some of our problems. After our testing, we found that the rollers would "hot-dog" and sometimes not feed the balls. While it was better than the polycord, it still was not good.
Today the intake was remade and retested to finalize geometry before it's fabricated out of metal, and we found that the design maintained a good amount of compression on the balls throughout. We did not get a chance to fully test it yet due to some mistakes in the prototype that led to it being remade once more, but it is almost ready to go for thorough testing tomorrow.
Today, we calibrated all six Pixy cameras. We altered our code, so depending on which camera we are using, the code reads the camera matrix specific to that number Pixy. We saved all of these in .txt files in a new folder called resources. The next step is to add this folder to the JAR file (Java ARchive) so that it is deployed onto the robot. Currently, the fps (frames per seconds) in which the calibration program is running at is really low. We sped it up, but that crashed the program, and the calibration wasn’t as good, so we changed it back. We also had some trouble with Pixy #4. There was a black splotch in the top left corner of the image. After unscrewing the lens, we found a speck of dust that we blew away using compressed air from the pneumatic hose. This fixed the camera. Under FRC-2017/camera-calibration/ there is a file titled README.md which contains instructions for calibrating the cameras.
Here is a sample applet which shows how we take an image (shown on the left) and undistort it (shown on the right).
As you can see, the dot grid is significantly straighter in the right image..
We continued to adjust the Talon SRX’s controller to see if we could the PID tuned. Results were not yet conclusive, and there is still more to test and evaluate.