in robots/LoCoBot/locobot_control/nodes/pointrobot3factor_ros_server.py [0:0]
def get_plan(start_conf_val, start_vel, end_conf_val, end_vel, sdf, params):
start_conf = start_conf_val
end_conf = end_conf_val
avg_vel = (end_conf_val - start_conf_val / params.total_time_step) / params.delta_t
# plot param
# init optimization
graph = NonlinearFactorGraph()
init_values = Values()
for i in range(0, params.total_time_step + 1):
key_pos = symbol(ord("x"), i)
key_vel = symbol(ord("v"), i)
#% initialize as straight line in conf space
pose = start_conf_val
vel = avg_vel
init_values.insert(key_pos, pose)
init_values.insert(key_vel, vel)
#% start/end priors
if i == 0:
graph.push_back(PriorFactorVector(key_pos, start_conf, params.pose_fix))
graph.push_back(PriorFactorVector(key_vel, start_vel, params.vel_fix))
elif i == params.total_time_step:
graph.push_back(PriorFactorVector(key_pos, end_conf, params.pose_fix_goal))
graph.push_back(PriorFactorVector(key_vel, end_vel, params.vel_fix_goal))
graph.add(VehicleDynamicsFactorVector(key_pos, key_vel, params.cost_sigma))
# GP priors and cost factor
if i > 0:
# graph.push_back(PriorFactorVector(key_pos, end_conf, params.pose_fix_goal))
# graph.push_back(PriorFactorVector(key_vel, end_vel, params.vel_fix_goal))
key_pos1 = symbol(ord("x"), i - 1)
key_pos2 = symbol(ord("x"), i)
key_vel1 = symbol(ord("v"), i - 1)
key_vel2 = symbol(ord("v"), i)
temp = GaussianProcessPriorLinear(
key_pos1, key_vel1, key_pos2, key_vel2, params.delta_t, params.Qc_model
)
graph.push_back(temp)
#% cost factor
graph.push_back(
ObstaclePlanarSDFFactorPointRobot(
key_pos,
params.pR_model,
sdf,
params.cost_sigma,
params.epsilon_dist,
)
)
#% GP cost factor
if params.use_GP_inter and params.check_inter > 0:
for j in range(1, params.check_inter + 1):
tau = j * (params.total_time_sec / params.total_check_step)
graph.add(
ObstaclePlanarSDFFactorGPPointRobot(
key_pos1,
key_vel1,
key_pos2,
key_vel2,
params.pR_model,
sdf,
params.cost_sigma,
params.epsilon_dist,
params.Qc_model,
params.delta_t,
tau,
)
)
if params.use_trustregion_opt:
parameters = DoglegParams()
optimizer = DoglegOptimizer(graph, init_values, parameters)
else:
parameters = GaussNewtonParams()
optimizer = GaussNewtonOptimizer(graph, init_values, parameters)
print("Initial Error = %d\n", graph.error(init_values))
optimizer.optimizeSafely()
result = optimizer.values()
print("Final Error = %d\n", graph.error(result))
res_flag = True
if graph.error(result) > params.acceptable_error_threshold:
res_flag = False
return result, res_flag