I looked in the ShowBase source code to see what saveSphereMap actually does. Turns out it’s pretty simple; here is a complete but simple example:
from panda3d.core import *
from direct.showbase.ShowBase import ShowBase
size = 512
numVertices = 1000
base = ShowBase()
# Load a simple scene.
env = loader.loadModel("environment")
env.reparentTo(base.render)
# Now make the cube map buffer.
rig = base.camera.attachNewNode("rig")
buffer = base.win.makeCubeMap("test", size, rig)
assert buffer
fm = FisheyeMaker('card')
fm.setNumVertices(numVertices)
fm.setSquareInscribed(1, 1.1)
fm.setReflection(True)
card = base.render2d.attachNewNode(fm.generate())
card.setTexture(buffer.getTexture())
# Disable the scene render on the normal 'render' graph.
base.win.getDisplayRegion(1).setActive(False)
base.run()
This attaches to base.camera which you can just point upward as you wish.
You may want to change the setReflection flag depending on whether you want an inverted or a regular view.
As for customizing the camera positions: sure, you can change the individual positions of the cameras that makeCubeMap attaches to the rig, although I’m not sure how you could get a continuous image with the set-up you described.