One of the main differences between man and machine when it comes to how we operate is that when we make a mistake, we try to learn from it so it doesn’t happen again. With a machine, if something goes wrong, it could continue to make it; not because it’s dumb (at least not our definition of it), but because it could lack the programming of what to do in the face of it. Even if it recognizes something is wrong, there’s nothing it can do to fix it short of breaking down. Even if you built the robot perfectly with no huge design flaws and with a source of energy that’s reliable and ready, there’s still the possibility of it not working properly. That’s not to say a gear getting jammed or a wire getting disconnected could be a problem, but they can be solve with minimal difficulty, at least compared to programming issues. Programming a robot to respond in the face of whatever could go wrong is quite difficult.
There are four approaches a robot could take to an obstacle; thinking followed by acting, reacting, thinking and acting simultaneously, and behavior-based acting. There are upsides and downsides to all these approaches; thinking too long can lead the robot having an accident, thinking in itself requires the robot to have accurate information on the world around it, etc. These approaches can be hard to distinguish when not looked at carefully, adding to the challenge. There are many factors like these to consider when programming a robot to interact with its environment.