class HumanPerceptionFakerNode(object): def __init__(self): face_pose_str = rospy.get_param("~face_global_pose", "0 0 0 0 0 0") float_list = np.array([float(i) for i in face_pose_str.split()]) face_pose = Vector6D(x=float_list[0], y=float_list[1], z=float_list[2], rx=float_list[3], ry=float_list[4], rz=float_list[5]) self.fake_face = SceneNode(label="face", pose=face_pose) self.fake_face.shapes.append(Sphere(d=0.15)) self.fake_face.id = "face" self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.rgb_camera_info_topic = rospy.get_param("~rgb_camera_info_topic", "") self.tf_bridge = TfBridge() self.world_publisher = WorldPublisher("human_tracks") self.image_info_sub = rospy.Subscriber( self.rgb_camera_info_topic, CameraInfo, self.callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) def callback(self, msg): header = msg.header header.frame_id = self.global_frame_id self.world_publisher.publish([self.fake_face], [], header) self.tf_bridge.publish_tf_frames([self.fake_face], [], header) def run(self): while not rospy.is_shutdown(): rospy.spin()
def __init__(self): """ """ self.tf_bridge = TfBridge() self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.bridge = CvBridge() self.robot_camera = None self.camera_info = None self.events = [] self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) self.publish_tf = rospy.get_param("~publish_tf", False) self.publish_viz = rospy.get_param("~publish_viz", True) self.world_publisher = WorldPublisher("ar_tracks") self.marker_publisher = MarkerPublisher("ar_markers") self.rgb_camera_info_topic = rospy.get_param("~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo("[ar_perception] Subscribing to '/{}' topic...".format(self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber(self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback) self.ar_pose_marker_sub = rospy.Subscriber("ar_pose_marker", AlvarMarkers, self.observation_callback) self.ar_nodes = {} self.cad_models_search_path = rospy.get_param("~cad_models_search_path", "") self.ar_tag_config = rospy.get_param("~ar_tag_config", "") if self.ar_tag_config != "": with open(self.ar_tag_config, 'r') as config: self.ar_config = yaml.safe_load(config) for marker in self.ar_config: if marker["id"] not in self.ar_nodes: node = SceneNode() node.id = marker["id"] node.label = marker["label"] position = marker["position"] orientation = marker["orientation"] description = marker["description"] color = marker["color"] shape = Mesh("file://"+self.cad_models_search_path + "/" + marker["file"], x=position["x"], y=position["y"], z=position["z"], rx=orientation["x"], ry=orientation["y"], rz=orientation["z"]) shape.color[0] = color["r"] shape.color[1] = color["g"] shape.color[2] = color["b"] shape.color[3] = color["a"] node.shapes.append(shape) node.description = description node.state = SceneNodeState.CONFIRMED self.ar_nodes[marker["marker_id"]] = node
def __init__(self): """ """ self.tf_bridge = TfBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.robot_camera = None self.camera_info = None self.camera_frame_id = None self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.base_frame_id = rospy.get_param("~base_frame_id", "odom") self.use_ar_tags = rospy.get_param("~use_ar_tags", True) self.ar_tags_topic = rospy.get_param("ar_tags_topic", "ar_tracks") self.ar_tags_topic = "ar_tracks" self.use_ar_tags = True self.use_motion_capture = rospy.get_param("~use_motion_capture", False) self.motion_capture_topic = rospy.get_param("~motion_capture_topic", "motion_capture_tracks") self.use_motion_capture = True self.motion_capture_topic = "mocap_tracks" use_simulation_gui = rospy.get_param("~use_simulation_gui", True) simulation_config_filename = rospy.get_param( "~simulation_config_filename", "") cad_models_additional_search_path = rospy.get_param( "~cad_models_additional_search_path", "") static_entities_config_filename = rospy.get_param( "~static_entities_config_filename", "") robot_urdf_file_path = rospy.get_param("~robot_urdf_file_path", "") self.internal_simulator = InternalSimulator( True, simulation_config_filename, cad_models_additional_search_path, static_entities_config_filename, robot_urdf_file_path, self.global_frame_id, self.base_frame_id) self.physics_monitor = GraphicMonitor( internal_simulator=self.internal_simulator) if self.use_motion_capture is True: self.motion_capture_tracks = [] self.motion_capture_sub = rospy.Subscriber( self.motion_capture_topic, WorldStamped, self.motion_capture_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) if self.use_ar_tags is True: self.ar_tags_tracks = [] self.ar_tags_sub = rospy.Subscriber( self.ar_tags_topic, WorldStamped, self.ar_tags_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.ar_tags_sub = rospy.Subscriber("/mocap_tracks", rospy.AnyMsg, self.publish_view) self.pick_subsc = rospy.Subscriber("/pr2_tasks_node/pr2_facts", RobotAction, self.pick_callback)
def __init__(self): """ """ self.tf_bridge = TfBridge() self.listener = tf.TransformListener() # ontologiesManipulator =OntologiesManipulator() # self.onto = ontologiesManipulator.get("robot") self.global_frame_id = rospy.get_param("~global_frame_id") print "global fame id is : " + str(self.global_frame_id) self.ontologies_manip = OntologiesManipulator() self.ontologies_manip.add("robot") self.onto=self.ontologies_manip.get("robot") self.onto.close() self.global_frame_id = rospy.get_param("~global_frame_id", "map") self.publish_tf = rospy.get_param("~publish_tf", False) self.world_publisher_global = WorldPublisher("ar_tracks", self.global_frame_id) self.world_publisher_local = WorldPublisher("ar_tracks_local") # self.marker_publisher = MarkerPublisher("ar_perception_marker") # self.ar_pose_marker_sub = rospy.Subscriber("ar_pose_marker", AlvarMarkers, self.observation_callback) self.pose_marker_sub = message_filters.Subscriber("ar_pose_marker", AlvarMarkers) self.visible_marker_sub = message_filters.Subscriber("ar_pose_visible_marker",AlvarVisibleMarkers) self.synchronous_marker_sub = message_filters.TimeSynchronizer([self.visible_marker_sub,self.pose_marker_sub], 10) self.synchronous_marker_sub.registerCallback(self.visible_observation_callback) self.filtering_y_axis = rospy.get_param("~filtering_y_axis", FILTERING_Y) self.filtering_z_axis = rospy.get_param("~filtering_z_axis", FILTERING_Z) self.minimum_velocity = rospy.get_param("~minimum_velocity", MIN_VEL) self.minimum_angular_velocity = rospy.get_param("~minimum_angular_velocity", MIN_ANG) self.ar_nodes = {} self.ar_nodes_local={} self.blacklist_id = [] self.id_link = {} # Dictionarry for tag ID # self.joint_state_subscriber = rospy.Subscriber("/joint_states", JointState, self.joint_states_callback) self.last_head_pose = None self.last_time_head_pose = rospy.Time(0) print "filtering is " + str(self.filtering_y_axis) +"° x " +str(self.filtering_z_axis)+"°"
def __init__(self): face_pose_str = rospy.get_param("~face_global_pose", "0 0 0 0 0 0") float_list = np.array([float(i) for i in face_pose_str.split()]) face_pose = Vector6D(x=float_list[0], y=float_list[1], z=float_list[2], rx=float_list[3], ry=float_list[4], rz=float_list[5]) self.fake_face = SceneNode(label="face", pose=face_pose) self.fake_face.shapes.append(Sphere(d=0.15)) self.fake_face.id = "face" self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.rgb_camera_info_topic = rospy.get_param("~rgb_camera_info_topic", "") self.tf_bridge = TfBridge() self.world_publisher = WorldPublisher("human_tracks") self.image_info_sub = rospy.Subscriber( self.rgb_camera_info_topic, CameraInfo, self.callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE)
def __init__(self, use_gui, cad_models_additional_search_path, env_urdf_file_path, static_entities_config_filename, robot_urdf_file_path, global_frame_id, base_frame_id, position_tolerance=0.005): self.tf_bridge = TfBridge() self.entity_map = {} self.entity_id_map = {} self.reverse_entity_id_map = {} self.joint_id_map = {} self.reverse_joint_id_map = {} self.constraint_id_map = {} self.markers_id_map = {} self.position_tolerance = position_tolerance self.global_frame_id = global_frame_id self.base_frame_id = base_frame_id self.robot_urdf_file_path = robot_urdf_file_path self.use_gui = use_gui if self.use_gui is True: self.client_simulator_id = p.connect(p.GUI) else: self.client_simulator_id = p.connect(p.DIRECT) if cad_models_additional_search_path != "": p.setAdditionalSearchPath(cad_models_additional_search_path) self.static_nodes = [] if static_entities_config_filename != "": with open(static_entities_config_filename, 'r') as stream: static_entities = yaml.load(stream) for entity in static_entities: start_pose = Vector6D(x=entity["position"]["x"], y=entity["position"]["y"], z=entity["position"]["z"], rx=entity["orientation"]["x"], ry=entity["orientation"]["x"], rz=entity["orientation"]["z"]) success, static_node = self.load_urdf( entity["id"], entity["file"], start_pose, label=entity["label"], description=entity["description"], static=True) if success: self.static_nodes.append(static_node) p.setGravity(0, 0, -10) p.setRealTimeSimulation(0) self.robot_loaded = False self.joint_state_subscriber = rospy.Subscriber( "/joint_states", JointState, self.joint_states_callback, queue_size=1)
class InternalSimulator(object): def __init__(self, use_gui, cad_models_additional_search_path, env_urdf_file_path, static_entities_config_filename, robot_urdf_file_path, global_frame_id, base_frame_id, position_tolerance=0.005): self.tf_bridge = TfBridge() self.entity_map = {} self.entity_id_map = {} self.reverse_entity_id_map = {} self.joint_id_map = {} self.reverse_joint_id_map = {} self.constraint_id_map = {} self.markers_id_map = {} self.position_tolerance = position_tolerance self.global_frame_id = global_frame_id self.base_frame_id = base_frame_id self.robot_urdf_file_path = robot_urdf_file_path self.use_gui = use_gui if self.use_gui is True: self.client_simulator_id = p.connect(p.GUI) else: self.client_simulator_id = p.connect(p.DIRECT) if cad_models_additional_search_path != "": p.setAdditionalSearchPath(cad_models_additional_search_path) self.static_nodes = [] if static_entities_config_filename != "": with open(static_entities_config_filename, 'r') as stream: static_entities = yaml.load(stream) for entity in static_entities: start_pose = Vector6D(x=entity["position"]["x"], y=entity["position"]["y"], z=entity["position"]["z"], rx=entity["orientation"]["x"], ry=entity["orientation"]["x"], rz=entity["orientation"]["z"]) success, static_node = self.load_urdf( entity["id"], entity["file"], start_pose, label=entity["label"], description=entity["description"], static=True) if success: self.static_nodes.append(static_node) p.setGravity(0, 0, -10) p.setRealTimeSimulation(0) self.robot_loaded = False self.joint_state_subscriber = rospy.Subscriber( "/joint_states", JointState, self.joint_states_callback, queue_size=1) def load_urdf(self, id, filename, start_pose, remove_friction=False, static=False, label="thing", description=""): """ """ try: use_fixed_base = 1 if static is True else 0 base_link_sim_id = p.loadURDF( filename, start_pose.position().to_array(), start_pose.quaternion(), useFixedBase=use_fixed_base, flags=p.URDF_ENABLE_SLEEPING or p.URDF_ENABLE_CACHED_GRAPHICS_SHAPES) self.entity_id_map[id] = base_link_sim_id # Create a joint map to ease exploration self.reverse_entity_id_map[base_link_sim_id] = id self.joint_id_map[base_link_sim_id] = {} self.reverse_joint_id_map[base_link_sim_id] = {} for i in range(0, p.getNumJoints(base_link_sim_id)): info = p.getJointInfo(base_link_sim_id, i) self.joint_id_map[base_link_sim_id][info[1]] = info[0] self.reverse_joint_id_map[base_link_sim_id][info[0]] = info[1] # If file successfully loaded if base_link_sim_id < 0: raise RuntimeError("Invalid URDF") scene_node = SceneNode(pose=start_pose, is_static=True) scene_node.id = id scene_node.label = label scene_node.description = description sim_id = self.entity_id_map[id] visual_shapes = p.getVisualShapeData(sim_id) for shape in visual_shapes: link_id = shape[1] type = shape[2] dimensions = shape[3] mesh_file_path = shape[4] position = shape[5] orientation = shape[6] rgba_color = shape[7] if link_id != -1: link_state = p.getLinkState(sim_id, link_id) t_link = link_state[0] q_link = link_state[1] t_inertial = link_state[2] q_inertial = link_state[3] tf_world_link = np.dot(translation_matrix(t_link), quaternion_matrix(q_link)) tf_inertial_link = np.dot(translation_matrix(t_inertial), quaternion_matrix(q_inertial)) world_transform = np.dot(tf_world_link, np.linalg.inv(tf_inertial_link)) else: t_link, q_link = p.getBasePositionAndOrientation(sim_id) world_transform = np.dot(translation_matrix(t_link), quaternion_matrix(q_link)) if type == p.GEOM_SPHERE: primitive_shape = Sphere(dimensions[0] * 2.0) elif type == p.GEOM_BOX: primitive_shape = Box(dimensions[0], dimensions[1], dimensions[2]) elif type == p.GEOM_CYLINDER: primitive_shape = Cylinder(dimensions[1] * 2.0, dimensions[0]) elif type == p.GEOM_PLANE: primitive_shape = Box(dimensions[0], dimensions[1], 0.0001) elif type == p.GEOM_MESH: primitive_shape = Mesh("file://" + mesh_file_path, scale_x=dimensions[0], scale_y=dimensions[1], scale_z=dimensions[2]) else: raise NotImplementedError( "Shape capsule not supported at the moment") if link_id != -1: shape_transform = np.dot(translation_matrix(position), quaternion_matrix(orientation)) shape_transform = np.dot(world_transform, shape_transform) shape_transform = np.linalg.inv( np.dot(np.linalg.inv(shape_transform), scene_node.pose.transform())) position = translation_from_matrix(shape_transform) orientation = quaternion_from_matrix(shape_transform) primitive_shape.pose.pos.x = position[0] primitive_shape.pose.pos.y = position[1] primitive_shape.pose.pos.z = position[2] primitive_shape.pose.from_quaternion( orientation[0], orientation[1], orientation[2], orientation[3]) else: shape_transform = np.dot(translation_matrix(position), quaternion_matrix(orientation)) shape_transform = np.dot(world_transform, shape_transform) position = translation_from_matrix(shape_transform) orientation = quaternion_from_matrix(shape_transform) scene_node.pose.pos.x = position[0] scene_node.pose.pos.y = position[1] scene_node.pose.pos.z = position[2] scene_node.pose.from_quaternion(orientation[0], orientation[1], orientation[2], orientation[3]) if len(rgba_color) > 0: primitive_shape.color[0] = rgba_color[0] primitive_shape.color[1] = rgba_color[1] primitive_shape.color[2] = rgba_color[2] primitive_shape.color[3] = rgba_color[3] scene_node.shapes.append(primitive_shape) self.entity_map[id] = scene_node return True, scene_node rospy.loginfo( "[simulation] '{}' File successfully loaded".format(filename)) except Exception as e: rospy.logwarn("[simulation] Error loading URDF '{}': {}".format( filename, e)) return False, None def get_myself(self): node = self.get_entity("myself") node.type = SceneNodeType.MYSELF node.label = "robot" node.description = "I" return node def get_static_entities(self): return self.static_nodes def get_entity(self, id): if id not in self.entity_map: raise ValueError("Invalid id provided : '{}'".format(id)) return self.entity_map[id] def step_simulation(self): p.stepSimulation() def get_camera_view(self, camera_pose, camera, target_position=None, occlusion_threshold=0.01, rendering_ratio=1.0): visible_tracks = [] rot = quaternion_matrix(camera_pose.quaternion()) trans = translation_matrix(camera_pose.position().to_array().flatten()) if target_position is None: target = translation_matrix([0.0, 0.0, 1000.0]) target = translation_from_matrix(np.dot(np.dot(trans, rot), target)) else: target = target_position.position().to_array() view_matrix = p.computeViewMatrix(camera_pose.position().to_array(), target, [0, 0, 1]) width = camera.width height = camera.height projection_matrix = p.computeProjectionMatrixFOV( camera.fov, float(width) / height, camera.clipnear, camera.clipfar) rendered_width = int(width / rendering_ratio) rendered_height = int(height / rendering_ratio) width_ratio = width / rendered_width height_ratio = height / rendered_height if self.use_gui is True: camera_image = p.getCameraImage( rendered_width, rendered_height, viewMatrix=view_matrix, renderer=p.ER_BULLET_HARDWARE_OPENGL, projectionMatrix=projection_matrix) else: camera_image = p.getCameraImage(rendered_width, rendered_height, viewMatrix=view_matrix, renderer=p.ER_TINY_RENDERER, projectionMatrix=projection_matrix) rgb_image = cv2.resize(np.array(camera_image[2]), (width, height))[:, :, :3] depth_image = np.array(camera_image[3], np.float32).reshape( (rendered_height, rendered_width)) far = camera.clipfar near = camera.clipnear real_depth_image = far * near / (far - (far - near) * depth_image) mask_image = camera_image[4] unique, counts = np.unique(np.array(mask_image).flatten(), return_counts=True) for sim_id, count in zip(unique, counts): if sim_id > 0: cv_mask = np.array(mask_image.copy()) cv_mask[cv_mask != sim_id] = 0 cv_mask[cv_mask == sim_id] = 255 xmin, ymin, w, h = cv2.boundingRect(cv_mask.astype(np.uint8)) mask = cv_mask[ymin:ymin + h, xmin:xmin + w] visible_area = w * h + 1 screen_area = rendered_width * rendered_height + 1 if screen_area - visible_area == 0: confidence = 1.0 else: confidence = visible_area / float(screen_area - visible_area) #TODO compute occlusion score as a ratio between visible 2d bbox and projected 2d bbox areas if confidence > occlusion_threshold: depth = real_depth_image[int(ymin + h / 2.0)][int(xmin + w / 2.0)] xmin = int(xmin * width_ratio) ymin = int(ymin * height_ratio) w = int(w * width_ratio) h = int(h * height_ratio) id = self.reverse_entity_id_map[sim_id] scene_node = self.get_entity(id) det = Detection(int(xmin), int(ymin), int(xmin + w), int(ymin + h), id, confidence, depth=depth, mask=mask) track = SceneNode(detection=det) track.static = scene_node.static track.id = id track.mask = det.mask track.shapes = scene_node.shapes track.pose = scene_node.pose track.label = scene_node.label track.description = scene_node.description visible_tracks.append(track) return rgb_image, real_depth_image, visible_tracks # def update_entity(self, id, t, q): # if id not in self.entity_id_map: # raise ValueError("Entity <{}> is not loaded into the simulator".format(id)) # base_link_sim_id = self.entity_id_map[id] # t_current, q_current = p.getBasePositionAndOrientation(base_link_sim_id) # update_position = not np.allclose(np.array(t_current), t, atol=self.position_tolerance) # update_orientation = not np.allclose(np.array(q_current), q, atol=self.position_tolerance) # if update_position is True or update_orientation is True: # p.resetBasePositionAndOrientation(base_link_sim_id, t, q, physicsClientId=self.client_simulator_id) def joint_states_callback(self, joint_states_msg): success, pose = self.tf_bridge.get_pose_from_tf( self.global_frame_id, self.base_frame_id) if success is True: if self.robot_loaded is False: try: self.load_urdf("myself", self.robot_urdf_file_path, pose) self.robot_loaded = True except Exception as e: rospy.logwarn( "[simulation] Exception occured: {}".format(e)) # try: # self.simulator.update_entity("myself", t, q) # except Exception as e: # rospy.logwarn("[simulation] Exception occured: {}".format(e)) if self.robot_loaded is True: joint_indices = [] target_positions = [] base_link_sim_id = self.entity_id_map["myself"] for joint_state_index, joint_name in enumerate( joint_states_msg.name): joint_sim_index = self.joint_id_map[base_link_sim_id][ joint_name] info = p.getJointInfo(base_link_sim_id, joint_sim_index, physicsClientId=self.client_simulator_id) joint_name_sim = info[1] current_position = p.getJointState(base_link_sim_id, joint_sim_index)[0] assert (joint_name == joint_name_sim) joint_position = joint_states_msg.position[joint_state_index] if abs(joint_position - current_position) > self.position_tolerance: joint_indices.append(joint_sim_index) target_positions.append(joint_position) p.setJointMotorControlArray( base_link_sim_id, joint_indices, controlMode=p.POSITION_CONTROL, targetPositions=target_positions, physicsClientId=self.client_simulator_id)
def __init__(self): """ """ self.tf_bridge = TfBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.robot_camera = None self.camera_info = None self.camera_frame_id = None self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.base_frame_id = rospy.get_param("~base_frame_id", "odom") self.use_ar_tags = rospy.get_param("use_ar_tags", True) self.ar_tags_topic = rospy.get_param("ar_tags_topic", "ar_tracks") if self.use_ar_tags is True: self.ar_tags_tracks = [] self.ar_tags_sub = rospy.Subscriber(self.ar_tags_topic, WorldStamped, self.ar_tags_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.use_motion_capture = rospy.get_param("use_motion_capture", True) self.motion_capture_topic = rospy.get_param("motion_capture_topic", "motion_capture_tracks") if self.use_motion_capture is True: self.motion_capture_tracks = [] self.motion_capture_sub = rospy.Subscriber(self.motion_capture_topic, WorldStamped, self.motion_capture_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.use_object_perception = rospy.get_param("use_object_perception", True) self.object_perception_topic = rospy.get_param("object_perception_topic", "object_tracks") if self.use_object_perception is True: self.object_tracks = [] self.object_sub = rospy.Subscriber(self.object_perception_topic, WorldStamped, self.object_perception_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.use_human_perception = rospy.get_param("use_human_perception", True) self.human_perception_topic = rospy.get_param("human_perception_topic", "human_tracks") if self.use_human_perception is True: self.human_tracks = [] self.human_sub = rospy.Subscriber(self.human_perception_topic, WorldStamped, self.human_perception_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.publish_tf = rospy.get_param("~publish_tf", False) self.publish_viz = rospy.get_param("~publish_viz", True) self.publish_markers = rospy.get_param("~publish_markers", True) self.world_publisher = WorldPublisher("corrected_tracks") self.other_world_publisher = WorldPublisher("other_view_tracks") self.marker_publisher = MarkerPublisher("corrected_markers") self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) use_simulation_gui = rospy.get_param("~use_simulation_gui", True) simulation_config_filename = rospy.get_param("~simulation_config_filename", "") cad_models_additional_search_path = rospy.get_param("~cad_models_additional_search_path", "") static_entities_config_filename = rospy.get_param("~static_entities_config_filename", "") robot_urdf_file_path = rospy.get_param("~robot_urdf_file_path", "") self.internal_simulator = InternalSimulator(use_simulation_gui, simulation_config_filename, cad_models_additional_search_path, static_entities_config_filename, robot_urdf_file_path, self.global_frame_id, self.base_frame_id) self.other_view_publisher = ViewPublisher("other_view") self.robot_perspective_monitor = RobotPerspectiveMonitor(self.internal_simulator) self.use_physical_monitoring = rospy.get_param("use_physical_monitoring", True) if self.use_physical_monitoring is True: self.physics_monitor = PhysicsMonitor(self.internal_simulator) self.use_perspective_monitoring = rospy.get_param("use_perspective_monitoring", True) if self.use_perspective_monitoring is True: self.perspective_monitor = HumanPerspectiveMonitor(self.internal_simulator) rospy.Service("/uwds3/get_perspective", GetPerspective, self.handle_perspective_taking) self.perspective_facts = [] self.egocentric_facts = [] self.physics_facts = [] self.rgb_camera_info_topic = rospy.get_param("~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo("[internal_simulator] Subscribing to '/{}' topic...".format(self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber(self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback)
class InternalSimulatorNode(object): """ Standalone node for the internal simulator """ def __init__(self): """ """ self.tf_bridge = TfBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.robot_camera = None self.camera_info = None self.camera_frame_id = None self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.base_frame_id = rospy.get_param("~base_frame_id", "odom") self.use_ar_tags = rospy.get_param("use_ar_tags", True) self.ar_tags_topic = rospy.get_param("ar_tags_topic", "ar_tracks") if self.use_ar_tags is True: self.ar_tags_tracks = [] self.ar_tags_sub = rospy.Subscriber(self.ar_tags_topic, WorldStamped, self.ar_tags_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.use_motion_capture = rospy.get_param("use_motion_capture", True) self.motion_capture_topic = rospy.get_param("motion_capture_topic", "motion_capture_tracks") if self.use_motion_capture is True: self.motion_capture_tracks = [] self.motion_capture_sub = rospy.Subscriber(self.motion_capture_topic, WorldStamped, self.motion_capture_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.use_object_perception = rospy.get_param("use_object_perception", True) self.object_perception_topic = rospy.get_param("object_perception_topic", "object_tracks") if self.use_object_perception is True: self.object_tracks = [] self.object_sub = rospy.Subscriber(self.object_perception_topic, WorldStamped, self.object_perception_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.use_human_perception = rospy.get_param("use_human_perception", True) self.human_perception_topic = rospy.get_param("human_perception_topic", "human_tracks") if self.use_human_perception is True: self.human_tracks = [] self.human_sub = rospy.Subscriber(self.human_perception_topic, WorldStamped, self.human_perception_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.publish_tf = rospy.get_param("~publish_tf", False) self.publish_viz = rospy.get_param("~publish_viz", True) self.publish_markers = rospy.get_param("~publish_markers", True) self.world_publisher = WorldPublisher("corrected_tracks") self.other_world_publisher = WorldPublisher("other_view_tracks") self.marker_publisher = MarkerPublisher("corrected_markers") self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) use_simulation_gui = rospy.get_param("~use_simulation_gui", True) simulation_config_filename = rospy.get_param("~simulation_config_filename", "") cad_models_additional_search_path = rospy.get_param("~cad_models_additional_search_path", "") static_entities_config_filename = rospy.get_param("~static_entities_config_filename", "") robot_urdf_file_path = rospy.get_param("~robot_urdf_file_path", "") self.internal_simulator = InternalSimulator(use_simulation_gui, simulation_config_filename, cad_models_additional_search_path, static_entities_config_filename, robot_urdf_file_path, self.global_frame_id, self.base_frame_id) self.other_view_publisher = ViewPublisher("other_view") self.robot_perspective_monitor = RobotPerspectiveMonitor(self.internal_simulator) self.use_physical_monitoring = rospy.get_param("use_physical_monitoring", True) if self.use_physical_monitoring is True: self.physics_monitor = PhysicsMonitor(self.internal_simulator) self.use_perspective_monitoring = rospy.get_param("use_perspective_monitoring", True) if self.use_perspective_monitoring is True: self.perspective_monitor = HumanPerspectiveMonitor(self.internal_simulator) rospy.Service("/uwds3/get_perspective", GetPerspective, self.handle_perspective_taking) self.perspective_facts = [] self.egocentric_facts = [] self.physics_facts = [] self.rgb_camera_info_topic = rospy.get_param("~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo("[internal_simulator] Subscribing to '/{}' topic...".format(self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber(self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback) def handle_perspective_taking(self, req): camera = HumanCamera() view_pose = Vector6D().from_msg(req.point_of_view.pose) egocentric_relations = [] if req.use_target is True: target_point = Vector3D().from_msg(req.target.point) _, _, _, visible_nodes = self.internal_simulator.get_camera_view(view_pose, camera, target=target_point) else: _, _, _, visible_nodes = self.internal_simulator.get_camera_view(view_pose, camera) for node1 in visible_nodes: for node2 in visible_nodes: if node1 != node2: bbox1 = node1.bbox bbox2 = node2.bbox if is_right_of(bbox1, bbox2) is True: description = node1.description+"("+node1.id[:6]+") is right of "+node2.description+"("+node2.id[:6]+")" egocentric_relations.append(Fact(node1.id, description, predicate="right_of", object=node2.id)) if is_left_of(bbox1, bbox2) is True: description = node1.description+"("+node1.id[:6]+") is left of "+node2.description+"("+node2.id[:6]+")" egocentric_relations.append(Fact(node1.id, description, predicate="left_of", object=node2.id)) if is_behind(bbox1, bbox2) is True: description = node1.description+"("+node1.id[:6]+") is behind "+node2.description+"("+node2.id[:6]+")" egocentric_relations.append(Fact(node1.id, description, predicate="behind", object=node2.id)) return visible_nodes, egocentric_relations, True, "" def object_perception_callback(self, world_msg): object_tracks = [] for node in world_msg.world.scene: object_tracks.append(SceneNode().from_msg(node)) self.object_tracks = object_tracks def human_perception_callback(self, world_msg): human_tracks = [] for node in world_msg.world.scene: human_tracks.append(SceneNode().from_msg(node)) self.human_tracks = human_tracks def ar_tags_callback(self, world_msg): ar_tags_tracks = [] for node in world_msg.world.scene: ar_tags_tracks.append(SceneNode().from_msg(node)) self.ar_tags_tracks = ar_tags_tracks def motion_capture_callback(self, world_msg): motion_capture_tracks = [] for node in world_msg.world.scene: motion_capture_tracks.append(SceneNode().from_msg(node)) self.motion_capture_tracks = motion_capture_tracks def camera_info_callback(self, msg): """ """ if self.camera_info is None: rospy.loginfo("[perception] Camera info received !") self.camera_info = msg self.camera_frame_id = msg.header.frame_id self.robot_camera = Camera().from_msg(msg, clipnear=self.robot_camera_clipnear, clipfar=self.robot_camera_clipfar) if self.internal_simulator.is_robot_loaded() is True: success, view_pose = self.tf_bridge.get_pose_from_tf(self.global_frame_id, self.camera_frame_id) if success is not True: rospy.logwarn("[human_perception] The camera sensor is not localized in world space (frame '{}'), please check if the sensor frame is published in /tf".format(self.global_frame_id)) else: header = msg.header header.frame_id = self.global_frame_id self.frame_count %= self.n_frame object_tracks = self.ar_tags_tracks + self.object_tracks person_tracks = [f for f in self.human_tracks if f.label == "person"] corrected_object_tracks, self.physics_facts = self.physics_monitor.monitor(object_tracks, person_tracks, header.stamp) if self.use_perspective_monitoring is True: if self.frame_count == 3: monitoring_timer = cv2.getTickCount() perspective_facts = [] face_tracks = [f for f in self.human_tracks if f.label == "face"] person_tracks = [f for f in self.human_tracks if f.label == "person"] success, other_image, other_visible_tracks, perspective_facts = self.perspective_monitor.monitor(face_tracks, person_tracks, header.stamp) monitoring_fps = cv2.getTickFrequency() / (cv2.getTickCount()-monitoring_timer) if success: self.perspective_facts = [s for s in perspective_facts if s.predicate == "visible_by"] self.other_world_publisher.publish(other_visible_tracks, perspective_facts+self.physics_facts, header) self.other_view_publisher.publish(other_image, other_visible_tracks, header.stamp, fps=monitoring_fps) _, self.egocentric_facts = self.robot_perspective_monitor.monitor(object_tracks, person_tracks, self.robot_camera, view_pose, header.stamp) corrected_tracks = self.internal_simulator.get_static_entities() + self.human_tracks + corrected_object_tracks events = self.physics_facts + self.perspective_facts + self.egocentric_facts self.world_publisher.publish(corrected_tracks, events, header) if self.publish_tf is True: self.tf_bridge.publish_tf_frames(corrected_tracks, action_events , header) if self.publish_markers is True: self.marker_publisher.publish(corrected_tracks, header) self.frame_count += 1 def run(self): while not rospy.is_shutdown(): rospy.spin()
class ArPerceptionNode(object): def __init__(self): """ """ self.tf_bridge = TfBridge() self.listener = tf.TransformListener() # ontologiesManipulator =OntologiesManipulator() # self.onto = ontologiesManipulator.get("robot") self.global_frame_id = rospy.get_param("~global_frame_id") print "global fame id is : " + str(self.global_frame_id) self.ontologies_manip = OntologiesManipulator() self.ontologies_manip.add("robot") self.onto=self.ontologies_manip.get("robot") self.onto.close() self.global_frame_id = rospy.get_param("~global_frame_id", "map") self.publish_tf = rospy.get_param("~publish_tf", False) self.world_publisher_global = WorldPublisher("ar_tracks", self.global_frame_id) self.world_publisher_local = WorldPublisher("ar_tracks_local") # self.marker_publisher = MarkerPublisher("ar_perception_marker") # self.ar_pose_marker_sub = rospy.Subscriber("ar_pose_marker", AlvarMarkers, self.observation_callback) self.pose_marker_sub = message_filters.Subscriber("ar_pose_marker", AlvarMarkers) self.visible_marker_sub = message_filters.Subscriber("ar_pose_visible_marker",AlvarVisibleMarkers) self.synchronous_marker_sub = message_filters.TimeSynchronizer([self.visible_marker_sub,self.pose_marker_sub], 10) self.synchronous_marker_sub.registerCallback(self.visible_observation_callback) self.filtering_y_axis = rospy.get_param("~filtering_y_axis", FILTERING_Y) self.filtering_z_axis = rospy.get_param("~filtering_z_axis", FILTERING_Z) self.minimum_velocity = rospy.get_param("~minimum_velocity", MIN_VEL) self.minimum_angular_velocity = rospy.get_param("~minimum_angular_velocity", MIN_ANG) self.ar_nodes = {} self.ar_nodes_local={} self.blacklist_id = [] self.id_link = {} # Dictionarry for tag ID # self.joint_state_subscriber = rospy.Subscriber("/joint_states", JointState, self.joint_states_callback) self.last_head_pose = None self.last_time_head_pose = rospy.Time(0) print "filtering is " + str(self.filtering_y_axis) +"° x " +str(self.filtering_z_axis)+"°" # shp1 = Box(2,0.01,1, "shp1",x=0,y=0,z=0,r=1.,a=0,rz=np.radians(self.filtering_y_axis)) # shp2 = Box(2,0.01,1, "shp2",y=0,x=0,z=0,r=1.,a=0,rz=-np.radians(self.filtering_y_axis)) # shp3 = Box(2,1,0.01, "shp3",x=0,z=0,y=0,b=1.,a=0,ry=np.radians(self.filtering_z_axis)) # shp4 = Box(2,1,0.01, "shp4",x=0,y=0,z=0,b=1.,a=0,ry=-np.radians(self.filtering_z_axis)) # sn1 = SceneNode(pose = Vector6D(x=0,y=0,z=0,rx=0,ry=0,rz=0),label="no_fact") # sn2 = SceneNode(pose = Vector6D(x=0,y=0,z=0,rx=0,ry=0,rz=0),label="no_fact") # sn3 = SceneNode(pose = Vector6D(x=0,y=0,z=0,rx=0,ry=0,rz=0),label="no_fact") # sn4 = SceneNode(pose = Vector6D(x=0,y=0,z=0,rx=0,ry=0,rz=0),label="no_fact") # sn1.id="sn1" # sn2.id="sn2" # sn3.id="sn3" # sn4.id="sn4" # sn1.shapes=[shp1] # sn2.shapes=[shp2] # sn3.shapes=[shp3] # sn4.shapes=[shp4] # self.ar_nodes["sn1"]=sn1 # self.ar_nodes["sn2"]=sn2 # self.ar_nodes["sn3"]=sn3 # self.ar_nodes["sn4"]=sn4 def observation_callback(self, ar_marker_msgs): """ """ all_nodes = [] header = ar_marker_msgs.header for marker in ar_marker_msgs.markers: if not(marker.id in self.blacklist_id): if not (marker.id in self.id_link): self.new_node(marker) # print self.id_link # print self.id_link.keys() id = self.id_link[marker.id] pose = Vector6D().from_msg(marker.pose.pose) header = marker.header if self.ar_nodes[id].pose is None: self.ar_nodes[id].pose = Vector6DStable(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, rx=pose.rot.x, ry=pose.rot.y, rz=pose.rot.z, time=header.stamp) else: self.ar_nodes[id].pose.pos.update_no_kalmann(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, time=header.stamp) self.ar_nodes[id].pose.rot.update_no_kalmann(x=pose.rot.x, y=pose.rot.y, z=pose.rot.z, time=header.stamp) all_nodes.append(self.ar_nodes[id]) self.world_publisher.publish(self.ar_nodes.values(), [],header) # print("pub") if self.publish_tf is True: self.tf_bridge.publish_tf_frames(self.ar_nodes.values(), [], header) # print self.ar_nodes def movement_validity(self,header): # frame_id = header.frame_id # if frame_id[0]=='/': # frame_id = frame_id[1:] frame_id = "base_footprint" # "head_mount_kinect2_rgb_optical_frame" bool_,head_pose = self.tf_bridge.get_pose_from_tf("head_mount_kinect2_rgb_link",frame_id ,header.stamp) if not bool_: return False # self.ar_nodes["sn1"].pose= Vector6DStable(x=head_pose.pos.x, y=head_pose.pos.y, z=head_pose.pos.z, # rx=head_pose.rot.x, ry=head_pose.rot.y, rz=head_pose.rot.z, time=header.stamp) # self.ar_nodes["sn2"].pose= Vector6DStable(x=head_pose.pos.x, y=head_pose.pos.y, z=head_pose.pos.z, # rx=head_pose.rot.x, ry=head_pose.rot.y, rz=head_pose.rot.z, time=header.stamp) # self.ar_nodes["sn3"].pose= Vector6DStable(x=head_pose.pos.x, y=head_pose.pos.y, z=head_pose.pos.z, # rx=head_pose.rot.x, ry=head_pose.rot.y, rz=head_pose.rot.z, time=header.stamp) # self.ar_nodes["sn4"].pose= Vector6DStable(x=head_pose.pos.x, y=head_pose.pos.y, z=head_pose.pos.z, # rx=head_pose.rot.x, ry=head_pose.rot.y, rz=head_pose.rot.z, time=header.stamp) #init for the first time if self.last_head_pose == None: self.last_head_pose = head_pose vel_movement = 0 ang_movement = 0 delta= header.stamp-self.last_time_head_pose #If we are on a different time frame : (the head might have moved) if header.stamp != self.last_time_head_pose: vel_movement = np.linalg.norm( head_pose.pos.to_array() - self.last_head_pose.pos.to_array() )/delta.to_sec() ang_movement = np.linalg.norm( head_pose.rot.to_array() - self.last_head_pose.rot.to_array() )/delta.to_sec() self.last_time_head_pose = header.stamp self.last_head_pose = head_pose return ((vel_movement> self.minimum_velocity) or ang_movement> self.minimum_angular_velocity) def pos_validity_marker(self,marker): header = marker.header x = marker.pose.pose.position.x y = marker.pose.pose.position.y z = marker.pose.pose.position.z mpose=np.array([x,y,z]) return self.pos_validityv2(mpose,header) def pos_validityv2(self,mvect,header): mpose = Vector6DStable(mvect[0],mvect[1],mvect[2]) frame_id = header.frame_id if frame_id[0]=='/': frame_id = frame_id[1:] bool_,head_pose = self.tf_bridge.get_pose_from_tf("head_mount_kinect2_rgb_link" , frame_id,header.stamp) #init for the first time if self.last_head_pose == None and bool_: self.last_head_pose = head_pose mpose.from_transform(np.dot(head_pose.transform(),mpose.transform())) #mpose is now in the head frame if mpose.pos.x==0: return False xy_angle = np.degrees(np.arctan(mpose.pos.y/mpose.pos.x)) xz_angle = np.degrees(np.arctan(mpose.pos.z/mpose.pos.x)) return (abs(xy_angle)<self.filtering_y_axis and abs(xz_angle)<self.filtering_z_axis) def pos_validity(self,mpose,header): frame_id = header.frame_id if frame_id[0]=='/': frame_id = frame_id[1:] x = mpose[0] y = mpose[1] z = mpose[2] bool_,head_pose = self.tf_bridge.get_pose_from_tf(frame_id , "head_mount_kinect2_rgb_link", header.stamp) #init for the first time if self.last_head_pose == None: self.last_head_pose = head_pose direction = np.array([x-self.last_head_pose.pos.x,y-self.last_head_pose.pos.y,z-self.last_head_pose.pos.z]) rotation_matrix = euler_matrix(self.last_head_pose.rot.x, self.last_head_pose.rot.y, self.last_head_pose.rot.z) un_homogen = lambda x: np.array([i/(x[-1]*1.) for i in x[:-1]]) xaxis = un_homogen(np.dot(rotation_matrix,[1,0,0,1])) yaxis = un_homogen(np.dot(rotation_matrix,[0,1,0,1])) zaxis = un_homogen(np.dot(rotation_matrix,[0,0,1,1])) proj_on_y=np.dot(direction,yaxis)*yaxis/(np.linalg.norm(yaxis)) proj_on_z=np.dot(direction,zaxis)*zaxis/(np.linalg.norm(zaxis)) proj_on_xz_plane = direction-proj_on_y proj_on_xy_plane = direction-proj_on_z dot_x_xy =np.dot(proj_on_xy_plane,xaxis)/np.linalg.norm(xaxis)/np.linalg.norm(proj_on_xy_plane) dot_x_xz =np.dot(proj_on_xz_plane,xaxis)/np.linalg.norm(xaxis)/np.linalg.norm(proj_on_xz_plane) return (abs(dot_x_xy)>np.cos(np.radians(self.filtering_y_axis)) and abs(dot_x_xz)>np.cos(np.radians(self.filtering_z_axis))) def visible_observation_callback(self,visible_ar_marker_msgs, ar_marker_msgs): """ """ marker_blacklist=[] if self.movement_validity(ar_marker_msgs.header): self.observation(visible_ar_marker_msgs.header,[],[],is_mov=True) return for marker in visible_ar_marker_msgs.markers: # if marker.header.frame_id!='': if not self.pos_validity_marker(marker): if not marker.main_id in marker_blacklist: marker_blacklist.append(marker.main_id) self.observation( visible_ar_marker_msgs.header,ar_marker_msgs.markers,marker_blacklist,is_mov=False) def observation(self,header_, ar_marker_list,marker_blacklist,is_mov=False): """ """ header = header_ header_global = rospy.Header(header_.seq,header_.stamp,'/'+self.global_frame_id) all_nodes = [] for marker in ar_marker_list: # print marker.id if (not((marker.id in self.blacklist_id) or (marker.id in marker_blacklist))): if not (marker.id in self.id_link): self.new_node(marker) if (not((marker.id in self.blacklist_id) or (marker.id in marker_blacklist))): id = self.id_link[marker.id] pose = Vector6DStable().from_msg(marker.pose.pose) header = marker.header header_global.seq = header.seq header_global.stamp = header.stamp s,pose_map =self.tf_bridge.get_pose_from_tf(self.global_frame_id, header.frame_id[1:],header.stamp) s1,pose_map1 = self.tf_bridge.get_pose_from_tf( "base_footprint","map",header.stamp) print pose_map1 if self.ar_nodes_local[id].pose is None: self.ar_nodes_local[id].pose = Vector6DStable(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, rx=pose.rot.x, ry=pose.rot.y, rz=pose.rot.z, time=header.stamp) if s: if self.ar_nodes[id].pose is None: self.ar_nodes[id].pose = Vector6DStable(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, rx=pose.rot.x, ry=pose.rot.y, rz=pose.rot.z, time=header.stamp) else: # if id == "cube_GGTB": # print pose.pos.z self.ar_nodes[id].pose.pos.update_no_kalmann(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, time=header.stamp) self.ar_nodes[id].pose.rot.update_no_kalmann(x=pose.rot.x, y=pose.rot.y, z=pose.rot.z, time=header.stamp) self.ar_nodes_local[id].pose.pos.update_no_kalmann(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, time=header.stamp) self.ar_nodes_local[id].pose.rot.update_no_kalmann(x=pose.rot.x, y=pose.rot.y, z=pose.rot.z, time=header.stamp) # if id == "cube_GGTB": # print pose.pos.z self.ar_nodes[id].pose.from_transform(np.dot(pose_map.transform(),self.ar_nodes[id].pose.transform())) # if id=="box_C3": # print self.ar_nodes[id].pose.pos self.ar_nodes[id].last_update = header.stamp self.world_publisher_global.publish(self.ar_nodes.values(), [],header_global) self.world_publisher_local.publish(self.ar_nodes_local.values(),[],header) if self.publish_tf is True and len(header_global.frame_id)>0: self.tf_bridge.publish_tf_frames(self.ar_nodes.values(), [], header_global) # self.marker_publisher.publish(self.ar_nodes.values(),header_global) def new_node(self,marker): #Get real id of marker id from onto #get mesh of marker id from onto #get label from onto node = SceneNode() node_local=SceneNode() nodeid = self.onto.individuals.getFrom("hasArId","real#"+str(marker.id)) # print n odeid # print nodeid # nodeid = self.onto.individuals.getFrom("hasArId","real#230") # nodeid = "cube_GBTG_2" # print self.onto.individuals.getType("Cube") if nodeid == []: self.blacklist_id.append(marker.id) else: # print "hh" # print marker.id self.id_link[marker.id]=nodeid[0] path=self.onto.individuals.getOn(nodeid[0],"hasMesh")[0].split("#")[-1] node.label ="label" node_local.label = "label" print path shape = Mesh(path, x=0, y=0, z=0, rx=0, ry=0, rz=0) r,g,b=0,0,0 if "ox" in nodeid[0]: r,g,b=0.82,0.42, 0.12 if "cube" in nodeid[0]: r,g,b=0,0,1 if "GBTB" in nodeid[0]: r,g,b= 1,0,0 if "BGTG" in nodeid[0]: r,g,b=0,1,0 shape.color[0] = r shape.color[1] = g shape.color[2] = b shape.color[3] = 1 node.shapes.append(shape) node.id = nodeid[0] node_local.shapes.append(shape) node_local.id = nodeid[0] self.ar_nodes[nodeid[0]] = node self.ar_nodes_local[nodeid[0]] = node_local def run(self): while not rospy.is_shutdown(): rospy.spin()
def __init__(self): """ """ self.tf_bridge = TfBridge() self.cv_bridge = CvBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.global_frame_id = rospy.get_param("~global_frame_id", "odom") object_detector_weights_filename = rospy.get_param( "~object_detector_weights_filename", "") object_detector_model_filename = rospy.get_param( "~object_detector_model_filename", "") object_detector_config_filename = rospy.get_param( "~object_detector_config_filename", "") enable_cuda = rospy.get_param("~enable_cuda", True) use_mask_rcnn = rospy.get_param("~use_mask_rcnn", False) if use_mask_rcnn is True: self.object_detector = MaskRCNNDetector( object_detector_weights_filename, object_detector_model_filename, object_detector_config_filename, enable_cuda=enable_cuda) else: self.object_detector = SSDDetector( object_detector_weights_filename, object_detector_model_filename, object_detector_config_filename, enable_cuda=enable_cuda) self.n_init = rospy.get_param("~n_init", 1) self.max_iou_distance = rospy.get_param("~max_iou_distance", 0.98) self.max_appearance_distance = rospy.get_param( "~max_appearance_distance", 0.25) self.max_lost = rospy.get_param("~max_lost", 4) self.max_age = rospy.get_param("~max_age", 12) self.robot_camera = None self.camera_info = None self.table = None self.events = [] self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) self.object_tracker = MultiObjectTracker(iou_cost, appearance_cost, self.max_iou_distance, self.max_appearance_distance, self.n_init, self.max_lost, self.max_age, use_tracker=True) appearance_features_weights_filename = rospy.get_param( "~appearance_features_weights_filename", "") appearance_features_model_filename = rospy.get_param( "~appearance_features_model_filename", "") self.appearance_features_estimator = AppearanceFeaturesEstimator( appearance_features_weights_filename, appearance_features_model_filename) self.shape_estimator = ShapeEstimator() self.color_features_estimator = ColorFeaturesEstimator() self.object_pose_estimator = ObjectPoseEstimator() self.publish_tf = rospy.get_param("~publish_tf", True) self.publish_viz = rospy.get_param("~publish_viz", True) self.publish_markers = rospy.get_param("~publish_markers", True) self.world_publisher = WorldPublisher("object_tracks") self.view_publisher = ViewPublisher("object_perception") self.marker_publisher = MarkerPublisher("object_markers") self.use_depth = rospy.get_param("~use_depth", False) self.rgb_image_topic = rospy.get_param("~rgb_image_topic", "/camera/rgb/image_raw") self.rgb_camera_info_topic = rospy.get_param( "~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber( self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback) if self.use_depth is True: self.depth_image_topic = rospy.get_param( "~depth_image_topic", "/camera/depth/image_raw") self.depth_camera_info_topic = rospy.get_param( "~depth_camera_info_topic", "/camera/depth/camera_info") rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.rgb_image_topic)) self.rgb_image_sub = message_filters.Subscriber( self.rgb_image_topic, Image) rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.depth_image_topic)) self.depth_image_sub = message_filters.Subscriber( self.depth_image_topic, Image) self.sync = message_filters.ApproximateTimeSynchronizer( [self.rgb_image_sub, self.depth_image_sub], DEFAULT_SENSOR_QUEUE_SIZE, 0.1, allow_headerless=True) self.sync.registerCallback(self.observation_callback) else: rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.rgb_image_topic)) self.rgb_image_sub = rospy.Subscriber( self.rgb_image_topic, Image, self.observation_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE)
class ObjectPerceptionNode(object): def __init__(self): """ """ self.tf_bridge = TfBridge() self.cv_bridge = CvBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.global_frame_id = rospy.get_param("~global_frame_id", "odom") object_detector_weights_filename = rospy.get_param( "~object_detector_weights_filename", "") object_detector_model_filename = rospy.get_param( "~object_detector_model_filename", "") object_detector_config_filename = rospy.get_param( "~object_detector_config_filename", "") enable_cuda = rospy.get_param("~enable_cuda", True) use_mask_rcnn = rospy.get_param("~use_mask_rcnn", False) if use_mask_rcnn is True: self.object_detector = MaskRCNNDetector( object_detector_weights_filename, object_detector_model_filename, object_detector_config_filename, enable_cuda=enable_cuda) else: self.object_detector = SSDDetector( object_detector_weights_filename, object_detector_model_filename, object_detector_config_filename, enable_cuda=enable_cuda) self.n_init = rospy.get_param("~n_init", 1) self.max_iou_distance = rospy.get_param("~max_iou_distance", 0.98) self.max_appearance_distance = rospy.get_param( "~max_appearance_distance", 0.25) self.max_lost = rospy.get_param("~max_lost", 4) self.max_age = rospy.get_param("~max_age", 12) self.robot_camera = None self.camera_info = None self.table = None self.events = [] self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) self.object_tracker = MultiObjectTracker(iou_cost, appearance_cost, self.max_iou_distance, self.max_appearance_distance, self.n_init, self.max_lost, self.max_age, use_tracker=True) appearance_features_weights_filename = rospy.get_param( "~appearance_features_weights_filename", "") appearance_features_model_filename = rospy.get_param( "~appearance_features_model_filename", "") self.appearance_features_estimator = AppearanceFeaturesEstimator( appearance_features_weights_filename, appearance_features_model_filename) self.shape_estimator = ShapeEstimator() self.color_features_estimator = ColorFeaturesEstimator() self.object_pose_estimator = ObjectPoseEstimator() self.publish_tf = rospy.get_param("~publish_tf", True) self.publish_viz = rospy.get_param("~publish_viz", True) self.publish_markers = rospy.get_param("~publish_markers", True) self.world_publisher = WorldPublisher("object_tracks") self.view_publisher = ViewPublisher("object_perception") self.marker_publisher = MarkerPublisher("object_markers") self.use_depth = rospy.get_param("~use_depth", False) self.rgb_image_topic = rospy.get_param("~rgb_image_topic", "/camera/rgb/image_raw") self.rgb_camera_info_topic = rospy.get_param( "~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber( self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback) if self.use_depth is True: self.depth_image_topic = rospy.get_param( "~depth_image_topic", "/camera/depth/image_raw") self.depth_camera_info_topic = rospy.get_param( "~depth_camera_info_topic", "/camera/depth/camera_info") rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.rgb_image_topic)) self.rgb_image_sub = message_filters.Subscriber( self.rgb_image_topic, Image) rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.depth_image_topic)) self.depth_image_sub = message_filters.Subscriber( self.depth_image_topic, Image) self.sync = message_filters.ApproximateTimeSynchronizer( [self.rgb_image_sub, self.depth_image_sub], DEFAULT_SENSOR_QUEUE_SIZE, 0.1, allow_headerless=True) self.sync.registerCallback(self.observation_callback) else: rospy.loginfo( "[object_perception] Subscribing to '/{}' topic...".format( self.rgb_image_topic)) self.rgb_image_sub = rospy.Subscriber( self.rgb_image_topic, Image, self.observation_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) def camera_info_callback(self, msg): """ """ if self.camera_info is None: rospy.loginfo("[perception] Camera info received !") self.camera_info = msg self.camera_frame_id = msg.header.frame_id self.robot_camera = Camera().from_msg( msg, clipnear=self.robot_camera_clipnear, clipfar=self.robot_camera_clipfar) def observation_callback(self, bgr_image_msg, depth_image_msg=None): """ """ if self.robot_camera is not None: header = bgr_image_msg.header header.frame_id = self.global_frame_id bgr_image = self.cv_bridge.imgmsg_to_cv2(bgr_image_msg, "bgr8") rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB) if depth_image_msg is not None: depth_image = self.cv_bridge.imgmsg_to_cv2(depth_image_msg) else: depth_image = None _, self.image_height, self.image_width = bgr_image.shape success, view_pose = self.tf_bridge.get_pose_from_tf( self.global_frame_id, self.camera_frame_id) if success is not True: rospy.logwarn( "[object_perception] The camera sensor is not localized in world space (frame '{}'), please check if the sensor frame is published in /tf" .format(self.global_frame_id)) else: self.frame_count %= self.n_frame all_nodes, events = self.perception_pipeline( view_pose, rgb_image, depth_image=depth_image, time=header.stamp) self.world_publisher.publish(all_nodes, events, header) if self.publish_markers is True: self.marker_publisher.publish(all_nodes, header) if self.publish_tf is True: self.tf_bridge.publish_tf_frames(all_nodes, events, header) self.frame_count += 1 def perception_pipeline(self, view_pose, rgb_image, depth_image=None, time=None): ###################################################### # Detection ###################################################### pipeline_timer = cv2.getTickCount() detection_timer = cv2.getTickCount() detections = [] if self.frame_count == 0: detections = self.object_detector.detect(rgb_image, depth_image=depth_image) else: detections = [] detection_fps = cv2.getTickFrequency() / (cv2.getTickCount() - detection_timer) #################################################################### # Features estimation #################################################################### features_timer = cv2.getTickCount() if self.frame_count == 0: self.appearance_features_estimator.estimate(rgb_image, detections) self.color_features_estimator.estimate(rgb_image, detections) features_fps = cv2.getTickFrequency() / (cv2.getTickCount() - features_timer) ###################################################### # Tracking ###################################################### tracking_timer = cv2.getTickCount() if self.frame_count == 0: self.object_tracks = self.object_tracker.update( rgb_image, detections, depth_image=depth_image, time=time) else: self.object_tracks = self.object_tracker.update( rgb_image, [], depth_image=depth_image, time=time) tracks = self.object_tracks tracking_fps = cv2.getTickFrequency() / (cv2.getTickCount() - tracking_timer) ######################################################## # Pose & Shape estimation ######################################################## pose_timer = cv2.getTickCount() self.object_pose_estimator.estimate(tracks, view_pose, self.robot_camera) self.shape_estimator.estimate(rgb_image, tracks, self.robot_camera) pose_fps = cv2.getTickFrequency() / (cv2.getTickCount() - pose_timer) pipeline_fps = cv2.getTickFrequency() / (cv2.getTickCount() - pipeline_timer) ######################################################## # Visualization ######################################################## if self.publish_viz is True: self.view_publisher.publish(rgb_image, tracks, time, overlay_image=None, fps=pipeline_fps, view_pose=view_pose, camera=self.robot_camera) all_nodes = tracks return all_nodes, self.events def run(self): while not rospy.is_shutdown(): rospy.spin()
class InternalSimulatorNode(object): """ Standalone node for the internal simulator """ def __init__(self): """ """ self.tf_bridge = TfBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.robot_camera = None self.camera_info = None self.camera_frame_id = None self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.base_frame_id = rospy.get_param("~base_frame_id", "odom") self.use_ar_tags = rospy.get_param("~use_ar_tags", True) self.ar_tags_topic = rospy.get_param("ar_tags_topic", "ar_tracks") self.ar_tags_topic = "ar_tracks" self.use_ar_tags = True self.use_motion_capture = rospy.get_param("~use_motion_capture", False) self.motion_capture_topic = rospy.get_param("~motion_capture_topic", "motion_capture_tracks") self.use_motion_capture = True self.motion_capture_topic = "mocap_tracks" use_simulation_gui = rospy.get_param("~use_simulation_gui", True) simulation_config_filename = rospy.get_param( "~simulation_config_filename", "") cad_models_additional_search_path = rospy.get_param( "~cad_models_additional_search_path", "") static_entities_config_filename = rospy.get_param( "~static_entities_config_filename", "") robot_urdf_file_path = rospy.get_param("~robot_urdf_file_path", "") self.internal_simulator = InternalSimulator( True, simulation_config_filename, cad_models_additional_search_path, static_entities_config_filename, robot_urdf_file_path, self.global_frame_id, self.base_frame_id) self.physics_monitor = GraphicMonitor( internal_simulator=self.internal_simulator) if self.use_motion_capture is True: self.motion_capture_tracks = [] self.motion_capture_sub = rospy.Subscriber( self.motion_capture_topic, WorldStamped, self.motion_capture_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) if self.use_ar_tags is True: self.ar_tags_tracks = [] self.ar_tags_sub = rospy.Subscriber( self.ar_tags_topic, WorldStamped, self.ar_tags_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE) self.ar_tags_sub = rospy.Subscriber("/mocap_tracks", rospy.AnyMsg, self.publish_view) self.pick_subsc = rospy.Subscriber("/pr2_tasks_node/pr2_facts", RobotAction, self.pick_callback) def publish_view(self, tf): self.physics_monitor.publish_view(tf) def pick_callback(self, msg): self.physics_monitor.pick_callback(msg) def ar_tags_callback(self, world_msg): ar_tags_tracks = [] for node in world_msg.world.scene: # print self.internal_simulator.entity_id_map ar_tags_tracks.append(SceneNode().from_msg(node)) self.ar_tags_tracks = ar_tags_tracks #world_msg.header.frame_id[1:] if world_msg.header.frame_id[1:] != '': s, pose = self.tf_bridge.get_pose_from_tf( self.global_frame_id, world_msg.header.frame_id[1:]) else: pose = None self.physics_monitor.monitor(ar_tags_tracks, pose, world_msg.header) # self.physics_monitor.monitor([], pose, world_msg.header) def motion_capture_callback(self, world_msg): motion_capture_tracks = [] for node in world_msg.world.scene: motion_capture_tracks.append(SceneNode().from_msg(node)) self.physics_monitor.mocap(motion_capture_tracks, world_msg.header) def run(self): while not rospy.is_shutdown(): rospy.spin()
class ArPerceptionNode(object): def __init__(self): """ """ self.tf_bridge = TfBridge() self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.bridge = CvBridge() self.robot_camera = None self.camera_info = None self.events = [] self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) self.publish_tf = rospy.get_param("~publish_tf", False) self.publish_viz = rospy.get_param("~publish_viz", True) self.world_publisher = WorldPublisher("ar_tracks") self.marker_publisher = MarkerPublisher("ar_markers") self.rgb_camera_info_topic = rospy.get_param("~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo("[ar_perception] Subscribing to '/{}' topic...".format(self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber(self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback) self.ar_pose_marker_sub = rospy.Subscriber("ar_pose_marker", AlvarMarkers, self.observation_callback) self.ar_nodes = {} self.cad_models_search_path = rospy.get_param("~cad_models_search_path", "") self.ar_tag_config = rospy.get_param("~ar_tag_config", "") if self.ar_tag_config != "": with open(self.ar_tag_config, 'r') as config: self.ar_config = yaml.safe_load(config) for marker in self.ar_config: if marker["id"] not in self.ar_nodes: node = SceneNode() node.id = marker["id"] node.label = marker["label"] position = marker["position"] orientation = marker["orientation"] description = marker["description"] color = marker["color"] shape = Mesh("file://"+self.cad_models_search_path + "/" + marker["file"], x=position["x"], y=position["y"], z=position["z"], rx=orientation["x"], ry=orientation["y"], rz=orientation["z"]) shape.color[0] = color["r"] shape.color[1] = color["g"] shape.color[2] = color["b"] shape.color[3] = color["a"] node.shapes.append(shape) node.description = description node.state = SceneNodeState.CONFIRMED self.ar_nodes[marker["marker_id"]] = node def camera_info_callback(self, msg): """ """ if self.camera_info is None: rospy.loginfo("[ar_perception] Camera info received !") self.camera_info = msg self.camera_frame_id = msg.header.frame_id self.robot_camera = Camera().from_msg(msg, clipnear=self.robot_camera_clipnear, clipfar=self.robot_camera_clipfar) def observation_callback(self, ar_marker_msgs): """ """ if self.robot_camera is not None: header = ar_marker_msgs.header header.stamp = rospy.Time() header.frame_id = self.global_frame_id success, view_pose = self.tf_bridge.get_pose_from_tf(self.global_frame_id, self.camera_frame_id) if success is not True: rospy.logwarn("[ar_perception] The camera sensor is not localized in world space (frame '{}'), please check if the sensor frame is published in /tf".format(self.global_frame_id)) else: all_nodes = [] for marker in ar_marker_msgs.markers: if marker.id in self.ar_nodes: pose = Vector6D().from_msg(marker.pose.pose) if self.ar_nodes[marker.id].pose is None: self.ar_nodes[marker.id].pose = Vector6DStable(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, rx=pose.rot.x, ry=pose.rot.y, rz=pose.rot.z, time=header.stamp) else: self.ar_nodes[marker.id].pose.pos.update(x=pose.pos.x, y=pose.pos.y, z=pose.pos.z, time=header.stamp) self.ar_nodes[marker.id].pose.rot.update(x=pose.rot.x, y=pose.rot.y, z=pose.rot.z, time=header.stamp) all_nodes.append(self.ar_nodes[marker.id]) self.world_publisher.publish(all_nodes, [], header) if self.publish_viz is True: self.marker_publisher.publish(all_nodes, header) if self.publish_tf is True: self.tf_bridge.publish_tf_frames(all_nodes, [], header) def run(self): while not rospy.is_shutdown(): rospy.spin()
def __init__(self): """ """ self.tf_bridge = TfBridge() self.n_frame = rospy.get_param("~n_frame", 4) self.frame_count = 0 self.global_frame_id = rospy.get_param("~global_frame_id", "odom") self.color = rospy.get_param("~color", "red") self.debug_topics = rospy.get_param("~debug_topics", True) self.color_detector = ColorDetector(debug_topics=self.debug_topics, color=self.color) self.n_init = rospy.get_param("~n_init", 1) self.max_iou_distance = rospy.get_param("~max_iou_distance", 0.98) self.max_lost = rospy.get_param("~max_lost", 4) self.max_age = rospy.get_param("~max_age", 300) self.bridge = CvBridge() self.robot_camera = None self.camera_info = None self.table = None self.events = [] self.robot_camera_clipnear = rospy.get_param("~robot_camera_clipnear", 0.1) self.robot_camera_clipfar = rospy.get_param("~robot_camera_clipfar", 25.0) self.object_tracker = MultiObjectTracker(iou_cost, centroid_cost, self.max_iou_distance, None, self.n_init, self.max_lost, self.max_age, use_tracker=True) self.shape_estimator = ShapeEstimator() self.object_pose_estimator = ObjectPoseEstimator() self.publish_tf = rospy.get_param("~publish_tf", False) self.publish_viz = rospy.get_param("~publish_viz", True) self.world_publisher = WorldPublisher("color_object_tracks") self.view_publisher = ViewPublisher("color_object_perception") self.marker_publisher = MarkerPublisher("color_object_markers") self.use_depth = rospy.get_param("~use_depth", False) self.rgb_image_topic = rospy.get_param("~rgb_image_topic", "/camera/rgb/image_raw") self.rgb_camera_info_topic = rospy.get_param( "~rgb_camera_info_topic", "/camera/rgb/camera_info") rospy.loginfo( "[color_perception] Subscribing to '/{}' topic...".format( self.rgb_camera_info_topic)) self.camera_info_subscriber = rospy.Subscriber( self.rgb_camera_info_topic, CameraInfo, self.camera_info_callback) if self.use_depth is True: self.depth_image_topic = rospy.get_param( "~depth_image_topic", "/camera/depth/image_raw") self.depth_camera_info_topic = rospy.get_param( "~depth_camera_info_topic", "/camera/depth/camera_info") rospy.loginfo( "[color_perception] Subscribing to '/{}' topic...".format( self.rgb_image_topic)) self.rgb_image_sub = message_filters.Subscriber( self.rgb_image_topic, Image) rospy.loginfo( "[color_perception] Subscribing to '/{}' topic...".format( self.depth_image_topic)) self.depth_image_sub = message_filters.Subscriber( self.depth_image_topic, Image) self.sync = message_filters.ApproximateTimeSynchronizer( [self.rgb_image_sub, self.depth_image_sub], DEFAULT_SENSOR_QUEUE_SIZE, 0.1, allow_headerless=True) self.sync.registerCallback(self.observation_callback) else: rospy.loginfo( "[color_perception] Subscribing to '/{}' topic...".format( self.rgb_image_topic)) self.rgb_image_sub = rospy.Subscriber( self.rgb_image_topic, Image, self.observation_callback, queue_size=DEFAULT_SENSOR_QUEUE_SIZE)