예제 #1
0
    def task(self, **kwargs):

        # Start ROS
        ros_utils.start_master()

        # Launch EKF and aerial updater
        ros_utils.launch(package='localization',
                         launch_file='jackal_ekf.launch')
        ros_utils.launch(package='localization',
                         launch_file='aerial_global_updater.launch',
                         argv={
                             'ugv_poses_path':
                             self.data_sources['ugv_poses_path'],
                             'relevant_update_index':
                             self.data_sources['relevant_update_index'],
                             'resolution':
                             self.params['resolution']
                         })

        # Start recording output bag
        output_bag_path = os.path.join(self.repetition_dir,
                                       '%s_output.bag' % self.name)
        ros_utils.start_recording_bag(
            output_bag_path,
            ['/odometry/filtered', '/odometry/filtered/aerial_updates'])

        # Start input bag and wait
        _, bag_duration = ros_utils.play_bag(
            self.data_sources['jackal_bag_path'],
            start_time=self.params['bag_start_time'])
        time.sleep(bag_duration)

        # Stop recording output bag
        ros_utils.stop_recording_bags()

        # Plot
        ekf_df = ros_utils.bag_to_dataframe(
            output_bag_path,
            topic=r'/odometry/filtered',
            fields=['pose.pose.position.x', 'pose.pose.position.y'])
        ekf_with_aerial_update_df = ros_utils.bag_to_dataframe(
            output_bag_path,
            topic=r'/odometry/filtered/aerial_updates',
            fields=['pose.pose.position.x', 'pose.pose.position.y'])
        ekf_df.to_csv(os.path.join(self.repetition_dir, 'ekf_pose.csv'))
        ekf_with_aerial_update_df.to_csv(
            os.path.join(self.repetition_dir,
                         'ekf_with_aerial_update_pose.csv'))
        self.results[self.repetition_id]['ekf_pose_path'] = os.path.join(
            self.repetition_dir, 'ekf_pose.csv')
        self.results[
            self.repetition_id]['ekf_with_aerial_update_path'] = os.path.join(
                self.repetition_dir, 'ekf_with_aerial_update_pose.csv')
        viz_utils.plot_2d_trajectory([ekf_df, ekf_with_aerial_update_df],
                                     labels=['EKF', 'EKF with aerial updates'],
                                     file_name=os.path.join(
                                         self.repetition_dir, '2d_trajectory'))

        # Delete bag file
        os.remove(output_bag_path)
 def task(self, **kwargs):
     ros_utils.start_master(use_sim_time=True)
     ros_utils.launch(package='localization', launch_file='jackal_scan_matcher.launch')
     output_bag_path = os.path.join(self.repetition_dir, '%s_output.bag' % self.name)
     ros_utils.start_recording_bag(output_bag_path, ['/scanmatcher_pose',])
     _, bag_duration = ros_utils.play_bag(self.data_sources, use_clock=True)
     time.sleep(bag_duration)
     ros_utils.stop_recording_bags()
     icp = ros_utils.bag_to_dataframe(output_bag_path, topic=r'/scanmatcher_pose', fields = ['x', 'y'])
     viz_utils.plot_2d_trajectory([icp], labels=['icp'], file_name=os.path.join(self.repetition_dir, 'icp'))
     self.results[self.repetition_id]['icp_error'] = np.linalg.norm(icp.iloc[-1] - icp.iloc[0])
예제 #3
0
    def task(self, **kwargs):

        launch_rviz = kwargs.get('launch_rviz', False)

        origin_map_image_path = self.data_sources['map_image_path']
        map_semantic_trunks = self.data_sources['map_semantic_trunks']
        scan_bag_path = self.data_sources['scan_bag_path']
        bounding_box_expand_ratio = self.params['bounding_box_expand_ratio']

        # Generate canopies and trunk map images
        map_image = cv2.imread(origin_map_image_path)
        canopies_map_image = maps_generation.generate_canopies_map(map_image)
        upper_left, lower_right = cv_utils.get_bounding_box(
            canopies_map_image,
            map_semantic_trunks.values(),
            expand_ratio=bounding_box_expand_ratio)
        canopies_map_image = canopies_map_image[upper_left[1]:lower_right[1],
                                                upper_left[0]:lower_right[0]]

        canopies_map_yaml_path, _ = ros_utils.save_image_to_map(
            canopies_map_image,
            resolution=self.params['resolution'],
            map_name='canopies_map',
            dir_name=self.repetition_dir)
        cv2.imwrite(os.path.join(self.repetition_dir, 'map_image.jpg'),
                    map_image)

        # Start ROS and RVIZ
        ros_utils.start_master()
        if launch_rviz:
            ros_utils.launch_rviz(
                os.path.join(config.root_dir_path,
                             'src/experiments_framework/framework/amcl.rviz'))

        # Launch localization stack for canopies and trunks
        self._launch_base_to_scan_static_tf(namespace='canopies')
        self._launch_map_server(canopies_map_yaml_path, namespace='canopies')
        self._launch_amcl(namespace='canopies')
        self._launch_icp(namespace='canopies')

        # Start input bag and wait
        _, bag_duration = ros_utils.play_bag(
            scan_bag_path)  # TODO: need to read from data_sources
        time.sleep(bag_duration)

        # Stop recording output bag
        ros_utils.stop_recording_bags()

        # Kill RVIZ
        if launch_rviz:
            ros_utils.kill_rviz()
    def task(self, **kwargs):

        # Start ROS and RVIZ
        ros_utils.start_master()

        # Launch localization stack for canopies and trunks
        self._launch_base_to_scan_static_tf(namespace='canopies')
        self._launch_base_to_scan_static_tf(namespace='trunks')
        self._launch_synthetic_scan_generator(
            self.canopies_localization_image_path,
            namespace='canopies',
            pickle_path=self.canopies_scans_pickle_path)
        self._launch_synthetic_scan_generator(
            self.trunks_localization_image_path,
            namespace='trunks',
            pickle_path=self.trunks_scans_pickle_path)
        self._launch_icp(namespace='canopies')
        self._launch_icp(namespace='trunks')

        # Start recording output bag
        output_bag_path = os.path.join(self.repetition_dir,
                                       '%s_output.bag' % self.name)
        ros_utils.start_recording_bag(output_bag_path, [
            '/ugv_pose', '/canopies/scanmatcher_pose',
            '/trunks/scanmatcher_pose'
        ])

        # Start input bag and wait
        _, bag_duration = ros_utils.play_bag(self.trajectory_bag_path)
        time.sleep(bag_duration)

        # Stop recording output bag
        ros_utils.stop_recording_bags()

        # Generate results dafaframes
        self._generate_results_dataframe(
            namespace='canopies',
            output_bag_path=output_bag_path,
            image_height=self.canopies_localization_image_height)
        self._generate_results_dataframe(
            namespace='trunks',
            output_bag_path=output_bag_path,
            image_height=self.trunks_localization_image_height)

        # Delete bag file
        os.remove(output_bag_path)
 def task(self, **kwargs):
     ros_utils.start_master(use_sim_time=True)
     ros_utils.launch(package='jackal_navigation',
                      launch_file='gmapping.launch')
     _, bag_duration = ros_utils.play_bag(self.data_sources, use_clock=True)
     start_time = datetime.datetime.now()
     while True:
         if (datetime.datetime.now() - start_time).seconds > (bag_duration +
                                                              1):
             break
         if kwargs.get('periodic_map_saving'):
             ros_utils.save_map(
                 map_name=datetime.datetime.now().strftime('map_%H_%M_%S'),
                 dir_name=self.repetition_dir)
         time.sleep(3)
     ros_utils.save_map(
         map_name=datetime.datetime.now().strftime('map_%H_%M_%S-final'),
         dir_name=self.repetition_dir)  # TODO: verify that this works
    def task(self, **kwargs):

        launch_rviz = kwargs.get('launch_rviz', False)

        map_image_path = self.data_sources['map_image_path']
        map_semantic_trunks = self.data_sources['map_semantic_trunks']
        scans_and_poses_pickle_path = self.data_sources[
            'scans_and_poses_pickle_path']
        odom_pickle_path = self.data_sources['odom_pickle_path']
        video_path = self.data_sources['video_path']
        bounding_box_expand_ratio = self.params['bounding_box_expand_ratio']
        map_resolution = self.params['map_resolution']

        # Generate canopies map image
        map_image = cv2.imread(map_image_path)
        cv2.imwrite(os.path.join(self.experiment_dir, 'image_for_map.jpg'),
                    map_image)
        canopies_map_image = maps_generation.generate_canopies_map(map_image)
        lower_boundaries = [
            [
                canopies_map_image.shape[0] - 600,
                min([trunk[0] for trunk in map_semantic_trunks.values()])
            ],
            [
                canopies_map_image.shape[0] - 600,
                max([trunk[0] for trunk in map_semantic_trunks.values()])
            ]
        ]
        # upper_left, lower_right = cv_utils.get_bounding_box(canopies_map_image, map_semantic_trunks.values() + lower_boundaries, expand_ratio=bounding_box_expand_ratio)
        upper_left = (700, 700)
        lower_right = (3200, 2700)
        canopies_map_image = canopies_map_image[upper_left[1]:lower_right[1],
                                                upper_left[0]:lower_right[0]]
        canopies_map_yaml_path, _ = ros_utils.save_image_to_map(
            canopies_map_image,
            resolution=map_resolution,
            map_name='canopies_map',
            dir_name=self.experiment_dir)

        # Start ROS and RVIZ
        ros_utils.start_master(use_sim_time=False)
        if launch_rviz:
            ros_utils.launch_rviz(
                os.path.join(
                    config.root_dir_path,
                    'src/experiments_framework/framework/amcl_video.rviz'))

        # Launch localization stack for canopies
        self._launch_base_to_scan_static_tf(namespace='canopies')
        self._launch_map_server(canopies_map_yaml_path, namespace='canopies')
        self._launch_amcl(namespace='canopies')
        self._initialize_global_localization(namespace='canopies')

        # Start playback
        ros_utils.launch(package='localization',
                         launch_file='scan_pose_odom_playback.launch',
                         argv={
                             'ns': 'canopies',
                             'scans_and_poses_pickle_path':
                             scans_and_poses_pickle_path,
                             'odom_pickle_path': odom_pickle_path,
                             'video_path': video_path
                         })

        time.sleep(500)  # TODO: remove

        # Stop recording output bag
        # ros_utils.stop_recording_bags()

        # Kill RVIZ
        if launch_rviz:
            ros_utils.kill_rviz()
    def task(self, **kwargs):

        launch_rviz = kwargs.get('launch_rviz', False)

        # Start ROS and RVIZ
        ros_utils.start_master()
        if launch_rviz:
            ros_utils.launch_rviz(
                os.path.join(config.root_dir_path,
                             'src/experiments_framework/framework/amcl.rviz'))

        # Launch localization stack for canopies and trunks
        self._launch_world_to_map_static_tf(namespace='canopies')
        self._launch_world_to_map_static_tf(namespace='trunks')
        self._launch_base_to_scan_static_tf(namespace='canopies')
        self._launch_base_to_scan_static_tf(namespace='trunks')
        self._launch_synthetic_scan_generator(
            self.canopies_localization_image_path,
            namespace='canopies',
            pickle_path=self.canopies_scans_pickle_path)
        self._launch_synthetic_scan_generator(
            self.trunks_localization_image_path,
            namespace='trunks',
            pickle_path=self.trunks_scans_pickle_path)
        self._launch_map_server(self.canopies_map_yaml_path,
                                namespace='canopies')
        self._launch_map_server(self.trunks_map_yaml_path, namespace='trunks')
        self._launch_amcl(namespace='canopies')
        self._launch_amcl(namespace='trunks')
        self._initialize_global_localization(namespace='canopies')
        self._initialize_global_localization(namespace='trunks')
        self._launch_synthetic_odometry(namespace='canopies')
        self._launch_synthetic_odometry(namespace='trunks')

        if launch_rviz:
            self._launch_contours_visualization()
            ros_utils.play_image_to_topic(
                image_path=self.data_sources['map_image_path'],
                topic='map_image',
                frame_id='map',
                fps=config.target_system_frequency)

        # Start recording output bag
        output_bag_path = os.path.join(self.repetition_dir,
                                       '%s_output.bag' % self.name)
        ros_utils.start_recording_bag(output_bag_path, [
            '/ugv_pose', '/canopies/amcl_pose', '/canopies/particlecloud',
            '/trunks/amcl_pose', '/trunks/particlecloud'
        ])

        # Start input bag and wait
        _, bag_duration = ros_utils.play_bag(self.trajectory_bag_path)
        time.sleep(bag_duration)

        # Stop recording output bag
        ros_utils.stop_recording_bags()

        # Kill RVIZ
        if launch_rviz:
            ros_utils.kill_rviz()

        # Generate results dafaframes
        self._generate_results_dataframe(
            namespace='canopies',
            output_bag_path=output_bag_path,
            image_height=self.canopies_localization_image_height)
        self._generate_results_dataframe(
            namespace='trunks',
            output_bag_path=output_bag_path,
            image_height=self.trunks_localization_image_height)

        # Delete bag file
        os.remove(output_bag_path)
import os
import time

from framework import ros_utils
from framework import config

if __name__ == '__main__':

    ros_utils.start_master(use_sim_time=False)
    ros_utils.launch_rviz(
        os.path.join(config.root_dir_path,
                     'src/experiments_framework/framework/amcl.rviz'))

    # Launch base_link to contours_scan_link static TF
    ros_utils.launch(package='localization',
                     launch_file='static_identity_tf.launch',
                     argv={
                         'frame_id': 'base_link',
                         'child_frame_id': 'contours_scan_link'
                     })

    # Launch map server
    ros_utils.launch(package='localization',
                     launch_file='map.launch',
                     argv={
                         'map_yaml_path':
                         r'/home/omer/Downloads/panorama_cropped_map.yaml'
                     })

    # Wait for map server to load
    ros_utils.wait_for_rosout_message(