- 
                Notifications
    You must be signed in to change notification settings 
- Fork 74
neckmk3_2joints experimental setup #689
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
          
     Merged
      
      
    
  
     Merged
                    Changes from all commits
      Commits
    
    
            Show all changes
          
          
            9 commits
          
        
        Select commit
          Hold shift + click to select a range
      
      45a1cc2
              
                adding files
              
              
                SanLordKevin b4f24cc
              
                files for the neck setup
              
              
                SanLordKevin 4839334
              
                renaimng and adding files for setup movements
              
              
                SanLordKevin 7cf8941
              
                file and code ordering
              
              
                SanLordKevin 629a91c
              
                updated readme and assets
              
              
                SanLordKevin 9c3a771
              
                Update experimentalSetups/neckmk3_2joints/README.md
              
              
                SanLordKevin 86d65dc
              
                Update experimentalSetups/neckmk3_2joints/README.md
              
              
                SanLordKevin 5296bef
              
                Update experimentalSetups/neckmk3_2joints/README.md
              
              
                SanLordKevin 63ccd20
              
                better layout
              
              
                SanLordKevin File filter
Filter by extension
Conversations
          Failed to load comments.   
        
        
          
      Loading
        
  Jump to
        
          Jump to file
        
      
      
          Failed to load files.   
        
        
          
      Loading
        
  Diff view
Diff view
There are no files selected for viewing
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| 2 Joints Neck Setup | ||
| =================== | ||
|  | ||
| This setup is a prototype of the neck that will be mounted on `iCub` and `ergoCub`. | ||
| It consists of two motors and can be actuated using `yarprobotinterface` and `yarpmotorgui`. | ||
| One motor is controlled by an `amc` board and the other by an `amcbldc` board. | ||
| All the parameters to move the setup are in the configuration files. | ||
|  | ||
| ### Picture of the setup | ||
|  | ||
| | | | ||
| | :---: | | ||
| |  | | ||
| | **Figure 1** Setup view | | ||
|  | ||
      
      Loading
      
  Sorry, something went wrong. Reload?
      Sorry, we cannot display this file.
      Sorry, this file is invalid so it cannot be displayed.
      
    
        
          
          
            47 changes: 47 additions & 0 deletions
          
          47 
        
  experimentalSetups/neckmk3_2joints/calibrators/neck-calib.xml
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE devices PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
| <device xmlns:xi="http://www.w3.org/2001/XInclude" name="neck-calibrator" type="parametricCalibratorEth"> | ||
|  | ||
| <xi:include href="../general.xml" /> | ||
|  | ||
| <group name="GENERAL"> | ||
| <param name="joints"> 2 </param> <!-- the number of joints of the robot part --> | ||
| <param name="deviceName"> Neckmk3_Calibrator </param> | ||
| </group> | ||
|  | ||
| <group name="HOME"> | ||
| <param name="positionHome"> 0 0 </param> | ||
| <param name="velocityHome"> 10 10 </param> | ||
| </group> | ||
|  | ||
| <group name="CALIBRATION"> | ||
| <param name="calibrationType"> 12 12 </param> | ||
|  | ||
| <param name="calibration1"> 36439 48191 </param> | ||
| <param name="calibration2"> 0 0 </param> | ||
| <param name="calibration3"> 0 0 </param> | ||
| <param name="calibration4"> 0 0 </param> | ||
| <param name="calibration5"> 0 0 </param> | ||
| <param name="calibrationZero"> 0 0 </param> | ||
| <param name="calibrationDelta"> 0 0 </param> | ||
|  | ||
| <param name="startupPosition"> 0.0 0.0 </param> | ||
| <param name="startupVelocity"> 10.0 10.0 </param> | ||
| <param name="startupMaxPwm"> 16000 16000 </param> | ||
| <param name="startupPosThreshold"> 2 2 </param> | ||
| </group> | ||
|  | ||
| <param name="CALIB_ORDER"> (0) (1) </param> | ||
|  | ||
| <action phase="startup" level="10" type="calibrate"> | ||
| <param name="target"> neck-mc_remapper </param> | ||
| </action> | ||
|  | ||
| <action phase="interrupt1" level="1" type="park"> | ||
| <param name="target"> neck-mc_remapper </param> | ||
| </action> | ||
|  | ||
| <action phase="interrupt3" level="1" type="abort" /> | ||
|  | ||
| </device> | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| [DRIVERS] | ||
| ETH "eth" | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE params PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
| <params xmlns:xi="http://www.w3.org/2001/XInclude" robot="neckmk3" build="1"> | ||
|  | ||
| <group name="GENERAL"> | ||
| <param name="skipCalibration"> false </param> | ||
| <param name="useRawEncoderData"> false </param> | ||
| <param name="verbose"> false </param> | ||
| </group> | ||
| </params> | 
        
          
          
            40 changes: 40 additions & 0 deletions
          
          40 
        
  experimentalSetups/neckmk3_2joints/hardware/electronics/neck-eb2-j0_1-eln.xml
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE params PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
| <params xmlns:xi="http://www.w3.org/2001/XInclude" robot="new_neck" build="1"> | ||
|  | ||
| <xi:include href="./pc104.xml" /> | ||
|  | ||
| <group name="ETH_BOARD"> | ||
|  | ||
| <group name="ETH_BOARD_PROPERTIES"> | ||
| <param name="IpAddress"> 10.0.1.1 </param> | ||
| <param name="IpPort"> 12345 </param> | ||
| <param name="Type"> amc </param> | ||
| <param name="maxSizeRXpacket"> 768 </param> | ||
| <param name="maxSizeROP"> 384 </param> | ||
| </group> | ||
|  | ||
| <group name="ETH_BOARD_SETTINGS"> | ||
| <param name="Name"> "neck-eb2-j0_2" </param> | ||
| <group name="RUNNINGMODE"> | ||
| <param name="period"> 1000 </param> | ||
| <param name="maxTimeOfRXactivity"> 400 </param> | ||
| <param name="maxTimeOfDOactivity"> 300 </param> | ||
| <param name="maxTimeOfTXactivity"> 300 </param> | ||
| <param name="TXrateOfRegularROPs"> 2 </param> | ||
| </group> | ||
| </group> | ||
|  | ||
| <group name="ETH_BOARD_ACTIONS"> | ||
| <group name="MONITOR_ITS_PRESENCE"> | ||
| <param name="enabled"> true </param> | ||
| <param name="timeout"> 0.020 </param> | ||
| <param name="periodOfMissingReport"> 60.0 </param> | ||
| </group> | ||
| </group> | ||
|  | ||
| </group> | ||
|  | ||
| </params> | ||
|  | 
        
          
          
            14 changes: 14 additions & 0 deletions
          
          14 
        
  experimentalSetups/neckmk3_2joints/hardware/electronics/pc104.xml
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE params PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
| <params xmlns:xi="http://www.w3.org/2001/XInclude" robot="new_neck" build="1"> | ||
|  | ||
| <group name="PC104"> | ||
| <param name="PC104IpAddress"> 10.0.1.104 </param> | ||
| <param name="PC104IpPort"> 12345 </param> | ||
| <param name="PC104TXrate"> 1 </param> | ||
| <param name="PC104RXrate"> 5 </param> | ||
| </group> | ||
|  | ||
| </params> | ||
|  | 
        
          
          
            93 changes: 93 additions & 0 deletions
          
          93 
        
  experimentalSetups/neckmk3_2joints/hardware/mechanicals/neck-eb2-j0_1-mec.xml
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE params PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
| <params xmlns:xi="http://www.w3.org/2001/XInclude" robot="new_neck" build="1"> | ||
| <group name="GENERAL"> | ||
| <param name="MotioncontrolVersion"> 6 </param> | ||
| <param name="Joints"> 2 </param> | ||
| <param name="AxisMap"> 0 1 </param> | ||
| <param name="AxisName"> "neck_pitch" "neck_roll" </param> | ||
| <param name="AxisType"> "revolute" "revolute" </param> | ||
| <param name="Encoder"> 182.044 182.044 </param> | ||
| <param name="fullscalePWM"> 32000 32000 </param> | ||
| <param name="ampsToSensor"> 1000.0 1000.0 </param> | ||
| <param name="Gearbox_M2J"> +100 +100 </param> | ||
| <param name="Gearbox_E2J"> 1 1 </param> | ||
| <param name="useMotorSpeedFbk"> 0 0 </param> | ||
| <param name="MotorType"> "FAULHABER" "FAULHABER" </param> | ||
| <param name="Verbose"> 0 0 </param> | ||
| </group> | ||
|  | ||
| <group name="LIMITS"> | ||
| <param name="hardwareJntPosMax"> +22 +20 </param> | ||
| <param name="hardwareJntPosMin"> -30 -20 </param> | ||
| <param name="rotorPosMin"> 0 0 </param> | ||
| <param name="rotorPosMax"> 0 0 </param> | ||
| </group> | ||
|  | ||
| <group name="AMCBLDC"> | ||
| <param name="HasHallSensor"> 1 1 </param> | ||
| <param name="TemperatureSensorType"> NONE NONE </param> | ||
| <param name="HasRotorEncoder"> 0 0 </param> | ||
| <param name="HasRotorEncoderIndex"> 0 0 </param> | ||
| <param name="HasSpeedEncoder"> 0 0 </param> | ||
| <param name="RotorIndexOffset"> 0 0 </param> | ||
| <param name="MotorPoles"> 14 14 </param> | ||
| </group> | ||
|  | ||
| <group name="ADVFOC"> | ||
| <param name="Verbose"> 0 0 </param> | ||
| <param name="AutoCalibration"> 0 0 </param> | ||
| <param name="HasHallSensor"> 1 1 </param> | ||
| <param name="TemperatureSensorType"> NONE NONE </param> | ||
| <param name="HasRotorEncoder"> 0 0 </param> | ||
| <param name="HasRotorEncoderIndex"> 0 0 </param> | ||
| <param name="HasSpeedEncoder"> 0 0 </param> | ||
| <param name="RotorIndexOffset"> 0 0 </param> | ||
| <param name="MotorPoles"> 14 14 </param> | ||
| </group> | ||
|  | ||
|  | ||
| <group name="COUPLINGS"> | ||
|  | ||
| <param name ="matrixJ2M"> | ||
| 1.0 0.0 0.0 0.0 | ||
| 0.0 1.0 0.0 0.0 | ||
| 0.0 0.0 1.0 0.0 | ||
| 0.0 0.0 0.0 1.0 | ||
| </param> | ||
|  | ||
| <param name ="matrixM2J"> | ||
| 1.0 0.0 0.0 0.0 | ||
| 0.0 1.0 0.0 0.0 | ||
| 0.0 0.0 1.0 0.0 | ||
| 0.0 0.0 0.0 1.0 | ||
| </param> | ||
|  | ||
| <param name ="matrixE2J"> | ||
| 1.00 0.00 0.00 0.00 0.00 0.00 | ||
| 0.00 1.00 0.00 0.00 0.00 0.00 | ||
| 0.00 0.00 1.00 0.00 0.00 0.00 | ||
| 0.00 0.00 0.00 1.00 0.00 0.00 | ||
| </param> | ||
|  | ||
| </group> | ||
|  | ||
| <group name="JOINTSET_CFG"> | ||
| <param name= "numberofsets"> 2 </param> | ||
| <group name="JOINTSET_0"> | ||
| <param name="listofjoints"> 0 </param> | ||
| <param name="constraint"> none </param> | ||
| <param name="param1"> 0 </param> | ||
| <param name="param2"> 0 </param> | ||
| </group> | ||
| <group name="JOINTSET_1"> | ||
| <param name="listofjoints"> 1 </param> | ||
| <param name="constraint"> none </param> | ||
| <param name="param1"> 0 </param> | ||
| <param name="param2"> 0 </param> | ||
| </group> | ||
| </group> | ||
|  | ||
| </params> | ||
|  | 
        
          
          
            102 changes: 102 additions & 0 deletions
          
          102 
        
  experimentalSetups/neckmk3_2joints/hardware/motorControl/neck-eb2-j0_1-mc.xml
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,102 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE devices PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
|  | ||
| <device xmlns:xi="http://www.w3.org/2001/XInclude" name="neck-eb2-j0_1-mc" type="embObjMotionControl"> | ||
|  | ||
| <xi:include href="../../general.xml" /> | ||
| <xi:include href="../../hardware/electronics/neck-eb2-j0_1-eln.xml" /> | ||
| <xi:include href="../../hardware/mechanicals/neck-eb2-j0_1-mec.xml" /> | ||
| <xi:include href="./neck-eb2-j0_1-mc_service.xml" /> | ||
|  | ||
| <!-- joint number 0 1 --> | ||
| <!-- joint name neck-pitch neck-roll --> | ||
| <group name="LIMITS"> | ||
| <param name="jntPosMax"> +20 +18 </param> <!-- using mechanical limits -2 --> | ||
| <param name="jntPosMin"> -28 -18 </param> | ||
| <param name="jntVelMax"> 50 50 </param> | ||
| <param name="motorNominalCurrents"> 1000 1000 </param> | ||
| <param name="motorPeakCurrents"> 2000 2000 </param> | ||
| <param name="motorOverloadCurrents"> 2100 2100 </param> | ||
| <param name="motorPwmLimit"> 16000 16000 </param> | ||
| </group> | ||
|  | ||
| <group name="TIMEOUTS"> | ||
| <param name="velocity"> 100 100 </param> | ||
| </group> | ||
|  | ||
| <group name="IMPEDANCE"> | ||
| <param name="stiffness"> 0 0 </param> | ||
| <param name="damping"> 0 0 </param> | ||
| </group> | ||
|  | ||
| <group name="CONTROLS"> | ||
| <param name="positionControl"> POS_PID_DEFAULT POS_PID_DEFAULT </param> | ||
| <param name="velocityControl"> POS_PID_DEFAULT POS_PID_DEFAULT </param> | ||
| <param name="mixedControl"> POS_PID_DEFAULT POS_PID_DEFAULT </param> | ||
| <param name="torqueControl"> none none </param> | ||
| <param name="currentPid"> 2FOC_CUR_CONTROL 2FOC_CUR_CONTROL </param> | ||
| <param name="speedPid"> 2FOC_VEL_CONTROL 2FOC_VEL_CONTROL </param> | ||
| </group> | ||
|  | ||
|  | ||
| <!-- default position PID: begin --> | ||
|  | ||
| <group name="POS_PID_DEFAULT"> | ||
| <param name="controlLaw"> minjerk </param> | ||
| <param name="outputType"> current </param> | ||
| <param name="fbkControlUnits"> metric_units </param> | ||
| <param name="outputControlUnits"> machine_units </param> | ||
| <param name="kp"> +100 +100 </param> | ||
| <param name="kd"> +12 +12 </param> | ||
| <param name="ki"> +80 +80 </param> | ||
| <param name="maxOutput"> 500 500 </param> | ||
| <param name="maxInt"> 200 200 </param> | ||
| <param name="stictionUp"> 0 0 </param> | ||
| <param name="stictionDown"> 0 0 </param> | ||
| <param name="kff"> 0 0 </param> | ||
| </group> | ||
|  | ||
| <!-- default position PID: end --> | ||
|  | ||
|  | ||
| <!-- other default PIDs: begin --> | ||
|  | ||
| <group name="2FOC_CUR_CONTROL"> | ||
| <param name="controlLaw"> low_lev_current </param> | ||
| <param name="fbkControlUnits"> machine_units </param> | ||
| <param name="outputControlUnits"> machine_units </param> | ||
| <param name="kp"> 0.03 0.03 </param> | ||
| <param name="kd"> 0 0 </param> | ||
| <param name="ki"> 82 82 </param> | ||
| <param name="shift"> 0 0 </param> | ||
| <param name="maxOutput"> 16000 16000 </param> | ||
| <param name="maxInt"> 32000 32000 </param> | ||
| <param name="kff"> 0 0 </param> | ||
| </group> | ||
|  | ||
| <group name="2FOC_VEL_CONTROL"> | ||
| <param name="controlLaw"> low_lev_speed </param> | ||
| <param name="fbkControlUnits"> machine_units </param> | ||
| <param name="outputControlUnits"> machine_units </param> | ||
| <param name="kff"> 0 0 </param> | ||
| <param name="kp"> 12 12 </param> | ||
| <param name="kd"> 0 0 </param> | ||
| <param name="ki"> 16 16 </param> | ||
| <param name="shift"> 10 10 </param> | ||
| <param name="maxOutput"> 32000 32000 </param> | ||
| <param name="maxInt"> 32000 32000 </param> | ||
| </group> | ||
|  | ||
| <!-- other default PIDs: end --> | ||
|  | ||
|  | ||
| <!-- custom PIDs: begin --> | ||
|  | ||
| <!-- custom PIDs: end --> | ||
|  | ||
| <group name="OTHER_CONTROL_PARAMETERS"> | ||
| <param name="deadZone"> 0.0495 0.0495 </param> | ||
| </group> | ||
|  | ||
| </device> | 
        
          
          
            59 changes: 59 additions & 0 deletions
          
          59 
        
  experimentalSetups/neckmk3_2joints/hardware/motorControl/neck-eb2-j0_1-mc_service.xml
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| <?xml version="1.0" encoding="UTF-8" ?> | ||
| <!DOCTYPE params PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd"> | ||
|  | ||
| <params xmlns:xi="http://www.w3.org/2001/XInclude" robot="new_neck" build="1"> | ||
|  | ||
| <group name="SERVICE"> | ||
|  | ||
| <param name="type"> eomn_serv_MC_advfoc </param> | ||
|  | ||
| <group name="PROPERTIES"> | ||
|  | ||
| <group name="ETHBOARD"> | ||
| <param name="type"> amc </param> | ||
| </group> | ||
|  | ||
| <group name="CANBOARDS"> | ||
| <param name="type"> amc2c amcbldc </param> | ||
| <group name="PROTOCOL"> | ||
| <param name="major"> 2 2 </param> | ||
| <param name="minor"> 0 0 </param> | ||
| </group> | ||
| <group name="FIRMWARE"> | ||
| <param name="major"> 3 2 </param> | ||
| <param name="minor"> 1 1 </param> | ||
| <param name="build"> 0 0 </param> | ||
| </group> | ||
| </group> | ||
|  | ||
| <group name="JOINTMAPPING"> | ||
|  | ||
| <group name="ACTUATOR"> | ||
| <param name="type"> advfoc advfoc </param> | ||
| <param name="onboard"> amc2c amcbldc </param> | ||
| <param name="port"> ICC1:3 CAN1:1 </param> | ||
| </group> | ||
|  | ||
| <group name="ENCODER1"> | ||
| <param name="type"> aea3 aea3 </param> | ||
| <param name="port"> CONN:J5_X1 CONN:J5_X2 </param> | ||
| <param name="position"> atjoint atjoint </param> | ||
| <param name="resolution"> 16384 16384 </param> | ||
| <param name="tolerance"> 0.4 0.4 </param> | ||
| </group> | ||
|  | ||
| <group name="ENCODER2"> | ||
| <param name="type"> none none </param> | ||
| <param name="port"> CAN1:1:0 CAN1:2:0 </param> | ||
| <param name="position"> atmotor atmotor </param> | ||
| <param name="resolution"> 0 0 </param> | ||
| <param name="tolerance"> 0 0 </param> | ||
| </group> | ||
|  | ||
| </group> | ||
|  | ||
| </group> | ||
|  | ||
| </group> | ||
|  | ||
| </params> | 
      
      Oops, something went wrong.
        
    
  
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
Uh oh!
There was an error while loading. Please reload this page.