>

두 가지 기능을 가진 코드가 있습니다. 'send_thread'의 콜백 인 함수 'send_thread'및 함수 'receive_thread'. 내가하고 싶은 것은 'send_thread'를 실행하는 것입니다. 이는 'receive_thread'를 활성화하고 끝났 으면 다시 반복하십시오. 그렇게하기 위해 아래 코드를 생각해 냈습니다. 'send_thread'가 다시 호출되지만 더 이상 콜백을 활성화하지 않기 때문에 원하는 결과를 제공하지 않습니다. 도움을 주셔서 감사합니다.

함수는 receive_thread의 끝에서 호출되어 send_thread (rospy.sleep ())에서 대기하는 시간 동안 실행된다는 것을 알았습니다. 그래도 처음 시도한 후에는 콜백을 다시 활성화하지 않습니다.

import rospy
import pepper_2d_simulator
import threading
class TROS(object):
    def __init__(self):
        self.cmd_vel_pub = rospy.Publisher('cmd_vel',Twist)
        self.event = threading.Event()
    def send_thread(self):
        #send commmand
        self.event.set()
        sequence = [[1,0,0.05],[0,0,0],[0,0,0.1292]]
        for cmd in sequence:
            rospy.Rate(0.5).sleep()
            msg = Twist()
            msg.linear.x = cmd[0]
            msg.linear.y = cmd[1]
            msg.angular.z = cmd[2]
            t = rospy.get_rostime()
            self.cmd_vel_pub.publish(msg)
        self.event.clear()
        rospy.sleep(1)
    def receive_thread(self,msg):
        #if something is being send, listen to this
        if self.event.isSet():
            frame_id = msg.header.frame_id
            self.x_odom = msg.pose.pose.position.x
            self.y_odom = msg.pose.pose.position.y
            self.z_odom = msg.pose.pose.position.z
            self.pos_odom = [self.x_odom,self.y_odom,self.z_odom,1]
            self.ang_odom = msg.pose.pose.orientation.z
            self.time = msg.header.stamp.secs + msg.header.stamp.nsecs 
            #some transformations here to get self.trans...         
        else:
            #after self.event() is cleared, rename and run again
            self.x_odom = self.trans_br_x
            self.y_odom = self.trans_br_y
            self.ang_odom = self.rot_br_ang
            self.send_thread()
    def init_node(self):
        rospy.init_node('pepper_cmd_evaluator',anonymous = True)                   
        rospy.Subscriber('odom',Odometry,self.receive_thread)
if __name__ == '__main__':
    thinking = Thinking()
    thinking.init_node()
    thinking.send_thread()
The expected result is that I am able to loop this two function so that I call send_thread, this activates receive thread. Then send_thread stops, receive_thread stops and activates the send_thread again. I want to do this 10 times.


  • 답변 # 1

    이제 방법을 알아 냈습니다. 다른 사람이 비슷한 문제를 겪을 경우를 대비하여 솔루션을 게시 할 것입니다. 내가 생각해 낸 솔루션은 매우 간단합니다. self.flag 변수를 만들고 대안으로 send_thread 및 콜백에서 각각 True 및 False로 설정했습니다. 코드 :

    import rospy
    import pepper_2d_simulator
    import threading
    class TROS(object):
        def __init__(self):
            self.cmd_vel_pub = rospy.Publisher('cmd_vel',Twist)
            self.event = threading.Event()
            self.count = 0
            self.flag = True
        def send_thread(self):
            while self.count < 10:
                if self.flag:
                    self.count = self.count + 1
                    #send commmand
                    self.event.set()
                    sequence = [[1,0,0.05],[0,0,0],[0,0,0.1292]]
                    for cmd in sequence:
                        rospy.Rate(0.5).sleep()
                        msg = Twist()
                        msg.linear.x = cmd[0]
                        msg.linear.y = cmd[1]
                        msg.angular.z = cmd[2]
                        t = rospy.get_rostime()
                        self.cmd_vel_pub.publish(msg)
                    self.event.clear()
                    rospy.sleep(0.3)
                    self.flag = False
            rospy.signal_shutdown('Command finished')
        def receive_thread(self,msg):
            #if something is being send, listen to this
            if self.event.isSet():
                frame_id = msg.header.frame_id
                self.x_odom = msg.pose.pose.position.x
                self.y_odom = msg.pose.pose.position.y
                self.z_odom = msg.pose.pose.position.z
                self.pos_odom = [self.x_odom,self.y_odom,self.z_odom,1]
                self.ang_odom = msg.pose.pose.orientation.z
                self.time = msg.header.stamp.secs + msg.header.stamp.nsecs 
                #some transformations here to get self.trans...         
            else:
                #after self.event() is cleared, rename and run again
                self.x_odom = self.trans_br_x
                self.y_odom = self.trans_br_y
                self.ang_odom = self.rot_br_ang
                self.flag = True
        def init_node(self):
            rospy.init_node('pepper_cmd_evaluator',anonymous = True)                   
            rospy.Subscriber('odom',Odometry,self.receive_thread)
    if __name__ == '__main__':
        thinking = Thinking()
        thinking.init_node()
        thinking.send_thread()
    
    

관련 자료

  • 이전 duplicates - i-file powershell에서 이중 키 삭제
  • 다음 model - typo3 9 | extbase 확장 - 일부 값이 백엔드 tca 필드에서 데이터베이스로 저장되지 않습니다