コード例 #1
0
ファイル: selecao.py プロジェクト: kpiatan/cras
def talker():
    global d
    global yaw
    global gravidade_x
    global gravidade_y
    global gravidade_z
    global rms, vel_linear, theta

    fuzzy_autonomy.inicializaFuzzy()

    pubAutonomy = rospy.Publisher('autonomy_level', Int16, queue_size=10)
    rospy.Subscriber('air1/lrs36', LaserScan, laserCallback)
    rospy.Subscriber('air1/odon', Odometry, odonCallback)
    rospy.Subscriber('air1/twist', TwistStamped, twistCallback)
    rospy.Subscriber('joy', Joy, joyCallback)
    rospy.Subscriber('/myo/rms', Float32, rmsCallback)
    rospy.init_node('select_autonomy_node', anonymous=True)
    rate = rospy.Rate(10)  # 10hz

    while not rospy.is_shutdown():
        data = d
        if data != 0:
            erro_x = 0
            scan = ajusteTanque.laserScanToPointCloud(data)
            tanque = ajusteTanque.calcularPosicaoTanque(scan)

            if tanque != -1:
                sinal = ajusteTanque.determinarSinal(scan, tanque)
                erro_x = ajusteTanque.calcularCentroSolda(sinal)
                pubErro.publish(erro_x)
                erro_orientacao = 0
                #erroacumulado = erroacumulado + erro_x*erro_x
                #print("ErroAcumulado:")
                #print erroacumulado
                #elapsed_time = time.time() - start_time
                #print("Tempo:")
                #print elapsed_time
                #erro_por_tempo = math.sqrt(erroacumulado)/elapsed_time
                #print("metrica:")
                #print erro_por_tempo

                autonomy = fuzzy_autonomy.calculateAutonomy(
                    rms, vel_linear, theta, erro_x)
                pubAutonomy.publish(autonomy)

        rate.sleep()
コード例 #2
0
ファイル: main.py プロジェクト: kpiatan/autonomy_control
def callback(data):

    scan = ajusteTanque.laserScanToPointCloud(data)
    tanque = ajusteTanque.calcularPosicaoTanque(scan)

    filtrado = filtro.aplicarFiltro(scan)
    derivada = ajusteTanque.determinarDerivada(filtrado)

    sinal = ajusteTanque.determinarSinal(filtrado, tanque)

    #    pubPointCloud.publish(scan)
    #    pubTanque.publish(tanque)
    #    pubTanque.publish(derivada)
    pubPointCloud.publish(sinal)
    pubTanque.publish(ajusteTanque.testecalcularCentroSolda(sinal))
    #    pubFiltro.publish(filtrado)

    return
コード例 #3
0
ファイル: simulacao.py プロジェクト: kpiatan/cras
def listener():
    global d
    global yaw
    global gravidade_x
    global gravidade_y
    global gravidade_z
    global espera_joy
    global autonomy
    global erroacumulado
    global index_sequence

    # filtro.calcularFiltro()
    #filtro.criarGraficos()

    fuzzy.inicializaFuzzy()

    # In ROS, nodes are uniquely named. If two nodes with the same
    # name are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.

    pubFiltro = rospy.Publisher('filtro', PointCloud, queue_size=10)
    pubTanque = rospy.Publisher('tanque', PointCloud, queue_size=10)
    pubPointCloud = rospy.Publisher('pointLRS36', PointCloud, queue_size=10)
    pubVel = rospy.Publisher('air1/cmd_vel', Twist, queue_size=10)  #alterado
    #pubVel = rospy.Publisher('sim/cmd_vel',Twist,queue_size=10)
    pubErro = rospy.Publisher('air1/erro', Float32, queue_size=10)

    rospy.init_node('processamento_node', anonymous=True)

    rospy.Subscriber('air1/lrs36', LaserScan, laserCallback)
    rospy.Subscriber('air1/odon', Odometry, odonCallback)
    rospy.Subscriber('air1/twist', TwistStamped, twistCallback)
    rospy.Subscriber('joy', Joy, joyCallback)
    rospy.Subscriber('autonomy_level', Int16, autonomyCallback)

    rate = rospy.Rate(1000)
    orie_desejada = 0
    erro_x = 0

    # os.system("rqt_plot /air1/erro &")

    while not rospy.is_shutdown():
        data = d
        if data != 0:
            erro_x = 0
            scan = ajusteTanque.laserScanToPointCloud(data)
            tanque = ajusteTanque.calcularPosicaoTanque(scan)

            #filtrado = filtro.aplicarFiltro(scan)
            #derivada = ajusteTanque.determinarDerivada(scan)
            if tanque != -1:
                # print 'a'
                sinal = ajusteTanque.determinarSinal(scan, tanque)

                #    pubPointCloud.publish(scan)
                #    pubTanque.publish(tanque)
                #
                #pubPointCloud.publish(scan)
                #pubTanque.publish(ajusteTanque.testecalcularCentroSolda(scan))
                #    pubFiltro.publish(filtrado)
                erro_x = ajusteTanque.calcularCentroSolda(sinal)
                pubErro.publish(erro_x)
                erro_orientacao = 0
                erroacumulado = erroacumulado + erro_x * erro_x
                print("ErroAcumulado:")
                print erroacumulado
                elapsed_time = time.time() - start_time
                print("Tempo:")
                print elapsed_time
                erro_por_tempo = math.sqrt(erroacumulado) / elapsed_time
                print("metrica:")
                print erro_por_tempo

                vang, vlin = fuzzy.calculaVelocidade(erro_x, erro_orientacao,
                                                     3, gravidade_x,
                                                     gravidade_y, gravidade_z)
                msg = Twist()
                msg.linear.x = 0.3 * vlin
                msg.angular.z = vang
                if espera_joy == 1:
                    msg.linear.x = 0
                    msg.angular.z = 0
                # print erro_x, erro_orientacao, msg.linear.x, msg.angular.z
                pubVel.publish(msg)

            else:

                # print scan.points
                iMin, iMax, estado = ajusteTanque.calcularLimitesSolda(scan)
                #ladoRotacao = random.randint(0,1)
                if autonomy == 3:
                    lado[index_sequence] = lado_joy
                ladoRotacao = lado[index_sequence]
                print("estado:")
                print estado
                print("autonomylevel:")
                print autonomy

                if gravidade_z > 0.4:
                    gPos = 0
                    angulo = -yaw

                elif gravidade_z < -0.4:
                    gPos = 1
                    angulo = yaw
                else:
                    gPos = 2
                    angulo = math.atan2(-gravidade_y, gravidade_x)
                orie_desejada = angulo

                # cruzamento em t
                if estado == 0:
                    if autonomy == 3:
                        espera_joy = 1
                    if ladoRotacao == 2:
                        orie_desejada = orie_desejada - math.pi / 2  # direita
                    elif ladoRotacao == 1:
                        orie_desejada = orie_desejada + math.pi / 2  # esquerda

                # reto ou curva a direita
                if estado == 1:
                    if autonomy == 3:
                        espera_joy = 1
                    if ladoRotacao == 2:
                        orie_desejada = orie_desejada - math.pi / 2

                # reto ou curva a esquerda
                if estado == 2:
                    if autonomy == 3:
                        espera_joy = 1
                    if ladoRotacao == 1:
                        orie_desejada = orie_desejada + math.pi / 2

                index_sequence += 1
                if index_sequence >= len(lado):
                    index_sequence = 0

                if orie_desejada > math.pi:
                    orie_desejada = orie_desejada - 2 * math.pi
                elif orie_desejada < -1 * math.pi:
                    orie_desejada = orie_desejada + 2 * math.pi

                erro_orientacao = orie_desejada - angulo

                if erro_orientacao > math.pi:
                    erro_orientacao = erro_orientacao - 2 * math.pi
                elif erro_orientacao < -1 * math.pi:
                    erro_orientacao = erro_orientacao + 2 * math.pi

                vang = 0
                vlin = 0

                # print orie_desejada,yaw,erro_orientacao

                while math.fabs(erro_orientacao) > 0.05:
                    vang, vlin = fuzzy.calculaVelocidade(
                        erro_x, erro_orientacao, estado, gravidade_x,
                        gravidade_y, gravidade_z)
                    pubErro.publish(erro_x)
                    # print erro_orientacao
                    # pubErro.publish(math.fabs(erro_orientacao))
                    msg = Twist()
                    msg.angular.z = 1.25 * vang
                    msg.linear.x = 0.1285 * vlin
                    if espera_joy == 1:
                        msg.linear.x = 0
                        msg.angular.z = 0
                    # print erro_x, erro_orientacao, msg.linear.x, msg.angular.z
                    pubVel.publish(msg)
                    if gPos == 0:
                        erro_orientacao = orie_desejada - (-yaw)
                    elif gPos == 1:
                        erro_orientacao = orie_desejada - yaw
                    else:
                        erro_orientacao = orie_desejada - math.atan2(
                            -gravidade_y, gravidade_x)

                    if erro_orientacao > math.pi:
                        erro_orientacao = erro_orientacao - 2 * math.pi
                    elif erro_orientacao < -1 * math.pi:
                        erro_orientacao = erro_orientacao + 2 * math.pi
                    rate.sleep()
                scan = ajusteTanque.laserScanToPointCloud(d)
                iMax, iMin, tipoSolda = ajusteTanque.calcularLimitesSolda(scan)
                # pubPointCloud.publish(scan)
                # pubTanque.publish(ajusteTanque.testecalcularCentroSolda(scan))
                # print tipoSolda
                while tipoSolda != 3:
                    msg = Twist()
                    msg.linear.x = 0.01 * vlin
                    msg.angular.z = vang
                    if espera_joy == 1:
                        msg.linear.x = 0
                        msg.angular.z = 0
                    pubVel.publish(msg)
                    # print ajusteTanque.calcularLimitesSolda(scan)
                    scan = ajusteTanque.laserScanToPointCloud(d)
                    iMax, iMin, tipoSolda = ajusteTanque.calcularLimitesSolda(
                        scan)

                    rate.sleep()
                print estado

        rate.sleep()
コード例 #4
0
ファイル: selecao.py プロジェクト: kpiatan/autonomy_control
def talker():
    global d
    global yaw
    global gravidade_x
    global gravidade_y
    global gravidade_z
    global rms, vel_linear, theta
    global joyX, joyZ, autX, autZ
    global autonomy_level, autonomy_level_int, autonomy_level_int_ant
    global d_roll, d_pitch, d_yaw
    global iniciar_dados
    global vetor_dados
    global start_time
    global run_once
    global vetor_autonomy
    global transicoes

    fuzzy_autonomy.inicializaFuzzy()

    pubAutonomy = rospy.Publisher('autonomy_level', Float32, queue_size=10)
    pubVel = rospy.Publisher('air1/cmd_vel', Twist, queue_size=10)
    pubHap = rospy.Publisher('myo_raw/vibrate', UInt8, queue_size=10)
    rospy.Subscriber('joy/cmd_vel', Twist, joyvelCallback)
    rospy.Subscriber('sim/cmd_vel', Twist, simvelCallback)
    rospy.Subscriber('air1/lrs36', LaserScan, laserCallback)
    rospy.Subscriber('air1/odon', Odometry, odonCallback)
    rospy.Subscriber('air1/twist', TwistStamped, twistCallback)
    rospy.Subscriber('joy', Joy, joyCallback)
    rospy.Subscriber('joy/iniciar_dados', Int16, dadosCallback)
    rospy.Subscriber('/myo/rms', Float32, rmsCallback)
    rospy.Subscriber('/myo/delta_ang', Vector3, dangCallback)
    #rospy.Subscriber('/myo_raw/myo_gest', Vector3, gestCallback)
    rospy.init_node('select_autonomy_node', anonymous=True)
    rate = rospy.Rate(100)  # hz

    while not rospy.is_shutdown():
        data = d
        if data != 0:
            erro_x = 0
            scan = ajusteTanque.laserScanToPointCloud(data)
            tanque = ajusteTanque.calcularPosicaoTanque(scan)

            if tanque != -1:
                sinal = ajusteTanque.determinarSinal(scan, tanque)
                erro_x = ajusteTanque.calcularCentroSolda(sinal)
                erro_orientacao = 0

                if iniciar_dados == 1:
                    #print "Erro:", erro_x
                    vetor_dados.append(erro_x)
                    vetor_autonomy.append(autonomy_level)
                    if run_once == 0:
                        print "Iniciando medicao..."
                        start_time = time.time()
                        run_once = 1
                if iniciar_dados == 0 and run_once == 1:
                    rms_vetor = sqrt(mean(square(vetor_dados)))
                    elapsed_time = time.time() - start_time
                    #print "Erro RMS:", rms_vetor
                    print "Tempo transcorrido:", elapsed_time
                    print "Transicoes:", transicoes
                    #print "Vetor dos erros:", vetor_dados
                    print "VetorFiltrado = ", filter(lambda a: a != -1,
                                                     vetor_dados)
                    print '\n'
                    print "VetorAutonomia = ", vetor_autonomy
                    vetor_dados = []
                    run_once = 0

                autonomy_level = fuzzy_autonomy.calculateAutonomy(
                    rms, theta, erro_x, d_roll)
                #autonomy_level = 4 #forcando o nivel de autonomia estatico
                print "Nivel de autonomia:", autonomy_level
                pubAutonomy.publish(autonomy_level)

        msg_cmd_vel = Twist()

        if joyX != 0:
            joyX = joyX - d_pitch * 0.1  # um peso dos angulos do controle no valor da velocidade, pitch para cima positivo
        if joyZ != 0:
            joyZ = joyZ + d_roll * 0.1  # roll sentido horario positivo

        if autonomy_level <= 1:  # modo manual
            msg_cmd_vel.linear.x = joyX  # velocidade totalmente pelo controle
            msg_cmd_vel.angular.z = joyZ
        elif autonomy_level > 1 and autonomy_level <= 2:  # modo compartilhado
            msg_cmd_vel.linear.x = (autonomy_level - 1) * autX + (
                2 - autonomy_level
            ) * joyX  # uma parte da velocidade eh do controle e outra do modo autonomo
            msg_cmd_vel.angular.z = (autonomy_level -
                                     1) * autZ + (2 - autonomy_level) * joyZ
        elif autonomy_level > 2 and autonomy_level <= 3:  # modo supervisorio
            msg_cmd_vel.linear.x = joyX
            msg_cmd_vel.angular.z = autZ
        elif autonomy_level > 3:  # modo autonomo
            msg_cmd_vel.linear.x = autX
            msg_cmd_vel.angular.z = autZ

        #limitadores de velocidade
        if msg_cmd_vel.linear.x > 1.0:
            msg_cmd_vel.linear.x = 1.0
        if msg_cmd_vel.angular.z > 2.5:
            msg_cmd_vel.angular.z = 2.5

        pubVel.publish(msg_cmd_vel)

        autonomy_level_int_ant = autonomy_level_int

        # vibracao de acordo com o nivel de autonomia
        if autonomy_level <= 1:
            autonomy_level_int = 1
        elif autonomy_level > 1 and autonomy_level <= 2:
            autonomy_level_int = 2
        elif autonomy_level > 2 and autonomy_level <= 3:
            autonomy_level_int = 3
        elif autonomy_level > 3:
            autonomy_level_int = 4

        if autonomy_level_int != autonomy_level_int_ant:
            transicoes = transicoes + 1
        #    pubHap.publish(2)
        #elif autonomy_level_int < autonomy_level_int_ant:
        #    pubHap.publish(1)
        #else:
        #    pubHap.publish(0)

        rate.sleep()