I suggest projecting all of the 3D chessboard corner points (use 0 for Z coordinate) using the calibrated camera matrix, distortion model and the corresponding extrinsics (pose) and then draw them to the original image.
So, for example, If you have 5 chessboard images you are using for calibrateCamera, you will get back one camera matrix (intrinsics), one set of distortion coefficients, and 5 rvec and tvec values.
For image 1 use the camera matrix, distortion coefficients and rvec_1 and tvec_1 to project the world coordinates of the chessboard corners ( <X,Y,0> for each corner). This will give you distorted image coordinates which you can then directly draw (with cv::circle) to the image. Do this for both the fisheye and pinhole models and save the images.
When you look at the images with the circles drawn to them, you should be able to tell where your error is coming from. Maybe the fisheye model isn’t suitable, but maybe you just have some errant points that it’s detecting incorrectly.
I suggest doing this even if you don’t think you need it. Once you have the function to do it, you can just use it any time you want…and it can be really helpful in understanding why calibration sometimes produces good results and sometimes doesn’t.
To be very clear, the rational model doesn’t need “lots of calibration images” as much as it needs a set of calibration images that includes chessboard corners near the corners of the image. If all of your calibration images look similar to the one you posted, you will get a good fit in the central part of the image, but beyond that there aren’t any guarantees.
Also it bears repeating - in order to get chessboard corners near the edges/corners of the image, it’s vastly easier if you use the Charuco calibration pattern. Unless something has changed, the standard chessboard must be fully visible in each calibration image - partial images don’t work (which makes it hard to get points near the corners.)
Good luck.