首先我们看看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)