[docs]defsteering_wheel_to_ackermann(steering_wheel_angle:float,model:dict)->float:""" Calculate the ackermann angle with the steering wheel angle as input. Using a detailed formula, first implemented by Birk Blumhoff for his study work. Parameters ---------- steering_wheel_angle : float Angle of the steering wheel [rad]. model : dict Returns ------- float Ackermann angle [rad]. """# check if the setvalue is valid (not outside the steering kinematcs range)if(steering_wheel_angle<-0.5*model['steering_range']):steering_wheel_angle=-0.5*model['steering_range']elif(steering_wheel_angle>0.5*model['steering_range']):steering_wheel_angle=0.5*model['steering_range']# calculate left sidedelta_p=model['r_pin']*steering_wheel_angle#ggf Normalisierung hinzufügenl1_l=(model['track_width']-model['l_rack'])/2-delta_pl2_l=np.sqrt(l1_l**2+model['D']**2)beta_l=np.pi/2-np.arctan(model['D']/l1_l)-np.arccos((model['l_arm']**2+l2_l**2-model['l_tie']**2)/(2*model['l_arm']*l2_l))# calculate left tire Ackermann-angledelta_l=-(beta_l+model['normalization'])# calculate right sidedelta_p=-model['r_pin']*steering_wheel_angle#ggf Normalisierung hinzufügenl1_r=(model['track_width']-model['l_rack'])/2-delta_pl2_r=np.sqrt(l1_r**2+model['D']**2)beta_r=np.pi/2-np.arctan(model['D']/l1_r)-np.arccos((model['l_arm']**2+l2_r**2-model['l_tie']**2)/(2*model['l_arm']*l2_r))# calculate left tire Ackermann-angledelta_r=(beta_r+model['normalization'])# return both tire-angles [rad]return(delta_l+delta_r)/2
[docs]defackermann_to_radius(ackermann:npt.NDArray[np.floating],wheelbase:float=1.550)->npt.NDArray[np.floating]:""" Calculate radius of turn with the ackermann angle. Using a simple bicycle model that disregards any side slip angle. Parameters ---------- ackermann : npt.NDArray[np.floating] Ackermann angle, aka steering angle of the wheel [rad]. wheelbase : float, optional Distance between front and rear axel., by default 1.550 Returns ------- npt.NDArray[np.floating] Radius of turn. """returnwheelbase/np.tan(ackermann)