<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def connect(self, port=None, options=None):
 """ Connects the robot to a serial port. Parameters port : str OS-specific port name or ``'Virtual Smoothie'`` options : dict if :attr:`port` is set to ``'Virtual Smoothie'``, provide the list of options to be passed to :func:`get_virtual_device` Returns ------- ``True`` for success, ``False`` for failure. Note ---- If you wish to connect to the robot without using the OT App, you will need to use this function. Examples -------- """


        self._driver.connect(port=port)
        self.fw_version = self._driver.get_fw_version()

        # the below call to `cache_instrument_models` is relied upon by
        # `Session._simulate()`, which calls `robot.connect()` after exec'ing a
        # protocol. That protocol could very well have different pipettes than
        # what are physically attached to the robot
        self.cache_instrument_models()