How to use blender for reinforcement learning? How to control camera movement and save the rendered images that the camera captured?
Welcome to Blender.SE Tianqi Wang, please take the tour to find out how to use this site. Your question may get closed because it contains multiple questions, is partially opinion based, very broad and not quite limited to Blender. In future you can post as many questions as you want, but please limit yourself to a single question per post.
Cycles baking
Yes, for a more naturalistic look of your images, you could bake diffuse lighting onto textures which are mapped to the objects of the scene. This won't work with transparent or reflective material components, but I guess may be optional in your setup. You will probably want to match the surface properties of your realworld environment; for an easier start, you could choose a diffuse realworld environment for testing with little reflections (this will likely be easier to the NN as well). Note, that you have to rebake your lighting/textures if you reconfigure your set as the shadows cast by objects will no longer be correct.
Even though not physically based the renderers Blender Internal (2.79) or EEVEE (2.8) could also be used to create the texture maps, using tricks like environment lighting/ambient occlusion. The images in the paper look as if they were realtime renders with none of the enhancement (ao, light baking), so maybe this step adds unnecessary complexity.

No visual enhancements here. Looks like a 2000's game.
Camera Movement
Your image feed doesn't have to be realtime since the calculations can be split into discreet steps. I'd advise you not to use Blender's game engine. (If you think a game engine is necessary, I'd suggest Unity. It is free for personal use, has a good connection with Blender and support automatic light baking as well.)
I think, setting the camera's properties directly in code should be fine.
import bpy
import mathutils

camera = bpy.context.scene.camera
# set the camera's rotation mode to quaternion once (or do it through the GUI)
camera.rotation_mode = 'QUATERNION'

# get the camera's position and orientation
camera_location = tuple(camera.location)
camera_orientation = tuple(camera.rotation_quaternion)

# set the camera's position
camera.location = mathutils.Vector((0, 0, 0))
camera.rotation_quaternion = mathutils.Quaternion((0, 0, 0, 0))

If you are using constraints or other dependencies in your scene, you have to call bpy.context.scene.update() after setting new coordinates for your camera.
Save images from the viewport
The functionality of saving images with CtrlF3 is not exposed to the API (in 2.79).
I have documented two workarounds here.
The 2nd method uses an OpenGl render, but you will have to save and read the image to and from disk on each frame.