I wasn't totally sure what you meant by "draw and arc and check where the arc is on valid map position. Then move the robot there and calculate the angle to rotate the robot". Perhaps you mean something like this:
You draw an arc starting at the face, coming straight out of the all (tangent to the face's normal vector), and ending at the robot.
That's certainly one way to plan the path, and it works well if there's no obstacle in the way.
However, my own favourite path planning method is more computationally intensive, but works very well in many cases, handles acceleration and cornering, initial and final direction, and in many cases handles obstacle avoidance.
Iterative Finite Element Path Planning
Start by defining a path as a sequence of points from the face to the robot. The first 2 points should be along the line of the robot's forward travel direction, and the last 2 points should be along the Face's surface normal vector.
Now we will iteratively adjust the path:
while(path_is_not_OK())
{
n = number of points of path
// Loop through all the blue points
for(i=2; i<n-2; i++)
{
// move this point in the direction which reduces acceleration
prev_velocity = point[i] - point[i-1]
next_velocity = point[i+1] - point[i]
acceleration = next_velocity - prev_velocity
point[i-1] -= acceleration * 0.01
point[i] += acceleration * 0.02
point[i+1] -= acceleration * 0.01
}
}
I just wrote out that code from memory, so I don't guarantee its correctness.
After some number of iterations (about 50 - 500), you should see a nice smooth path from the robot to the target.
Feel free to add other adjustments into the loop to satisfy other constraints to may have on the path (for example wall or obstacle avoidance).