ROS 마일 리 지
3950 단어 ROS
그렇다면 어떻게 마일 리 지 를 얻 을 수 있 을 까?
마일 리 지 는 두 가지 정 보 를 포함 하 는데 하 나 는 위치 (위치 와 코너) 이 고 다른 하 나 는 속도 (전진 속도 와 전향 속도) 이다.
속도 획득: 전진 속도 와 회전 속도
전진 속도: 좌우 바퀴 의 평균 속도, 이것 은 모터 의 인 코더 로 얻 은 것 이다.인 코 더 는 일정 시간 동안 돌아 가 는 라디안 수 를 기록 할 수 있 으 며, 이에 따라 모든 바퀴 의 속 도 를 계산 할 수 있다.
회전 속도: 좌우 바퀴 의 주어진 시간 내 호도 차 에 따라 계산 할 수 있다
참고 글: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 획득 에 대해 다른 방법 이 있 을까요?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Gazebo 시뮬레이터로 AR drone 2.0을 웹에서 조작농업이나 경비라든지 화상 인식할 수 있는 정보 수집 드론에 개인의 지속은 외로운 것입니다. 다음에 시뮬레이터 내의 드론을 웹과 GUI의 인터페이스에서 조작할 수 있도록 했습니다. 참고로 한 것은 이쪽 ※ROS의 ca...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.