View Full Version : USB Camera on the SmartDashboard
seabasssl
13-02-2015, 15:38
Hey everyone! We've been having some issues with the USB camera not showing up on the SmartDashboard. Many of the threads I've read on here haven't given us any significant results, about our issue.
We are getting the "Huffman table not defined" error - we're running on a 64 bit OS. I had two cameras working the first time I tried it, and then the next day, we couldn't even get one to work.
There is a reading on the DriverStation, when the USB Camera HW option is selected, but no image display. :confused:
RyanCahoon
14-02-2015, 05:26
Have you tried my solution? http://www.chiefdelphi.com/forums/showthread.php?t=134404
seabasssl
14-02-2015, 14:21
Thank you for your patch, seems like it's an awesome solution - but I'm not getting any visual from the camera still. :ahh:
RyanCahoon
15-02-2015, 04:28
Thank you for your patch, seems like it's an awesome solution - but I'm not getting any visual from the camera still. :ahh:
What code are you running on the robot to transmit the camera images to the driver station?
Just to clarify - are you using SmartDashboard or the LabVIEW/default dashboard?
Do you get the same error or a different one when you use my version of the applet? If you are getting an error with my applet, there should be files placed at C:\Users\<user name>\SmartDashboard\extensions\ named error.txt and frame.jpg. Can you upload them?
Thanks,
seabasssl
15-02-2015, 14:31
I am using the Simple Vision example code
CameraServer::GetInstance()->SetQuality(50);
CameraServer::GetInstance()->StartAutomaticCapture("cam0");
CameraServer::GetInstance()->StartAutomaticCapture("cam1");
I added the "cam1", however, because we've been having issues with the RoboRIO not registering "cam0", but instead will just recognize the camera as cam1 and up.
On our prototype robot, we're having success with one camera - but not on our "final" robot, even when using the same RoboRIO, and code from our prototype robot.
We had success with both the SmartDashboard and the standard Driver Station on our prototype robot.
Here's the error log 18374
The frame.jpg has no data in it.
RyanCahoon
16-02-2015, 04:48
Try removing the first call to StartAutomaticCapture. From the source code for CameraServer, it looks like only the first call to StartAutomaticCapture will have any effect, so your code will be trying to stream from cam0.
See here for instructions on determining the names for your camera(s): http://wpilib.screenstepslive.com/s/4485/m/24194/l/288981-using-the-microsoft-lifecam-hd-3000#UsingTheCamera-C++\Java
joliet cyborgs
17-02-2015, 10:27
Copying and pasting the code from the Image Processing example code worked for us. You just have to make sure to put each section of code in the right place.
rod@3711
17-02-2015, 12:52
Just having one call to StartAutomaticCapture with the correct name (ie cam2) got things going. We will give up on getting 2 cameras going.
Now the image is seems overexposed. If I use change speed slider bar on dashboard, the image is good for one or 2 update, then back to overexposed. Any ideas?
RyanCahoon
17-02-2015, 17:17
Just having one call to StartAutomaticCapture with the correct name (ie cam2) got things going. We will give up on getting 2 cameras going.
You could modify the Intermediate Vision example to allow you to switch between cameras.
#include "WPILib.h"
/**
* Uses IMAQdx to manually acquire a new image each frame, and annotate the image by drawing
* a circle on it, and show it on the FRC Dashboard.
*/
class IntermediateVisionRobot : public SampleRobot
{
IMAQdxSession camera1;
IMAQdxSession camera2;
Image *frame;
IMAQdxError imaqError;
public:
void RobotInit() override {
SmartDashboard::PutBoolean("Camera Select", true);
// create an image
frame = imaqCreateImage(IMAQ_IMAGE_RGB, 0);
//the camera name (ex "cam0") can be found through the roborio web interface
imaqError = IMAQdxOpenCamera("cam0", IMAQdxCameraControlModeController, &camera1);
if(imaqError != IMAQdxErrorSuccess) {
DriverStation::ReportError("IMAQdxOpenCamera error: " + std::to_string((long)imaqError) + "\n");
}
imaqError = IMAQdxConfigureGrab(camera1);
if(imaqError != IMAQdxErrorSuccess) {
DriverStation::ReportError("IMAQdxConfigureGrab error: " + std::to_string((long)imaqError) + "\n");
}
//the camera name (ex "cam1") can be found through the roborio web interface
imaqError = IMAQdxOpenCamera("cam1", IMAQdxCameraControlModeController, &camera2);
if(imaqError != IMAQdxErrorSuccess) {
DriverStation::ReportError("IMAQdxOpenCamera error: " + std::to_string((long)imaqError) + "\n");
}
imaqError = IMAQdxConfigureGrab(camera2);
if(imaqError != IMAQdxErrorSuccess) {
DriverStation::ReportError("IMAQdxConfigureGrab error: " + std::to_string((long)imaqError) + "\n");
}
}
void OperatorControl() override {
// acquire images
IMAQdxStartAcquisition(camera1);
IMAQdxStartAcquisition(camera2);
// grab an image, draw the circle, and provide it for the camera server which will
// in turn send it to the dashboard.
while(IsOperatorControl() && IsEnabled()) {
bool which = SmartDashboard::GetBoolean("Camera Select");
IMAQdxSession& capture_cam = which ? camera1 : camera2;
IMAQdxGrab(capture_cam, frame, true, NULL);
if(imaqError != IMAQdxErrorSuccess) {
DriverStation::ReportError("IMAQdxGrab error: " + std::to_string((long)imaqError) + "\n");
} else {
CameraServer::GetInstance()->SetImage(frame);
}
Wait(0.005); // wait for a motor update time
}
// stop image acquisition
IMAQdxStopAcquisition(camera1);
IMAQdxStopAcquisition(camera2);
}
};
START_ROBOT_CLASS(IntermediateVisionRobot);
If you want to stream cameras simultaneously, the easiest way would probably be to do some small modifications to the CameraServer class and the dashboard widget to configure different ports for the streams. Be careful about saturating the field bandwidth if you do that, though.
Now the image is seems overexposed. If I use change speed slider bar on dashboard, the image is good for one or 2 update, then back to overexposed. Any ideas?
I'm not sure what the 'speed' slider adjusts, but try changing the exposure on the camera. You may be able to do it through the RoboRIO's web interface (don't have one in front of me to check), but here's how you could do it in code:
CameraServer::GetInstance()->SetQuality(50);
std::shared_ptr<USBCamera> camera(new USBCamera("cam1", true));
camera->SetExposureManual(50); // change this value
camera->SetBrightness(50); // change this value
CameraServer::GetInstance()->StartAutomaticCapture(camera);
rod@3711
18-02-2015, 10:00
Thanx Ryan, we will try those things on spare robot. The students have a bad case of Bag and Tag Burnout, so we will hit it on Saturday.
vBulletin® v3.6.4, Copyright ©2000-2017, Jelsoft Enterprises Ltd.