My team has two cameras on their robot; we have recently decided that we want to have two simultaneous video streams instead of switching between them. Camera switching worked, albeit with a slight lag during switching.
After our first regional, however, I realized that we needed to record the video stream from the cameras for after match viewing to facilitate debugging and match review.
I have successfully retrieved both camera feeds and displayed them. However, I have only been able to have one of the two camera feed save to AVI after recording. The selection of feed seems to be random.
I modified the AVI creation code VI so that it accepts an outside path instead of grabbing the one from the log file path, so that I can have it save as two separate files. However, this does not work.
What in the Dashboard code is preventing me from saving two files?
May I ask how you were able to view 2 camera images simultaneously? We have the drive station set up to have two camera images, but it is not showing both camera images. Any ideas what we are not doing?
The way I had implemented it was to duplicate the “WPI_CameraRead MJPG For Dashboard” VI and give it a separate IP corresponding to the other camera. In order to use more than one camera, you have to assign them unique IPs and explicitly address them in the Dashboard code; you cannot use the “Camera IP” local variable, as it will only return one IP (not sure which though).
It’s funny that you mention this though, because I am currently trying to fix a problem where when one camera is disconnected, waiting when opening one TCP port causes pausing in the reading of the image in the other.
I am currently working on this problem. Will post when I figure anything out.
With regards to the pausing, I’m guessing you’re reading them both in the same while loop. That VI blocks until it reads in an image. To solve this, move one to a separate loop.
With regards to the pausing, I’m guessing you’re reading them both in the same while loop. That VI blocks until it reads in an image. To solve this, move one to a separate loop.
Unfortunately, the problem isn’t that simple. They are in two separate while loops, which would normally cause them to run in parallel. However, in one of the deeply nested VIs (HTTP Authentication, I believe), there is a TCP Open block which has a timeout of 2 seconds. So, when one camera has failed to make a connection, the HTTP VI is called repeatedly, only pausing for the default 500ms wait that occurs when the camera is not active.
While the one camera is waiting on a connection to open (TCP Open), it blocks the TCP Read operation of the other camera used to get the image.
I have “solved” this problem by limiting the number of times a camera can attempt to connect (in case one is unplugged). Then, I decide when to try again based upon what the robot is doing. In my case, it will retry the vision camera when shooting, and retry the intake camera when driving around (robot tells the Dashboard what to do via NetworkTables).
I have still not solved the problem of being able to record both at once, although I assume it may have something to do with a conflict in resources (access to file system, encoding, etc.).
I think that the solution is to make a second call to the Dashboard_Create AVI vi. Pass in the name you want for the second camera. Oh, and you’ll want to make the Dashboard Create VI be reentrant. The Preallocated clone will compile such that the feedback node inside the VI is unique per call and will correctly manage more than one file refnum.