owned this note changed 3 years ago
Published Linked with GitHub

20220121~20220130 程式組寒訓

tags: 工作筆記 程式組

大家過年前的工筆就都先寫這邊吧
阿要好好寫我還要幫你們整理還要翻成英文

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

阿可以的話也可以直接寫英文

20220121

陳伯豪

今天的話,早上我主要是在寫一些有關競程的簡報
下午的話因為學長有來,所以我有跟他還有副隊長討論了一些有關機器人馬達的事情,以下簡單敘述

由於之前我有聽到機器人的話我們可能會用 TalonSRX 來當底盤,把 SPARK 用在砲台上
(SPARK 似乎是用 REV SPARK MAX Client )
然後學長剛好跟我討論到我們最近有遇到甚麼問題
在我跟他提到這個問題之後,我們有找副隊長一起來討論為甚麼要用兩個馬達
副隊長是說因為我們裡面的 TalonSRX 只剩 9 個
但是因為我們底盤已經用掉了 4 個,然後抬升一定會至少用掉兩個,再來還有砲台的
加總起來應該會 9 顆馬達全上
但是他們考慮到如果 9 個全上的話,要是比賽中有一顆壞掉的話我們是沒有庫存可以補的
所以他們才決定這一次用兩種馬達
可是因為如果我們要用 SPARK 的話我們程式需要再去找新的軟體來取代 Phoneix Tuner 
所以會比較麻煩,所以我們有在討論這件事情
詳細的情形我應該會禮拜一去跟副隊長確認一下

PS. 聽說裡面有另一種馬達用法跟 TalonSRX 很像,但似乎扭力不足所以沒辦法用

今天的話應該是這樣,對www

最後說點幹話(#
然後大埔鐵板燒意外的很好吃w 雖然我覺得有點貴((((
下次不知道吃甚麼的時候可以去吃w

吳玠廷

今天接近中午才來,一開始看了一下我們尚未完成的事像是gyro,encoder等,接下來看了encoder的原理以及程式碼,並且學會應用,像是宣告encoder、把它顯示在shuffleboard、偵測馬達轉速等,因為今天沒有我的班所以輕鬆看並且計畫把它打成hackmd,其中我發現一些有趣的東西:像是利用encoder偵測馬達與目標的位置控制馬達前進等,encoder程式碼的簡單概念是:當馬達走的距離小於某個值,則以某個速度前進直到我設定的距離。

劉柏蔚

今天把之前還沒寫完的Command-Based程式給寫完。然後出現了一個非常大的問題就是我mac電腦轉window的部分沒辦法連網路,純屬硬體問題,然而當我轉成apple的時候我之前下載的vscode可以用,但是沒辦法匯入phoenix tuner的函式庫,所以呢等於我也不知到自己到底有沒有寫錯。所以呢之後的時間我全部都在研究怎麼在apple系統上寫frc的程式,但是因為資料很少所以最後沒找到。然後我們有討論要用新的馬達也就是spark,還好我們之前已經有試過了,但還是需要熟悉一下。

20220122

魏仁祥

我昨天花了兩個多小時跟著 FRC 0 to Autonomous: #5 Command-Based Robot 做了一個 command based robot,在寫 PID 的時候有些卡住,因為 2021 的 vsCode 和 2022 的不太一樣,PIDcontroller 的宣告和要導入的 package 不太一樣,所以當時花了一些時間再看一下,後來有解決。

然後今天下午到的時候,又參考她的做法自己寫一個我們底盤 mecanum drive 的程式,有成功了,下禮拜 Albert 教完 git 後我再放上去。然後我也跟范政佑一起看了 Robot Characterization,之前有聽過黃冠穎當時已經看完了八九成,但後來進行了大修改,雖然基本的概念沒有什麼變,但操作介面整個都改了變得更乾淨也更好了解了。必須要先載了 2022 的 vsCode 才能進行操作,進入 Start Tool 點下 sysid 才能用。接著我就沒繼續看完跑去測機器人底盤是否移動方向正確和測試 encoder 了,留下范政佑一個人看

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
。我們也寫了一篇 Robot Characterization 整理一下,但後來范政佑測試時也好像沒成功,這要再看看。

謝亞諺

今天將之前寫的Command-Base完善了一下,然後早上的時候我一直在找vs studio simulate robot code 的error:

上網找了一下,資料少的可憐,看了別人的發問下的解決辦法,試了一下,完全沒鳥用,然後載了FRC 0 to Autonomous: #5 Command-Based Robot這部影片後面的模擬器,在使用RUN的時候出現一樣的問題只是比較短

然後我找到了Autodesk有出一款軟體有FRC機器人的模擬這是連結結果我也因莫名的原因用不了,然後就去吃午餐了,下午學長叫我把馬達恢復原廠設定,結果我把不用用的也恢復了(◐‿◑),之後學長讓我們先試毒裝2022版,之前的馬達宣告用不了,就先用舊版上機,終於它動起來了。
以下是程式碼

林俊彥

今天把 Command Base 的底盤完成,還完成一小部分的 Shooter ,啊在上機的時候, 發現成功上傳之後 DriverStatio n一就是沒有程式碼 我覺得很困擾,然後新的2022的VSCODE多了好多東西,也改了不少東西所以我的CommandBase做的底盤還是停留在2021版本
參考的是學長推薦的那個2020影片

吳玠廷

看完encoder之後我把他打成一篇類似介紹的文章 Encoder 介紹 雖然不是很專業但我參考了兩部影片: What is Encoder? 裡面講述了 Encoder 的用途以及運作方式,另一個則是 增量型與絕對型的原理及差異 裡面介紹了兩種 Enoder 的不同,簡單來講他們的算法不同是絕對型用的是二進制,其餘的都差不多。下午,應用在網路上學到的東西嘗試的寫出能在 Shuffleboard 監控馬達的程式

20220123

吳玠廷

今天寫的 Enoder 程式

package frc.robot;

import edu.wpi.first.wpilibj.Encoder;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.PWM;
import edu.wpi.first.wpilibj.PWMTalonSRX;
import edu.wpi.first.wpilibj.SpeedControllerGroup;
import edu.wpi.first.wpilibj.Talon;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import com.ctre.phoenix.motorcontrol.ControlMode;
import com.ctre.phoenix.motorcontrol.can.TalonFX;
import com.ctre.phoenix.motorcontrol.can.TalonSRX;
import com.ctre.phoenix.motorcontrol.can.WPI_TalonFX;
import com.ctre.phoenix.motorcontrol.can.WPI_VictorSPX;

public class Robot extends TimedRobot {

  TalonSRX leftfront  = new TalonSRX(1);
  TalonSRX rightfront  = new TalonSRX(3);
  TalonSRX rightback  = new TalonSRX(4);
  TalonSRX leftback  = new TalonSRX(2);

  SpeedControllerGroup leftGroup = new SpeedControllerGroup(leftback, leftfront);
  SpeedControllerGroup rightGroup = new SpeedControllerGroup(rightback, rightfront);
  DifferentialDrive drive = new DifferentialDrive(leftGroup, rightGroup);

  Joystick _joy = new Joystick(0);

  public final int leftStick_X = 0;
  public final int leftStick_Y = 1;
  public final int rightStick_X = 4;
  public final int rightStick_Y = 5;
  public final int trigger_L = 2;
  public final int trigger_R = 3;
  public final int Btn_A = 1;
  public final int Btn_B = 2;
  public final int Btn_X = 3;
  public final int Btn_Y = 4;
  public final int Btn_LB = 5;
  public final int Btn_RB = 6;
  public final int Btn_LS = 9;  
  public final int Btn_RS = 10;

  private static final String kDefaultAuto = "Default";
  private static final String kCustomAuto = "My Auto";
  private String m_autoSelected;
  private final SendableChooser<String> m_chooser = new SendableChooser<>();
  
  @Override
  public void robotInit() {
    m_chooser.setDefaultOption("Default Auto", kDefaultAuto);
    m_chooser.addOption("My Auto", kCustomAuto);
    SmartDashboard.putData("Auto choices", m_chooser);

    leftfront.setSelectedSensorPosition(0);
    leftback.setSelectedSensorPosition(0);
    rightFront.setSelectedSensorPosition(0);
    rightback.setSelectedSensorPosition(0);
    rightback.configSelectedFeedbackSensor(0); }

  @Override
  public void robotPeriodic() {
SmartDashboard.putNumber("Position", leftfront.getSelectedSensorPosition());
    SmartDashboard.putNumber("Velocity", leftfront.getSelectedSensorVelocity());
    
    SmartDashboard.putNumber("Position", leftback.getSelectedSensorPosition());
    SmartDashboard.putNumber("Velocity", leftback.getSelectedSensorVelocity());

    SmartDashboard.putNumber("Position", rightFront.getSelectedSensorPosition());
    SmartDashboard.putNumber("Velocity", rightFront.getSelectedSensorVelocity());

    SmartDashboard.putNumber("Position", rightback.getSelectedSensorPosition());
    SmartDashboard.putNumber("Velocity", rightback.getSelectedSensorVelocity()); }
 @Override
  public void autonomousInit() {
    m_autoSelected = m_chooser.getSelected();
    System.out.println("Auto selected: " + m_autoSelected);
  }

  @Override
  public void autonomousPeriodic() {}
    
  @Override
  public void teleopInit() {}

  @Override
  public void teleopPeriodic() {}

  @Override
  public void disabledInit() {}

  @Override
  public void disabledPeriodic() {}

  @Override
  public void testInit() {}

  @Override
  public void testPeriodic() {}
}

今天遇到的困難

  • 2022 版本的 VS Code 匯入 CTRE 的 library 之後 CTRE 的宣告還是不能用

今日進度

  • 嘗試寫 Encoder 的程式碼

20220124

黃冠穎

今日進度

  • 更新 WPILIB Tools 與了解新的功能 SysID

早上我把所有東西更新到 2022 版,然後看了新版的 Characterizatio n和新功能 SysID ,還有稍微看了一下 NetworkTable(這沒看完因為之後魏仁祥就來了)

  • Albert's Git Lesson

下午的話有一小時多是在聽Albert講Git的ML(?)

  • 測試 SysID 裡的功能

下午剩下的時間跟晚上在測試 SysID 裡的功能,有成功跑出圖片和測出 ks,kv,ka

右邊就是 analyze 出來的圖,底下還有幾張就不截了,左上是一些機器人的基本資料,左下 logger 是可以蒐集資料的地方,中間則是 analyze 出來的資料然後畫成右邊的圖。

遇到的問題

  • 搞不懂 NetworkTable 是甚麼

在看 SysID 的官方資料的時候,看到這個 NetworkTable 不知道這是甚麼東西,就是圖片左下的 NT Disconnected 的 NT

  • 機器人 RoboRio 和網路盒問題

在測機器人的時候無法找到 RoboRio 和網路一直斷掉

解決辦法

  • 看資料、網路上查與問知道的人

後來就繼續去看 NetworkTable 的官方資料,也 Google 了一下,還是不是很懂,但後來魏仁祥講說就是一個溝通平台(?)

  • Format跟接觸不良

後來找范振佑重灌(?)一下,RoboRio就好了,也順便知道如何處理。
而網路盒因為一直叫魏晨名,所以她也跟我講再壞掉,檢查哪裡該怎麼做,也就知道如何處理了。

魏仁祥

今天早上剛到的時候,我在 fablab 看 feedforward controller。我覺得那個真的有點難,我還上 youtube 看 What Is Feedforward Control? | Control Systems in Practice
Introduction to Feedforward Control 都還是自認沒有到很了解他。我也自己寫了 Feedforward Control 前饋控制 整理資料,目前還很破很爛,然後程式有去 vscode 試過.calculate() 這個函式好像不太能用,我也去 api 看過了,不清楚問題出在哪。
下午一開始 Albert 開始講上次沒說完的 github 了,他先幫我們複習上次的內容,然後介紹了一些基本我們在 git bash 會用到的指令,以下隨便列出幾個我過了半天還記得的。

git init
git add .
git commit -m "initial version"
git log 
git status
git config
git clone
git push origin main
git revert

然後我們也嘗試實際做 push 和 clone 的操作,老實說我後來覺得 git 不容易。要克服版本的問題和一堆奇怪的指令要記起來真的很麻煩而且很不習慣,但是 albert 說當所有人都會用的時候就會在團隊運作上輕鬆非常多,這還有待我們克服。

後來我跟黃冠穎在測試 sysID,sysID 是 2022 新版的 robot characerteration 的東西,這次 first 把它整合在一起讓我們更好測試以求的 ks kv ka。一開始不熟悉界面和 networktable 有問題所已花了一些時間,接著我們試著去求得 unit per rotation(算出來是 0.1595),最後我們有成功讓機器人動起來去做到 quasistatic forward、quasistatic backward、dymanic forward 和 dynamic backward。後來五點到了但 ks kv ka 還沒求出來,但我要去搭公車就走了,剩下黃冠穎和范政佑在測試。

最後要提到的是 RoboRio 2022 Version 有問題,范政佑已經照著上面說的可行性方法排除過了但還是有問題,我們已經向南科的老師提出問題了,還在討論中。

陳伯豪

今天早上的話我在下載 2022 的 WPI 然後我有去跟副隊長確認之前提到的那個問題,他是說他可以選擇要把 SPARK 放在底盤還是砲台
但我跟他說我們底盤的程式已經寫好了,所以最後討論出來是決定用 SPARK 跟 Falcon 至於有沒又要用到 neo 就要再看看了
然後下午因為 Albert 有來,所以他有先把 Git 的一些基礎跟我們講完,雖然一開始很多人不會,但最後似乎大家都會一些基礎的 Push 跟 Pull 了?
如果之後有空的話我再看看要不要找時間寫一份 Git 的使用說明,這樣下一屆也可以用w

林俊彥

今天早上來沒多久之後就去參加志工的會議了 所以上半天沒有做到甚麼事下午就是聽 Albert 講關於GitHub 結果因為我的使用者原因 所以 Github 不能連接上,所以我又全部打掉重來,因為重新用了很多次,所以創建 Git 的步驟幾乎都記得了

吳玠廷

今天早上來看一些PID的簡單觀念並且回去看了以前的PID教學影片 PID

下午則是聽學長講 Git 以及時突解決找不到砲台網路的問題,晚上測試砲台

今日進度

  • 看了PID的影片
  • 學會了基礎的 Git 例如: 將 Github 上的資料夾抓下來編輯之後變成一個新的版本再回傳回去
  • 簡單的炮台程式

遇到的困難

  • 砲台的網路電腦搜尋不到

解決方法

  • 將網路盒重新設定並且改名
  • 將RoboRIO重新更新

謝亞諺

今日進度

  • 觀看 Ramsete Controller
  • 協助學長調馬達的 PID
  • 帥哥 Albert 的 Git 解說

遇到的困難

  • Phoenix tuner 連不上 RobotRIO
  • Git 指令不熟悉

解決辦法

  • 更新 RobotRIO 韌體
  • 多用 Git

20220125

黃冠穎

今日進度

  • Trajectory 的程式碼
今天繼昨晚sysID測試完後拿到的資料,往下照著 trajectory tutorial 寫程式

遇到問題

  • Differentialdrive
官方資料裡面寫的是 Differential drive,寫出來的程式碼不會動
  • Import path from pathweaver
在 Pathweaver 畫完路徑後,不知道怎麼匯入讓程式知道
  • Mecanumdrive 的 Teleop
我不會寫 Mecanumdrive 的 Teleop,導致每次路徑走完都要手動移回去

解決辦法

  • Mecanumdrive

我有看到 VS Code 裡面有 Mecanumdrive 的 Example Code 所以我把它拿出來改到我的程式上面

  • Import path from pathweaver

這個還是無解,目前(1/30(我回來改格式))還是沒辦法讓他跟著我畫的路徑走

  • 看資料、工筆

當時無解,這禮拜(1/24~1/28)有找到魏仁祥的工筆,也有自己寫出來過。

陳伯豪

今天因為我早上也是所以我有說我下午才會來,然後下午的話我主要是在跟無界停還有 Albert 討論 PID 的程式,然後吃完晚餐之後就幫忙打掃一下地下室\


接續前文

靠杯超髒


我今天回去可能會看一下 Encoder 的程式去寫一下,對

吳玠廷

今日進度

今天整天寫砲台PID,因為不確定最後整體做出來會長甚麼樣,所以就先寫出基本的算式。

遇到的困難

  • \(I\) 的面積不知道怎麼算

解決辦法

  • 請教學長,最後討論出來
最後寫出的程式碼
package frc.robot;

import java.util.Timer;

import javax.sound.midi.ControllerEventListener;

import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.motorcontrol.PWMTalonFX;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;


public class Robot extends TimedRobot {
  private static final String kDefaultAuto = "Default";
  private static final String kCustomAuto = "My Auto";
  private String m_autoSelected;
  private final SendableChooser<String> m_chooser = new SendableChooser<>();

  public final int leftStick_X = 0;
  public final int leftStick_Y = 1;
  public final int rightStick_X = 4;
  public final int rightStick_Y = 5;
  public final int trigger_L = 2;
  public final int trigger_R = 3;
  public final int Btn_A = 1;
  public final int Btn_B = 2;
  public final int Btn_X = 3;
  public final int Btn_Y = 4;
  public final int Btn_LB = 5;
  public final int Btn_RB = 6;
  public final int Btn_LS = 9;  
  public final int Btn_RS = 10;
  
  // Basic Declare
  Joystick js1;

  // PID Declare
  double position;
  double error;
  double Output;
  double setpoint = 0;
  double Output2;
  PIDController controller = new PIDController(1,0,0);
  
  // Shooter
  WPI_TalonFX shooter1;
  WPI_TalonFX shooter2;

  //Timer
  Timer  Timer;
  
  @Override
  public void robotInit() {
    shooter1 = new WPI_TalonFX(1);
    shooter2 = new WPI_TalonFX(2);
    js = new Joystick(0);

    shooter1.setInverted(true);
    shooter2.setInverted(false);
    shooter1.getVelocityError() ;

    Timer = new Timer();
  }

  @Override
  public void robotPeriodic() {}

  @Override
  public void autonomousInit() {}
  
  @Override
  public void autonomousPeriodic() {
    Timer.reset();
    Timer.start();
    // PID 
    shooter1.set(pid.calculate(shooter1.getVelocityError, 1));

    if( js1.getRawBotton(1) ){
      setpoint = 10;
    }else if( js1.getRawBotton(2) ){
      setpoint = 0;
    }

    position = shooter1.get();
    error = setpoint - position;
    Output = kp * error;
    shooter2.follow(shooter1);
    shooter1.set(Output+Output2);

    Output2 = Output2 + (kp * error) * Timer;

    // switch (m_autoSelected) {
    //   case kCustomAuto:
    //     break;
    //   case kDefaultAuto:
    //   default:
    //     break;
    // }
  }

  @Override
  public void teleopInit() {}

  @Override
  public void teleopPeriodic() {
    shooter1.set( ControlMode.PercentOutput, getRawAxis(2) * 1);
  }

  @Override
  public void disabledInit() {}

  @Override
  public void disabledPeriodic() {}

  @Override
  public void testInit() {}

  @Override
  public void testPeriodic() {}
}

20220126

黃冠穎

今日進度

  • Import path from pathweaver

還是卡在不知道該如何 import path 到 VS Code 裡,而且我也只去一個下午而已

遇到問題

  • Can't follow the path we want

有成功import .json 檔 但還是無法照著走,目前無解

陳伯豪

今日進度(測試)

1. 炮台(Shooter)

  • 離 HUB 最近的話大概 8000 轉左右可以進球框

2. 底盤(DriveTrain)

  • 前後左右只要是走直線都沒問題,但平移要再處理

今日進度(程式)

1. 編碼器(Encoder)

  • 目前知道似乎很多馬達內建 Encoder

2. Command Base

  • 我這一兩天應該會把 FRC 官方給的影片看完,然後看看能不能用在這個賽季

遇到的問題

1. 炮台(Shooter)

  • 因為場地的天花板不夠高,所以無法測到最後面的

2. 底盤(DriveTrain)

  • 平移會出現偏移的狀況

解決方法

1. 炮台(Shooter)

  • 可能之後會去別的地方測,但是會先看看能不能利用改角度來改善這個問題

2. 底盤(DriveTrain)

  • 平移的話我會先找看看是因為場地的問題還是因為馬達轉速不同的問題
  • 應該會先在程式中加入 max velocity 跟 max acceleration 試看看,真的不行我再直接用 Gyro(陀螺儀)去校正

結論

明天應該會以寫完 Command Base 跟測試為主

補充

順便紀錄一下一些最近測到的機器人尺寸

>7130
Wheel R -> 10.595 cm

>7130_ownhandsome
Wheel R -> 15.10 cm

程式

今日砲台及底盤測試程式
package frc.robot; import com.ctre.phoenix.motorcontrol.can.WPI_TalonFX; import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX; import edu.wpi.cscore.CvSink; import edu.wpi.cscore.CvSource; import edu.wpi.cscore.UsbCamera; import edu.wpi.first.cameraserver.CameraServer; import edu.wpi.first.networktables.NetworkTableEntry; import edu.wpi.first.networktables.NetworkTableInstance; import edu.wpi.first.wpilibj.AnalogInput; import edu.wpi.first.wpilibj.Joystick; import edu.wpi.first.wpilibj.SPI; import edu.wpi.first.wpilibj.SpeedControllerGroup; import edu.wpi.first.wpilibj.TimedRobot; import edu.wpi.first.wpilibj.drive.DifferentialDrive; import edu.wpi.first.wpilibj.drive.MecanumDrive; import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; import edu.wpi.first.networktables.NetworkTable; public class Robot extends TimedRobot { // PWM Channels public final int kLeftFrontChannel = 13; public final int kLeftRearChannel = 14; public final int kRightFrontChannel = 11; public final int kRightRearChannel = 12; public final int joystickPort = 0; public final int rightUltrasonicPort = 1; public final int rearUltrasonicPort = 0; public final int shooter1Port = 15; public final int shooter2Port = 15; // Driver Station Ports public final int leftStick_X = 0; public final int leftStick_Y = 1; public final int rightStick_X = 4; public final int rightStick_Y = 5; public final int trigger_L = 2; public final int trigger_R = 3; public final int Btn_A = 1; public final int Btn_B = 2; public final int Btn_X = 3; public final int Btn_Y = 4; public final int Btn_LB = 5; public final int Btn_RB = 6; public final int Btn_LS = 9; public final int Btn_RS = 10; // Motors WPI_TalonSRX LeftFront = new WPI_TalonSRX(kLeftFrontChannel); WPI_TalonSRX LeftRear = new WPI_TalonSRX(kLeftRearChannel); WPI_TalonSRX RightFront = new WPI_TalonSRX(kRightFrontChannel); WPI_TalonSRX RightRear = new WPI_TalonSRX(kRightRearChannel); WPI_TalonFX Shooter1 = new WPI_TalonFX(shooter1Port); WPI_TalonFX Shooter2 = new WPI_TalonFX(shooter2Port); // SpeedControllerGroup and DifferentialDrive SpeedControllerGroup LeftMotor = new SpeedControllerGroup(LeftFront, LeftRear); SpeedControllerGroup RightMotor = new SpeedControllerGroup(RightFront, RightRear); SpeedControllerGroup Shooter = new SpeedControllerGroup(Shooter1, Shooter2); DifferentialDrive drive = new DifferentialDrive(LeftMotor, RightMotor); // Mecanumderive public MecanumDrive m_Drive; // Joystick Joystick joystick = new Joystick(joystickPort); // Variables (Base) double xSpeed; double ySpeed; double zRotation; double denominator; @Override public void robotInit() { // Motors Inverted RightFront.setInverted(true); RightRear.setInverted(true); LeftFront.setInverted(false); LeftRear.setInverted(false); } @Override public void robotPeriodic() { // Post to Smart Dashboard SmartDashboard.putData("LeftFront", LeftFront); SmartDashboard.putData("LeftRear", LeftRear); SmartDashboard.putData("RightFront", RightFront); SmartDashboard.putData("RightRear", RightRear); } @Override public void autonomousInit() {} @Override public void autonomousPeriodic() {} @Override public void teleopInit() { } @Override public void teleopPeriodic() { // Shooter if( joystick.getRawButton(Btn_Y) ){ Shooter.set(0.8); } // Base ySpeed = -joystick.getRawAxis(leftStick_Y) * 0.5; xSpeed = joystick.getRawAxis(leftStick_X) * 0.5; zRotation = joystick.getRawAxis(rightStick_X) * 0.5; denominator = Math.max(Math.abs(ySpeed) + Math.abs(xSpeed) + Math.abs(zRotation), 1); // Mecanumderive LeftFront.set((ySpeed + xSpeed + zRotation) / denominator); RightFront.set((ySpeed - xSpeed - zRotation) / denominator); LeftRear.set((ySpeed - xSpeed + zRotation) / denominator); RightRear.set((ySpeed + xSpeed - zRotation) / denominator); } @Override public void disabledInit() {} @Override public void disabledPeriodic() {} @Override public void testInit() { } @Override public void testPeriodic() {} }

魏仁祥

跟黃冠穎和 Albert 討論如何成功實現 PathWeaver,在那之前我們得一步一步完成很多東西

Albert 也又講了 PID control 和 feedforward control,前者早就知道了,而後者是自己早已看過一些資料但仍然不完全了解,聽他講完大概更懂了,說白了就是在自動模式時預測機器人下一秒的行動,並以事先測量完畢的 ks, kv, ka 進行移動罷了。

然後我們有多了一個組員 Aaron,他的理解速度非常快,第一次聽 Albert 講 Control Theory 即可舉一反三,快速進入狀況,真的很厲害。我現在也知道了英文對於學習的重要性,能夠快速看懂一篇英文的文章並抓住重點了解其中的要點是很重要的,我的英文還要再加油吧

20220127

黃冠穎

今日進度 : Characterization & trajectory generate

  • 用 Commandbase 寫 Mecanumdrive 的 teleop
  • 找出 底盤的 ks, kv, ka

遇到的問題

  • Mecanumdrive 的 Teleop 寫好後,本來可以用的 Trajectory generate 跑不了
  • Mecanumdrive 的 ks,kv,ka 不知道要放哪

如何解決

  • Mecanumdrive 的 Teleop 寫好後,本來可以用的 Trajectory generate 跑不了

還沒好

  • Mecanumdrive 的 ks,kv,ka 不知道要放哪

多看幾次程式碼就找到了

陳伯豪

今日進度(測試)

1. 底盤(DriveTrain)

  • 找出平移的問題點

今日進度(程式)

1. Command Base

  • 程式碼可以上傳到機器人

遇到的問題

1. 底盤(DriveTrain)

  • 平移會偏掉是因為搖桿左邊蘑菇頭的 Y 軸無法歸零的原因的問題

2. Command Base

  • 程式不知為啥可以上傳但是機器人完全不會動

解決方法

1. 底盤(DriveTrain)

  • 隊長有考慮會換新的搖桿
  • 或是要叫之後的 Driver 技術好一點(? 因為要同時操縱兩邊的搖桿w

2. Command Base

  • 之後可能會再想辦法跟其他已經可以執行的人對看看哪裡出了問題

結論

暫無ouo

吳玠廷

今日進度

  • 早上測試機器人底盤

遇到困難

  • 早上測試底盤發現機器人沒有動搖桿也沒人控制的情況下搖桿居然在 Shuffleboard 上顯示偏移原點一點點(但經過一連串的算式後會差蠻多的),這可能是機器人偏移的問題點之一。

如何解決

  • 學長表示手動設定當前搖桿狀態回原點,但會發生當搖桿推到底時,原本偏移的那端會不到 1 另一邊則會超過 1 ,這會讓機器人轉速不同。

20220128

魏仁祥

今日進度

Rev Spark Max Client

今天我跟范政佑在處理 SparkMax 的問題,SparkMax 並不是用 phoneix tuner 控制而是使用 Rev Spark Max Client 進行調整與控制。今天范政佑帶我認識他的介面,其實功能什麼的和 phoneix tuner,所以不需要什麼適應。

Import Path Weaver Json file to VsCode

之前黃冠穎也有這個問題,所以我也來看看了。今天我也看了 Importing a PathWeaver JSON看看目前的狀況。

遇到的問題

Rev Spark Max Client

今天我們在看范政佑已經看了四、五個小時的東西,當我們想要測試單科馬達時,調整他的 Percentage Output 和 Velocity 時他都不會轉動,我們看了很多 Chief Deiphi 和 SPARK MAX Overview 官方的資料但都找不太到其他人的相關經歷和解決方法。

Import Path Weaver Json file to VsCode

我自己是可以在 path weaver 上畫出路徑,但在導出後我卻只有 .path 黨而沒有 .json 黨。Aaron and Matt 和我也照著上面的說明從頭認真地看過一遍,檔案該放的位置都是對的,順序步驟都沒問題,但我的遲遲就是不會有 .json 黨。我們到 c 槽去認真找過,似乎是他根本沒有輸出這個檔案。

解決方法

Rev Spark Max Client

過了大概半小時後,范政佑找到 REV Hardware Client - can’t run motors 這一篇,他們有著跟我們類似的問題。

Try this sequence:

  • Remove power to the Robot
  • Remove both of the CAN bus wires from the Rio
  • Power the robot back up
  • See if the Client works

If you power the RIO while it’s connected to the CAN network at any time, then the Spark Max’s will remember it was once there and you won’t ever be able to control them using the Client.

解決方法大概如上,最後有成功解決。由於賴政諺之前有提過看看我們程式方面能否調整 PDP 輸入給馬達的電壓(PDP 上有的孔好像比較小只能提供 30 安陪),所以我們除了調整 Percentage Output, Velocity, Voltage,我們也試著更改 Current,但結果是只要電流不是 40 的話就不行,也意味著我們程式這邊是無法輕易更改電流供給的。

Import Path Weaver Json file to VsCode

Aaron 也跟著在他自己的筆電上試了一次,結果她是可以的。我們認為可能是我版本太舊的問題,但我覺得不太可能畢竟我前幾天才更新成 2022 版的 vscode 而已,但還是抱持著懷疑的心態重新載過一次。下載完 Java JDK 和 frc 2022 vscode and wpilib 2022 tools 後,path weaver 還是有問題無法導出 .json

結論

Rev Spark Max Client

然後我去打球了好爽

Import Path Weaver Json file to VsCode

宣告失敗,可能以後要用別人的電腦。

題外話,Aaron 真的學的超快

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
才短短天已經看到 trajectory 了,真的很厲害。

黃冠穎

今天進度

  • Mecanum drive + path planning

希望能把底盤和路徑規劃加在一起,目前還是只能擇一,有 Mecanumdrive 就沒 Trajectory following

  • 問學學長問題

學學長回來就請教他一些path planning的問題,雖然他不會,但能從他寫程式多年的經驗,試著推看看可能的問題

遇到問題

  • Macuanumdrive 平移不了

在魏仁祥還沒來的時候,我一直覺得 Mecanumdrive 有問題,底盤一直無法平移

解決辦法

  • 測試小台機器人與底盤的差異,請機械組檢查

在測試小台的機器人後,發現平移是可以動的,雖然沒那麼平移但還是可以接受的。所以我請機械組在改裝的時候,在幫我看看輪子有沒有怎樣。

20220129

林俊彥

本日進度:PID

今天去網路上找了很多相關程式 並盡量把他們改成2022版本的寫法

未完成的在這裡

遇到問題

寫入機器人之後無法運作 報錯也沒有任何東西

解決方法

暫無

王鴻霖Aaron Wang

Today, to make sure that the prototype robot will be ready for future tests, I tested some basic tele-op code on it.
Turns out there were misinformation, and we were using the wrong MotorController object to control the motors. We used TalonFX instead of TalonSRX because we were told that the prototype used that motor. Turns out TalonSRX is the right one. However, when we were trying to use MecanumDrive object to control the motion of the robot, the MecanumDrive object constructor refused the TalonSRX object. Turns out that TalonSRX is a base level control object in the CTRE library that doesn't implement the SpeedController class, so can't be used in MecanumDrive object.
We have yet to find the solution.

謝亞諺

今日進度

  • 嘗試將2021的程式碼,也可用於2022

困難

  • 馬達的宣告變了
  • 有些奇葩改動

解決方法

  • 查官方資料

結果

  • 馬達宣告,跟我查的不一樣,前面試了超久,結果要更新馬達資料庫

20220130

Select a repo