首先我们看看Rossum的ROS系统流程图.
在进行slam的过程中,里程数据通过单片机上传给电脑端的ardros节点,经过tf全局变换后将单片机得到的当前坐标变换为全局坐标,然后发送至ROS master上,此时ROS master 同时接收来自kinect模拟激光测距仪的距离数据,这时就满足了slam运行的基本条件.
在真实运行过程中,slam的精度问题很大成分上取决于里程数据的精确性,同时计算过程中一些物理参数的测量的也十分重要,比如轮距,编码器分辨率,等等物理参数得适当调整,编码器的选取也是重要的,直接影响了你机器人的自身定位的准确性,Rossum所用的是16线的编码器,精度有限,推荐使用至少64线的编码器,这样机器人自身定位过程中的分辨率就可以很大的提高。
以下是里程数据的tf变换与发布的代码实现:
- # First, we'll publish the transform from frame odom to frame base_link over tf
- # Note that sendTransform requires that 'to' is passed in before 'from' while
- # the TransformListener' lookupTransform function expects 'from' first followed by 'to'.
- self._OdometryTransformBroadcaster.sendTransform(
- (x, y, 0),
- (quaternion.x, quaternion.y, quaternion.z, quaternion.w),
- rosNow,
- "base_link",
- "odom"
- )
- # next, we'll publish the odometry message over ROS
- odometry = Odometry()
- odometry.header.frame_id = "odom"
- odometry.header.stamp = rosNow
- odometry.pose.pose.position.x = x
- odometry.pose.pose.position.y = y
- odometry.pose.pose.position.z = 0
- odometry.pose.pose.orientation = quaternion
- odometry.child_frame_id = "base_link"
- odometry.twist.twist.linear.x = vx
- odometry.twist.twist.linear.y = 0
- odometry.twist.twist.angular.z = omega
- self._OdometryPublisher.publish(odometry)
- #rospy.loginfo(odometry)