I’m trying to send camera data to the monitor with CameraServer. I followed the instructions at https://wpilib.screenstepslive.com/s/currentCS/m/vision/l/669166-using-the-cameraserver-on-the-roborio, but upon running the code it crashes and says “No robot code”. I ran a debugger and it said that there was a segmentation fault when running CameraServer::GetInstance(). I have tried separating the pieces of the code and putting everything in a try-catch statement, but nothing works. Here is my code:
static void CameraServerLoop() {
try {
CameraServer * serv = CameraServer::GetInstance(); // crashes here
cs::CvSource outputStreamStd = serv->PutVideo("Vision Camera", 640, 480);
int sockfd, newsockfd, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
std::stringstream ss;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
return CameraError("Could not open socket");
std::cout << "Created socket";
std::cout.flush();
memset((void*)&serv_addr, sizeof(serv_addr), 0);
//bzero((char *) &serv_addr, sizeof(serv_addr));
int tru = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &tru, sizeof(int)) < 0)
return CameraError("Could not set socket options");
std::cout << "Set socket options";
std::cout.flush();
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(3805);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
return CameraError("Could not bind socket to port");
std::cout << "Bound socket";
std::cout.flush();
listen(sockfd,5);
std::cout << "Done listening";
std::cout.flush();
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (unsigned int*)&clilen);
if (newsockfd < 0)
return CameraError("Could not accept connection");
std::cout << "Accepted connection";
std::cout.flush();
//bzero(buffer,256);
cameraLoopStatus = true;
std::cout << "Connected to raspi.\n";
long long count = 0;
while (true) {
n = read(newsockfd,buffer,256);
if (n < 0) return CameraError("Could not read camera data!");
ss.write(buffer, n);
count += n;
if (count >= 640*480*3) {
std::cout << "Got frame from pi\n";
char imbuffer[640*480*3];
ss.read(imbuffer, 640*480*3);
cv::Mat image(cv::Size(640, 480), CV_8UC3, imbuffer, cv::Mat::AUTO_STEP);
outputStreamStd.PutFrame(image);
count -= 640*480*3;
}
}
} catch (std::exception e) {
std::cout << "Got exception: " << e.what() << "\n";
cameraLoopStatus = false;
return;
}
}
Is there any way to fix this?