View Full Version : Python: button no attribute to wpilib ?
team-4480
21-01-2015, 17:05
Hi! We are trying to use a joystick button with wpilib.buttons.JoystickButton but we keep getting a "buttons has no attribute to wpilib". We really need help on this because we would love to use pneumatics. We are using python and robotpy. Any help would be greatly appreciated!
virtuald
21-01-2015, 17:14
You don't actually need to use the JoystickButton object, you can just use joystick.getRawButton() or joystick.getTrigger(), etc.
Otherwise, make sure you import wpilib.buttons, not just import wpilib.
team-4480
21-01-2015, 18:03
You don't actually need to use the JoystickButton object, you can just use joystick.getRawButton() or joystick.getTrigger(), etc.
Otherwise, make sure you import wpilib.buttons, not just import wpilib.
For some really annoying reason, I can't have an "If" statement in my code or the Driver Station will not recognize the code. I tried --nc and it shows nothing. Thanks!
TimTheGreat
21-01-2015, 18:29
For some really annoying reason, I can't have an "If" statement in my code or the Driver Station will not recognize the code. I tried --nc and it shows nothing. Thanks!
Are you typing 'If'? Make sure it's lowercase.
if xyz:
blah blah blah
And it might be helpful to put your code in pastebin and share a link so we can take a look at it.
virtuald
21-01-2015, 18:31
For some really annoying reason, I can't have an "If" statement in my code or the Driver Station will not recognize the code. I tried --nc and it shows nothing. Thanks!
Highly recommend using the pyfrc simulator then. It will help you find any logical issues with your code. If it runs in the simulator, it has a high chance of running on your robot.
team-4480
21-01-2015, 18:59
Highly recommend using the pyfrc simulator then. It will help you find any logical issues with your code. If it runs in the simulator, it has a high chance of running on your robot.
With this code: http://pastebin.com/DRa0hbVy I get this error in the sim Robot Drive... Output not updated often enough.
I don't think that would stop the code from being recognized though. Thanks!
TimTheGreat
21-01-2015, 19:46
So I ran your code and noticed that the error was wpilib.motorsafety... to fix this, under self.robot_drive=wpilib.RobotDrive(self.motor1,sel f.motor2) insert self.robot_drive.setSafetyEnabled(False)
Also, no need for self.teleopPeriodic(). I think Peter Johnson mentioned this. Wpilib will call it on its own. And keep the while loop in teleop, and add wpilib.Timer.delay(.01) inside the loop.
team-4480
21-01-2015, 23:07
So I ran your code and noticed that the error was wpilib.motorsafety... to fix this, under self.robot_drive=wpilib.RobotDrive(self.motor1,sel f.motor2) insert self.robot_drive.setSafetyEnabled(False)
Also, no need for self.teleopPeriodic(). I think Peter Johnson mentioned this. Wpilib will call it on its own. And keep the while loop in teleop, and add wpilib.Timer.delay(.01) inside the loop.
So that would be why the Driver Station rejects the code? Thanks a bunch and I will try that tomorrow!!
virtuald
22-01-2015, 01:28
So that would be why the Driver Station rejects the code? Thanks a bunch and I will try that tomorrow!!
When you say 'rejects the code', what do you mean? Is there an error message, or some other indicator that is telling you this?
team-4480
22-01-2015, 09:15
When you say 'rejects the code', what do you mean? Is there an error message, or some other indicator that is telling you this?
The Robot code indicator is red on the Driver Station and there is no errors that show up.
TimTheGreat
22-01-2015, 09:31
The Robot code indicator is red on the Driver Station and there is no errors that show up.
So that's not the driver station rejecting the code, its the code on the robot breaking. Adding the safety code line should prevent this, and to test just run it in the simulator
virtuald
22-01-2015, 11:38
So that's not the driver station rejecting the code, its the code on the robot breaking. Adding the safety code line should prevent this, and to test just run it in the simulator
No, do NOT disable the motor safety error. In previous years, the motor safety stuff didn't always work as well as we would have liked previously, but this year it should work without any problems. If one is getting the motor safety error, that means that you aren't feeding the motors often enough.
Looking at the code which was pasted the robot drive motor call is commented out, so it's not feeding it at all -- which means the error message is correct. Once you uncomment it out, the error message goes away.
Additionally, since the OP is using IterativeRobot, no Timer.delay call is required.
I modified your code slightly, and http://pastebin.com/CLDhyuc5 works for me without any problems in the simulator. You'll note that I changed 'aracadeDrive' to 'arcadeDrive', which could be what caused your robot to crash. I don't have access to a robot to run it on.
Also, you don't need the from __future__ import division at the top, that is only needed for python 2.
virtuald
22-01-2015, 11:42
Also, looking further, your controller adjustment code is wrong. The values returned from the joystick are in the range [-1, 1], so you don't need to divide by 255.
Additionally, you shouldn't have the 'else: pass' at the end of your statement. If you ever hit that condition, then x1 won't be set, and your code will die with an exception. It should be 'else: x1=??', where ?? is the default value (probably 0?).
Looking around CD, you'll see that most people adjust the joystick curve by squaring the inputs instead of a sequence of if statements as you have there.
team-4480
22-01-2015, 15:51
Also, looking further, your controller adjustment code is wrong. The values returned from the joystick are in the range [-1, 1], so you don't need to divide by 255.
Additionally, you shouldn't have the 'else: pass' at the end of your statement. If you ever hit that condition, then x1 won't be set, and your code will die with an exception. It should be 'else: x1=??', where ?? is the default value (probably 0?).
Looking around CD, you'll see that most people adjust the joystick curve by squaring the inputs instead of a sequence of if statements as you have there.
Thanks with your help, we got our buttons to work! When I am using cmath for square root of the getX and getY, I get a... TypeError: unorderable types: complex() > float() Again, I can not thank you enough for your help!
TimTheGreat
24-01-2015, 00:24
When I am using cmath for square root of the getX and getY, I get a... TypeError: unorderable types: complex() > float()
Well the joystick ranges are -1:1, and if you take the square root of -1 you get a complex number (i). What are you using the square root for?
vBulletin® v3.6.4, Copyright ©2000-2017, Jelsoft Enterprises Ltd.