I have seen this one before and it can be a bit mysterious. This exception is happening while the constructor chain of your Robot class and its base classes is being run. The issue is that the RobotBase class expects to be the one to initialize the network tables and it sees them as already initialized. One could well argue that this is a bug in RobotBase and/or NetworkTables but that is another discussion. What it sees is that some other code that ran earlier has already initialized the network tables.
New FRC Java programmers can find this quite strange since you have been told that the construction of your Robot class and the call to its robotInit() method is the first thing that happens in your code, so how could have the network tables already been initialized? Because, that is not the first code of yours that gets executed. Because of how Java static and instance initialization works (and this is a complicated subject), other code you write can execute first. In fact, you have this in your Robot class.
public static final GearGrabber gearGrabber = new GearGrabber();
public static final RobotLifter robotLifter = new RobotLifter();
public static final DriveTrain driveTrain = new DriveTrain();
public static final Cameras cameras = new Cameras();
These static fields will be initialized at first class reference. Which is before your constructor runs. You generally want to avoid statics in your Robot class for this reason. BTW, in your particular case, I believe it is the construction or your Cameras subsystem that is initializing the network tables before the construction of Robot because Cameras has this initialization:
private UsbCamera frontCamera = CameraServer.getInstance().startAutomaticCapture(0);
which will subsequently initialize the network tables (this is what bit us too).
So, change those four declarations to not be static and it should work.
public final GearGrabber gearGrabber = new GearGrabber();
public final RobotLifter robotLifter = new RobotLifter();
public final DriveTrain driveTrain = new DriveTrain();
public final Cameras cameras = new Cameras();
Note that it will not work because those fields will be initialized after your constructor runs. They will actually be initialized before your Robot constructor runs. However, they will be initialized after your base class instance fields are initialized and the base class constructors run. This means the RobotBase constructor will run before the Cameras subsystem is constructed and RobotBase will be happy.
However, you probably had them as public static for a reason and I suspect other parts of your code reference them directly. In fact, I can see that your command do just this. This will have to change.
Only one instance of your Robot class will be created and you can hold a reference to it and then your commands can get to these fields via this saved reference. The one and only static field in your Robot class should be this one:
public static Robot INSTANCE;
And then in robotInit() set it like this:
INSTANCE = this;
And then in your command, reference a subsystem like this:
requires(Robot.INSTANCE.driveTrain);
This is the way it is typically done in FRC although it makes me shudder a bit each time I see it. It works for these small systems but there are more robust ways to manage this is larger systems.
I hope this helps,
Steve