ROS 마일 리 지

3950 단어 ROS
최근 ROS 의 네 비게 이 션 패 키 지 를 연구 하고 있 습 니 다. 그 안에 있 는 Gmapping 알고리즘 은 2 개의 입력 을 요구 합 니 다. 하 나 는 레이저 데이터 이 고 / scan topic 을 통 해 입력 하 며 다른 하 나 는 마일 리 지 정보 입 니 다.
그렇다면 어떻게 마일 리 지 를 얻 을 수 있 을 까?
마일 리 지 는 두 가지 정 보 를 포함 하 는데 하 나 는 위치 (위치 와 코너) 이 고 다른 하 나 는 속도 (전진 속도 와 전향 속도) 이다.
속도 획득: 전진 속도 와 회전 속도
전진 속도: 좌우 바퀴 의 평균 속도, 이것 은 모터 의 인 코더 로 얻 은 것 이다.인 코 더 는 일정 시간 동안 돌아 가 는 라디안 수 를 기록 할 수 있 으 며, 이에 따라 모든 바퀴 의 속 도 를 계산 할 수 있다.
회전 속도: 좌우 바퀴 의 주어진 시간 내 호도 차 에 따라 계산 할 수 있다
참고 글:http://blog.csdn.net/heyijia0327/article/details/47021861
위치 획득: 위치 와 자세
위치 획득: 위의 전진 속도 에 따라 위 치 를 추정 합 니 다.
자세 획득: 위의 회전 속도 에 따라 회전 각 을 추산 합 니 다.
그렇다면 실제 로봇 에 게 서 는 이 마일 리 지 정 보 를 어떻게 발표 할 것 인가?이 로 스arduino_bridge 를 예 로 들 어 설명 합 니 다.
적용: ROS  상위 기 + arduino 하위 기 + 소형 차 바퀴 (인 코더) 라 는 하드웨어 구조.
ros 에서arduino_bridge\ros_arduino_pythonodes 아래 에 'arduino' ROS node 가 구현 되 었 습 니 다.
이 노드 사용 self.myBaseController.poll()  call  base 까지controller. py 이 모듈.
다음 code 를 사용 하여 마일 리 지 를 발표 합 니 다 (Odometry)
        self.odomPub = rospy.Publisher('odom', Odometry, queue_size=5)
        self.odomBroadcaster = TransformBroadcaster()           
            try:
                left_enc, right_enc = self.arduino.get_encoder_counts()
            except:
                self.bad_encoder_count += 1
                rospy.logerr("Encoder exception count: " + str(self.bad_encoder_count))
                return
                            
            dt = now - self.then
            self.then = now
            dt = dt.to_sec()
            
            # Calculate odometry
            if self.enc_left == None:
                dright = 0
                dleft = 0
            else:
                dright = (right_enc - self.enc_right) / self.ticks_per_meter
                dleft = (left_enc - self.enc_left) / self.ticks_per_meter

            self.enc_right = right_enc
            self.enc_left = left_enc
            
            dxy_ave = (dright + dleft) / 2.0
            dth = (dright - dleft) / self.wheel_track
            vxy = dxy_ave / dt
            vth = dth / dt
                
            if (dxy_ave != 0):
                dx = cos(dth) * dxy_ave
                dy = -sin(dth) * dxy_ave
                self.x += (cos(self.th) * dx - sin(self.th) * dy)
                self.y += (sin(self.th) * dx + cos(self.th) * dy)
    
            if (dth != 0):
                self.th += dth 
    
            quaternion = Quaternion()
            quaternion.x = 0.0 
            quaternion.y = 0.0
            quaternion.z = sin(self.th / 2.0)
            quaternion.w = cos(self.th / 2.0)
    
            # Create the odometry transform frame broadcaster.
            self.odomBroadcaster.sendTransform(
                (self.x, self.y, 0), 
                (quaternion.x, quaternion.y, quaternion.z, quaternion.w),
                rospy.Time.now(),
                self.base_frame,  //     
                "odom"            //     
                )
    
            odom = Odometry()
            odom.header.frame_id = "odom"
            odom.child_frame_id = self.base_frame
            odom.header.stamp = now
            odom.pose.pose.position.x = self.x
            odom.pose.pose.position.y = self.y
            odom.pose.pose.position.z = 0
            odom.pose.pose.orientation = quaternion
            odom.twist.twist.linear.x = vxy
            odom.twist.twist.linear.y = 0
            odom.twist.twist.angular.z = vth

            self.odomPub.publish(odom)
            

여기 의문 이 하나 있 습 니 다: 왜 끊임없이 라디오 odom - > baseframe 사이 의 전환 은?이 유 는 물체 (하위 좌표계, 즉 로봇 자체 base link) 가 부모 좌표계 odom 의 위치 에 비해 끊임없이 변화 하기 때문에 이 자세 정 보 를 정시 에 tf 에 보 내야 합 니 다.
그럼 baselink (robot 자체) 는 odom (이 fixed 좌표계) 에 비해 비트 메 시 지 를 tf 에 게 알려 주 었 습 니 다. 왜 / odom 개 topic 에 Odemetry 메 시 지 를 보 내야 합 니까?
Odometry 획득 에 대해 다른 방법 이 있 을까요?

좋은 웹페이지 즐겨찾기