ROS里程计的学习(odometry) (一)

什么是里程计?为什么需要里程计?

里程计是衡量我们从初始位姿到终点位姿的一个标准,通俗的说,我们要实现机器人的定位与导航,就需要知道机器人行进了多少距离,是往哪个方向行进的


这里我举个例子,gmapping导航建图包里建图需要里程计信息,且导航也需要。

hector建图呢有个缺点,如果雷达不够精确,那么建出来的图会导致定位不够精确,这是我们不期望的,所以要实现精确的定位与导航,需要加入里程计信息



ROS gmapping导航包,要求有2 个 输入,一个是激光数据,另一个就是里程计信息。

那么我们该如何获得里程计呢?

里程计又包含2 个方面的信息:

一、是位姿(位置和转角),即(x,y,θ)

二、是速度(前进速度和转向速度)。


那么问题来了,这些数据我们该如何获取呢????


参考:

http://blog.csdn.net/feixin620/article/details/78573893

http://www.ncnynl.com/archives/201703/1416.html

里程计信息的数据获取的途径,我从几篇文章里总结得到的结果是:

一、采用编码器电机来获取

二、采用ROS里的package : laser_scan_matcher  

首先讲一下laser_scan_matcher 这个包,这个包能根据/scan 数据发布2D位姿的数据, 我们是否可以根据2D位姿数据来转换成表示位置的下x,y, z 以及表示姿态的四元数。理论上是可以的。

速度的获取:还是根据2D位姿和时间变量,来计算前进速度和转向速度。2D位姿数据包含:float64 x, float64 y, float64 theta,根据dt 时间里dx,dy,dtheta, 就可以算出前进速度,和转向速度。如果2D位姿数据足够精准,基本都用不上陀螺仪校准。


编码器我们参考,并且引用了这位博主的文章:https://www.cnblogs.com/21207-iHome/p/8066135.html

在文章已经指出我们底层的框架图:


整个移动机器人的控制结构如下图所示,其中base_controller节点将订阅的cmd_vel信息通过串口或其它通信接口发送给下位机(嵌入式控制板)。下位机中根据机器人运动学公式进行解算,将机器人速度转换为每个轮子的速度,然后通过CAN总线(或其它总线接口)将每个轮子的转速发送给电机驱动板控制电机转动。电机驱动板对电机转速进行闭环控制(PID控制),并统计单位时间内接收到的编码器脉冲数,计算出轮子转速。


详细请跳转页面:

ROS里程计之STM32底层编码器(一)

http://blog.csdn.net/zhu751191958/article/details/79322140

     

ROS里程计之STM32底层编码器(二)

http://blog.csdn.net/zhu751191958/article/details/79322233
  • 50
    点赞
  • 464
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,以下是一个简单的IMU里程计ROS程序的示例: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Imu from nav_msgs.msg import Odometry from geometry_msgs.msg import Quaternion, Twist, Vector3 class ImuOdom: def __init__(self): rospy.init_node('imu_odom') self.imu_sub = rospy.Subscriber('/imu/data', Imu, self.imu_callback) self.odom_pub = rospy.Publisher('/odom', Odometry, queue_size=10) self.last_time = rospy.Time.now() self.x = 0 self.y = 0 self.th = 0 def imu_callback(self, msg): current_time = rospy.Time.now() dt = (current_time - self.last_time).to_sec() self.last_time = current_time # orientation quaternion to Euler angles q = msg.orientation roll, pitch, yaw = tf.transformations.euler_from_quaternion([q.x, q.y, q.z, q.w]) # angular velocity ang_vel = msg.angular_velocity.z # compute linear velocity linear_vel = Twist(Vector3(0, 0, 0), Vector3(0, 0, ang_vel)) # compute displacement self.x += linear_vel.linear.x * dt self.y += linear_vel.linear.y * dt self.th += ang_vel * dt # create odom message odom = Odometry() odom.header.stamp = current_time odom.header.frame_id = "odom" odom.child_frame_id = "base_link" # position odom.pose.pose.position.x = self.x odom.pose.pose.position.y = self.y odom.pose.pose.position.z = 0.0 # orientation odom.pose.pose.orientation = Quaternion(*tf.transformations.quaternion_from_euler(0, 0, self.th)) # velocity odom.twist.twist = linear_vel # publish odom message self.odom_pub.publish(odom) if __name__ == '__main__': try: imu_odom = ImuOdom() rospy.spin() except rospy.ROSInterruptException: pass ``` 这个程序订阅IMU数据,根据角速度计算线速度和位移,并发布里程计信息。你需要在程序中设置IMU话题的名称和发布里程计信息的话题名称以及坐标系的名称,以适应你的机器人系统。 注意,这只是一个示例程序,可能需要根据你的具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值