コード例 #1
0
static void
compute_laser_rays_from_velodyne_and_create_a_local_map(sensor_parameters_t *velodyne_params, sensor_data_t *velodyne_data, rotation_matrix *r_matrix_car_to_global,
				 carmen_pose_3D_t *robot_pose, carmen_vector_3D_t *robot_velocity,
				 double x_origin, double y_origin, int point_cloud_index, double phi)
{
	spherical_point_cloud v_zt = velodyne_data->points[point_cloud_index];
	int N = v_zt.num_points / velodyne_params->vertical_resolution;

	double dt = 1.0 / (1808.0 * 12.0);
	carmen_pose_3D_t robot_interpolated_position = *robot_pose;

	// Ray-trace the grid
	int jump = filter->param->jump_size;
	for (int k = 0; k < N; k += jump)
	{
		robot_interpolated_position = carmen_ackerman_interpolated_robot_position_at_time(*robot_pose, (double) k * dt, robot_velocity->x, phi, car_config.distance_between_front_and_rear_axles);
		r_matrix_car_to_global = compute_rotation_matrix(r_matrix_car_to_global, robot_interpolated_position.orientation);

		carmen_prob_models_compute_relevant_map_coordinates(velodyne_data, velodyne_params, k * velodyne_params->vertical_resolution, robot_interpolated_position.position, sensor_board_1_pose,
				r_matrix_car_to_global, sensor_board_1_to_car_matrix, robot_wheel_radius, x_origin, y_origin, &car_config, 0, 0);

		carmen_prob_models_get_occuppancy_log_odds_via_unexpeted_delta_range(velodyne_data, velodyne_params, k * velodyne_params->vertical_resolution, highest_sensor, safe_range_above_sensors, 0, 0);

		carmen_prob_models_upgrade_log_odds_of_cells_hit_by_rays(&local_map, velodyne_params, velodyne_data, 0);

		carmen_prob_models_update_intensity_of_cells_hit_by_rays(&local_sum_remission_map, &local_sum_sqr_remission_map, &local_count_remission_map, velodyne_params, velodyne_data, highest_sensor, safe_range_above_sensors, NULL, 0);
	}
}
コード例 #2
0
static void
update_cells_in_the_velodyne_perceptual_field(sensor_parameters_t *sensor_params, sensor_data_t *sensor_data, rotation_matrix *r_matrix_robot_to_global,
					      int point_cloud_index)
{
	int i, j;
	spherical_point_cloud v_zt = sensor_data->points[point_cloud_index];
	carmen_pose_3D_t robot_interpolated_position;

	double v = sensor_data->robot_velocity[point_cloud_index].x;
	double phi = sensor_data->robot_phi[point_cloud_index];

	double scan_time = (v_zt.num_points / sensor_params->vertical_resolution) * sensor_params->time_spent_by_each_scan;
	double dt = (sensor_data->current_timestamp - sensor_data->robot_timestamp[point_cloud_index]) - scan_time;

	// Ray-trace the grid
	for (i = 0, j = 0; i < v_zt.num_points; i = i +  sensor_params->vertical_resolution, j++, dt += sensor_params->time_spent_by_each_scan)
	{
		robot_interpolated_position = carmen_ackerman_interpolated_robot_position_at_time(sensor_data->robot_pose[point_cloud_index], dt, v, phi, car_config.distance_between_front_and_rear_axles);
		r_matrix_robot_to_global = compute_rotation_matrix(r_matrix_car_to_global, robot_interpolated_position.orientation);

		change_sensor_rear_range_max(sensor_params, v_zt.sphere_points[i].horizontal_angle);

		carmen_prob_models_compute_relevant_map_coordinates(sensor_data, sensor_params, i, robot_interpolated_position.position, sensor_board_1_pose,
				r_matrix_robot_to_global, sensor_board_1_to_car_matrix, robot_wheel_radius, g_map_origin.x, g_map_origin.y, &car_config, 0, 0);

		carmen_prob_models_get_occuppancy_log_odds_via_unexpeted_delta_range(sensor_data, sensor_params, i,
				highest_sensor, safe_range_above_sensors, 0, 0);

		carmen_prob_models_update_intensity_of_cells_hit_by_rays(&sum_remission_map, &sum_sqr_remission_map, &count_remission_map, sensor_params, sensor_data, highest_sensor, safe_range_above_sensors, NULL, 0);
	}
}
コード例 #3
0
static void add_velodyne_spherical_points_to_pointcloud(
		pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud,
		spherical_point_cloud *v_zt, unsigned char *intensity,
		rotation_matrix *r_matrix_car_to_global, carmen_pose_3D_t *robot_pose,
		sensor_parameters_t *velodyne_params, sensor_data_t *velodyne_data) {
	int i, j, k;
	double dt = 0;
	carmen_pose_3D_t robot_interpolated_position;
	double v = velodyne_data->robot_velocity[velodyne_data->point_cloud_index].x;
	double phi = velodyne_data->robot_phi[velodyne_data->point_cloud_index];

	carmen_robot_ackerman_config_t car_config;
	car_config.distance_between_front_and_rear_axles = distance_between_front_and_rear_axles;
	car_config.distance_between_rear_wheels = robot_width;

	for (i = 0, j = 0; i < v_zt->num_points;
			i = i + 1 * velodyne_params->vertical_resolution, j += 1) {
		dt = j * velodyne_params->time_spent_by_each_scan;
		robot_interpolated_position =
				carmen_ackerman_interpolated_robot_position_at_time(*robot_pose,
						dt, v, phi, distance_between_front_and_rear_axles);

		r_matrix_car_to_global = compute_rotation_matrix(r_matrix_car_to_global,
				robot_interpolated_position.orientation);

		carmen_prob_models_compute_relevant_map_coordinates(velodyne_data, velodyne_params, i, robot_interpolated_position.position, sensor_board_1_pose,
				r_matrix_car_to_global, sensor_board_1_to_car_matrix, robot_wheel_radius, 0.0, 0.0, &car_config, 0);


		carmen_prob_models_get_occuppancy_log_odds_via_unexpeted_delta_range(velodyne_data, velodyne_params, i,
				2.0, 10.0, velodyne_params->delta_difference_mean, velodyne_params->delta_difference_stddev);


		for (k = 0; k < velodyne_params->vertical_resolution; k++)
		{
			carmen_vector_3D_t point = get_global_point_from_velodyne_point(
					v_zt->sphere_points[i + k], velodyne_params,
					r_matrix_car_to_global,
					robot_interpolated_position.position);

			if (velodyne_data->occupancy_log_odds_of_each_ray_target[k] > velodyne_params->log_odds.log_odds_l0)
			{
//				printf("aqui\n");
							if (point_is_valid(v_zt->sphere_points[i + k], velodyne_params))
				add_velodyne_point_to_pointcloud(pointcloud, intensity[i + k],
						point);
			}
		}
	}
}
コード例 #4
0
void
localalize_using_map_set_robot_pose_into_the_map(double v, double phi, double timestamp)
{

	static double last_timestamp = timestamp;

	globalpos_initialized = 1;

	robot_pose = carmen_ackerman_interpolated_robot_position_at_time(robot_pose, timestamp - last_timestamp, v, phi, car_config.distance_between_front_and_rear_axles);

	r_matrix_car_to_global = compute_rotation_matrix(r_matrix_car_to_global, robot_pose.orientation);

	last_timestamp = timestamp;

}