def configure(self, rf):
        """Configure the module according to the configuration file

		Args: 
			rf (string): name of the configuration file of the module. 
				This file must be include in the folder pointing to the yarp
				contexts. By default: rf = 'default.ini'
		"""

        self.handlerPort.open("/ErgonomicAssessmentModule")
        self.attach(self.handlerPort)

        self.in_port_posture = yarp.BufferedPortBottle()
        self.in_port_posture.open('/ergo_pred/posture:i')

        path_config_posture = rf.find('posture_config').toString()
        self._posture = HumanPosture(path_config_posture)

        path_config_ergo = rf.find('ergo_config').toString()
        self._ergo_assessment = ErgoAssessment(path_config_ergo)

        self.list_out_port_ergo = dict()

        for ergo_score in self._ergo_assessment.get_list_score():
            self.list_out_port_ergo[ergo_score] = yarp.BufferedPortBottle()
            self.list_out_port_ergo[ergo_score].open("/ergo_pred/" +
                                                     ergo_score.lower() + ':o')

        return True
Exemplo n.º 2
0
def reduce_skeleton(data, num_frame, list_score):
    score_total = []
    human_posture = HumanPosture('config/mapping_joints.json')
    ergo_assessment = ErgoAssessment('config/reba_config.json')

    human_posture.update_posture(data)
    for score in list_score:
        score_total.append(ergo_assessment[score])
    return score_total
Exemplo n.º 3
0
    def prepare_data(self, metric, input_data):
        if metric == 'posture':
            human_pose = HumanPosture('config/mapping_joints.json')
            pool = mp.Pool(mp.cpu_count())
            result_objects = [
                pool.apply_async(human_pose.update_posture, args=(data, i))
                for i, data in enumerate(input_data)
            ]
            data_eval = np.asarray([r.get() for r in result_objects])

            pool.close()
            pool.join()

        elif metric == 'position':
            end_effectors = [
                'Right Hand', 'Left Hand', 'Right Foot', 'Left Foot'
            ]

            pool = mp.Pool(mp.cpu_count())

            result_objects = [
                pool.apply_async(skeleton.update_posture, args=(data, True, i))
                for i, data in enumerate(input_data)
            ]
            data_eval = [r.get() for r in result_objects]

            pool.close()
            pool.join()

        elif metric == 'ergo_score':
            self.ergo_assessment = ErgoAssessment('config/rula_config.json')
            self.list_ergo_score = self.ergo_assessment.get_list_score_name()
            self.list_ergo_score.sort()

            if (type(input_data) == torch.Tensor):

                for i, data in enumerate(input_data[0:1]):
                    data_eval = tools.compute_sequence_ergo(
                        data, i, self.list_ergo_score)

            elif (type(input_data) == np.ndarray):
                pool = mp.Pool(mp.cpu_count())

                result_objects = [
                    pool.apply_async(tools.compute_sequence_ergo,
                                     args=(data, i, self.list_ergo_score))
                    for i, data in enumerate(input_data)
                ]
                data_eval = [r.get() for r in result_objects]
                data_eval = np.asarray(data_eval)

                pool.close()
                pool.join()

        else:
            data_eval = np.copy(input_data)

        return data_eval
Exemplo n.º 4
0
def compute_sequence_ergo(ergo_assessment, data, num_frame, list_score,
                          config_path):
    score_total = []
    human_posture = HumanPosture(config_path + 'config/mapping_joints.json')

    if len(data) == human_posture.get_dim_reduce():
        human_posture.set_posture(data)
    elif len(data) == human_posture.get_dim_input():
        human_posture.update_posture(data)

    ergo_assessment.compute_ergo_scores(human_posture)
    for score in list_score:
        score_total.append(ergo_assessment[score])
    return score_total
	def __init__(self):
		self.app = pg.mkQApp()
		pg.setConfigOption('background', 'w')
		pg.setConfigOption('foreground', 'k')

		self.view = pg.PlotWidget()
		self.view.resize(800, 600)
		self.view.setWindowTitle('Ergonomic score in latent space')
		self.view.setAspectLocked(True)
		self.view.show()

		self.port = yarp.BufferedPortBottle()
		self.port.open('/plot_latentspace')

		metric = 'jointAngle'
		ergo_name = ['TABLE_REBA_C']

		size_latent = 2
		dx = 0.1

		loss = [[]]
		autoencoder = []

		all_score = []
		all_size = []
		type_data = []
		path_src = "/home/amalaise/Documents/These/code/ergo_prediction/ergonomic_assessment/src/"
		path = path_src + "save/AE/" + metric + "/" + str(size_latent) + '/'
		list_files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
		list_files.sort()
		file = list_files[0]

		with open(path + file, 'rb') as input:
			autoencoder = pickle.load(input)

		input_data = autoencoder.get_data_test()
		data_output, encoded_data, score = autoencoder.test_model(input_data)
		score = autoencoder.evaluate_model(input_data, data_output, metric)
		
		Max = np.max(encoded_data, axis = 0)
		Min = np.min(encoded_data, axis = 0)
		Mean = np.mean(encoded_data, axis = 0)

		# Compute ergo score
		ergo_assessment = ErgoAssessment(path_src + 'config/rula_config.json')
		list_ergo_score = ergo_assessment.get_list_score_name()
		list_ergo_score.sort()

		reduce_posture = HumanPosture(path_src + 'config/mapping_joints.json')
		posture = Skeleton('dhm66_ISB_Xsens.urdf')

		self.X = np.arange(0.0, 1.0+dx, dx)

		self.ergo_grid = np.zeros((len(self.X), len(self.X)))

		for i, data_x in enumerate(self.X):
			for j, data_y in enumerate(self.X):

				x = np.zeros((1,size_latent))
				x[0, 0] = data_x
				x[0, 1] = data_y

				decoded_data = autoencoder.decode_data(x)
				if metric == 'posture':
					whole_body = reduce_posture.reduce2complete(decoded_data[0])
					posture.update_posture(whole_body)
				else:
					posture.update_posture(decoded_data[0])

				ergo_score = tools.compute_sequence_ergo(decoded_data[0], 0, ergo_name, path_src)[0]
				if ergo_score == 1:
					ergo_score = 1
				elif 1 < ergo_score < 5:
					ergo_score = 2
				elif 4 < ergo_score < 6:
					ergo_score = 3
				else:
					ergo_score = 4

				self.ergo_grid[j,i] = ergo_score

		self.flag = 0

		self.plot_latent_space()
    # list_files.sort()
    # file = list_files[0]

    file = '/home/amalaise/Documents/These/code/ergo_prediction/ergonomic_assessment/src/save/AE/jointAngle/2/autoencoder_2_0.pkl'

    with open(file, 'rb') as input:
        autoencoder = pickle.load(input)

    # data_output, encoded_data, score = autoencoder.test_model(input_data)

    # Compute ergo score
    ergo_assessment = ErgoAssessment('config/' + config_ergo + '_config.json')
    list_ergo_score = ergo_assessment.get_list_score_name()
    list_ergo_score.sort()

    reduce_posture = HumanPosture('config/mapping_joints.json')
    posture = Skeleton('dhm66_ISB_Xsens.urdf')

    X = np.arange(0.0, 1.0 + dx, dx)

    path_src = "/home/amalaise/Documents/These/code/ergo_prediction/ergonomic_assessment/src/"

    pd_ergo_grid = pd.read_csv(config_ergo + '_grid.csv', index_col=False)
    ergo_grid = np.asarray(pd_ergo_grid)

    fig = plt.figure()
    # ax1 = Axes3D(fig)

    # ax1 = fig.add_subplot(122, projection='3d')
    # plt.imshow(ergo_grid, extent = [X[0] , X[-1]-X[0], X[-1]-X[0] , X[0]])
    # plt.imshow(ergo_grid)
Exemplo n.º 7
0
    def __init__(self, parent=None, config_ergo='rula', **kargs):
        pg.GraphicsWindow.__init__(self, **kargs)
        self.setParent(parent)
        timer = pg.QtCore.QTimer(self)
        timer.timeout.connect(self.update)
        timer.start(10)  # number of seconds (every 1000) for next update

        self.view = pg.PlotWidget(self)
        self.view.resize(350, 350)
        self.view.setWindowTitle('Ergonomic score in latent space')
        self.view.setAspectLocked(True)
        self.view.show()

        self.port = yarp.BufferedPortBottle()
        self.port.open('/plot_latentspace/' + config_ergo)
        yarp.Network.connect('/AE/latent:o', self.port.getName())

        metric = 'jointAngle'

        path_src = "/home/amalaise/Documents/These/code/ergo_prediction/ergonomic_assessment/src/"

        self.config_ergo = config_ergo

        if self.config_ergo == 'rula':
            ergo_name = ['RULA_SCORE']
            ergo_assessment = ErgoAssessment(path_src +
                                             'config/rula_config.json')
        else:
            ergo_name = ['TABLE_REBA_C']
            ergo_assessment = ErgoAssessment(path_src +
                                             'config/reba_config.json')

        size_latent = 2
        dx = 0.02

        loss = [[]]
        autoencoder = []

        all_score = []
        all_size = []
        type_data = []

        path = path_src + "save/AE/" + metric + "/" + str(size_latent) + '/'
        list_files = [
            f for f in os.listdir(path)
            if os.path.isfile(os.path.join(path, f))
        ]
        list_files.sort()
        file = list_files[0]

        with open(path + file, 'rb') as input:
            autoencoder = pickle.load(input)

        input_data = autoencoder.get_data_test()
        data_output, encoded_data, score = autoencoder.test_model(input_data)
        score = autoencoder.evaluate_model(input_data, data_output, metric)

        Max = np.max(encoded_data, axis=0)
        Min = np.min(encoded_data, axis=0)
        Mean = np.mean(encoded_data, axis=0)

        # Compute ergo score

        list_ergo_score = ergo_assessment.get_list_score_name()
        list_ergo_score.sort()

        reduce_posture = HumanPosture(path_src + 'config/mapping_joints.json')
        posture = Skeleton('dhm66_ISB_Xsens.urdf')

        self.X = np.arange(0.0, 1.0 + dx, dx)

        pd_ergo_grid = pd.read_csv(self.config_ergo + '_grid.csv',
                                   index_col=False)
        self.ergo_grid = np.asarray(pd_ergo_grid)

        ergo_color_grid = np.zeros(
            (len(self.ergo_grid), len(self.ergo_grid), 3))

        print(np.shape(ergo_color_grid))

        for i in range(len(self.ergo_grid)):
            for j in range(len(self.ergo_grid)):
                if config_ergo == 'reba':
                    if self.ergo_grid[i, j] == 1:
                        ergo_color_grid[i, j] = [0, 1, 0]
                    elif self.ergo_grid[i, j] == 2:
                        ergo_color_grid[i, j] = [0.3, 0.7, 0]
                    elif self.ergo_grid[i, j] == 3:
                        ergo_color_grid[i, j] = [0.5, 0.5, 0]
                    elif self.ergo_grid[i, j] == 4:
                        ergo_color_grid[i, j] = [0.7, 0.3, 0]
                else:
                    if self.ergo_grid[i, j] == 2:
                        ergo_color_grid[i, j] = [0, 1, 0]
                    elif self.ergo_grid[i, j] == 3:
                        ergo_color_grid[i, j] = [0.3, 0.7, 0]
                    elif self.ergo_grid[i, j] == 4:
                        ergo_color_grid[i, j] = [0.5, 0.5, 0]
                    elif self.ergo_grid[i, j] == 5:
                        ergo_color_grid[i, j] = [0.7, 0.3, 0]

        self.ergo_grid = ergo_color_grid

        # self.ergo_grid = np.zeros((len(self.X), len(self.X)))

        # for i, data_x in enumerate(self.X):
        #     for j, data_y in enumerate(self.X):

        #         x = np.zeros((1,size_latent))
        #         x[0, 0] = data_x
        #         x[0, 1] = data_y

        #         decoded_data = autoencoder.decode_data(x)
        #         if metric == 'posture':
        #             whole_body = reduce_posture.reduce2complete(decoded_data[0])
        #             posture.update_posture(whole_body)
        #         else:
        #             posture.update_posture(decoded_data[0])

        #         ergo_score = tools.compute_sequence_ergo(ergo_assessment, decoded_data[0], 0, ergo_name, path_src)[0]

        #         if self.config_ergo == 'reba':
        #             if ergo_score == 1:
        #                 ergo_score = 1
        #             elif 1 < ergo_score < 5:
        #                 ergo_score = 2
        #             elif 4 < ergo_score < 6:
        #                 ergo_score = 3
        #             else:
        #                 ergo_score = 4

        #         self.ergo_grid[j,i] = ergo_score

        self.flag = 0

        self.plot_latent_space()
    type_data = []

    path = "save/AE/" + metric + "/" + str(size_latent) + '/'
    list_files = [
        f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))
    ]
    list_files.sort()
    file = list_files[0]
    print(file)
    with open(path + file, 'rb') as input:
        autoencoder = pickle.load(input)

    input_data = autoencoder.get_data_test()
    data_output, encoded_data, score = autoencoder.test_model(input_data)

    reduce_posture = HumanPosture('config/mapping_joints.json')

    data_input_whole = np.zeros((len(input_data), 66))
    data_output_whole = np.zeros((len(input_data), 66))

    if metric == 'posture':
        for i, data in enumerate(data_output):
            data_input_whole[i] = reduce_posture.reduce2complete(input_data[i])
            data_output_whole[i] = reduce_posture.reduce2complete(data)

    else:
        data_input_whole = input_data
        data_output_whole = data_output

    posture = Skeleton('dhm66_ISB_Xsens.urdf')
class ErgonomicAssessmentModule(yarp.RFModule):
    """This module compute online the ergonomic scores of postures 
	related to worksheets from industry

	Example:
		>>> python online_assessment.py --from ergo_config.ini

	Attributes:
		in_port_posture (BufferedPortBottle): Input port. It is used to read
			the posture data.

		list_out_port_ergo (Dict{BufferedPortBottle}): List of output ports. 
			They send the ergonomic value of each measure included in the 
			configuration file.

	"""
    def __init__(self):
        yarp.RFModule.__init__(self)
        self.handlerPort = yarp.Port()

    def configure(self, rf):
        """Configure the module according to the configuration file

		Args: 
			rf (string): name of the configuration file of the module. 
				This file must be include in the folder pointing to the yarp
				contexts. By default: rf = 'default.ini'
		"""

        self.handlerPort.open("/ErgonomicAssessmentModule")
        self.attach(self.handlerPort)

        self.in_port_posture = yarp.BufferedPortBottle()
        self.in_port_posture.open('/ergo_pred/posture:i')

        path_config_posture = rf.find('posture_config').toString()
        self._posture = HumanPosture(path_config_posture)

        path_config_ergo = rf.find('ergo_config').toString()
        self._ergo_assessment = ErgoAssessment(path_config_ergo)

        self.list_out_port_ergo = dict()

        for ergo_score in self._ergo_assessment.get_list_score():
            self.list_out_port_ergo[ergo_score] = yarp.BufferedPortBottle()
            self.list_out_port_ergo[ergo_score].open("/ergo_pred/" +
                                                     ergo_score.lower() + ':o')

        return True

    def close(self):
        """Close all the ports used by the module
		"""
        self.in_port_posture.close()
        for ergo_score in self.list_out_port_ergo:
            self.list_out_port_ergo[ergo_score].close()
        self.handlerPort.close()
        return True

    def updateModule(self):
        """Read the data of posture and send the updated ergonomic scores
		"""
        b_in = self.in_port_posture.read(True)

        data = b_in.toString().split(' ')
        value = list(map(float, data))

        self._posture.update_posture(value)
        self._ergo_assessment.compute_ergo_scores(self._posture)

        for ergo_score in self.list_out_port_ergo:
            b_out = self.list_out_port_ergo[ergo_score].prepare()
            b_out.clear()
            b_out.addDouble(self._ergo_assessment[ergo_score])
            self.list_out_port_ergo[ergo_score].write()

        return True