First, I'd try to isolate if the problem is with bottom vision or not. Just disable bottom vision for the part (don't forget to hit the Apply button after making the change) and try some more placements. With bottom vision disabled, the placement locations and angles may be slightly off, but you should be able to easily see if the placements are still off by +/- 90 degrees or not. If the +/-90 degree problem remains, check the following:
1. Verify your nozzle is rotating in the correct direction and by the correct amount. This is an easy point to overlook as none of the calibration steps really verify correct nozzle rotation. Place an easy to see mark on the side of the nozzle and use the jog buttons to rotate the nozzle. Verify it takes exactly 360 degrees of commanded rotation (3 clicks of the jog button at 100 degrees plus 6 at 10 degrees) to get the mark back to where it started. Watch the nozzle as you jog it to verify that it is not rotating at double or triple the amount of the commanded angle (as integer multiples of 360 degrees will also bring the mark back to its original starting point). Positive rotation should be counterclockwise when viewed from above looking down on the machine. If the amount or direction of rotation is not correct, you will need to fix the settings on your machine's controller before proceeding.
2. Verify your part's zero orientation. This is set in the CAD package used to layout the board. While you can define this any way you like, to avoid confusion when discussing problems or sharing designs, it is best to follow the standard zero orientation as outlined
here. Most likely your test board used the zero orientations as defined there but you never know for sure unless you check. If you don't have access to the board's CAD package, you will just need to assume the zero orientation is that observed in step 3 below.
3. Now run a fiducial check on your board and then select one of the placements in the table. Use the "Position the camera at the placement's location." button to move the camera over the placement's location. Verify that the orientation of the camera's crosshairs is consistent with the part's zero orientation. Assuming your zero orientation is set as defined by the standard (pin 1 left and pin 2 right), the cyan crosshair (+Y) should point crossways to the body of the resistor, the -X red crosshair should point in the direction of the resistor's pin1, and the +X red crosshair in the direction of the resistor's pin 2 (obviously for resistors, pin 1 and pin 2 don't really have much significance but for polarized components such as capacitors and diodes, this is much more important). Repeat this for several other placements. If you find any inconsistencies here, you may be using an out-of-date board definition - try re-exporting it from your CAD package and re-importing it into OpenPnP.
4. Verify that when the top camera is moved over the feeder's pick location (using the "Move the camera to the selected feeder's current pick location." button), that the camera's crosshairs are aligned consistent with the part's zero orientation from steps 2 or 3 above. Again assuming your zero orientation is set as defined by the standard (pin 1 left and pin 2 right), the cyan crosshair (+Y) should point crossways to the body of the resistor, the -X red crosshair should point in the direction of the resistor's pin 1 pad, and the +X red crosshair in the direction of the resistor's pin 2 pad. If this is not how the crosshairs are aligned, you need to change the setting of the part's rotation in the feeder. This is done differently for different feeders, so you need to provide more information as to what kind of feeder you are using. For instance, ReferenceStripFeeders have an explicit "Rotation in tape" setting while others like the ReferenceAutoFeeder just set the rotation via the Pick Location Rotation field.