使用ROS开源代码和激光雷达进行小车的定位导航——里程计信息的计算

本文详细介绍了使用gmapping算法进行地图构建的过程,重点探讨了里程计信息的获取与计算方法,包括不同通信方式的选择及其优缺点,里程计计算的具体步骤,以及如何在ROS中发布里程计信息。

写在前面:

    之前挖了个坑,大致讲了一下导航定位的思路但是设计到实际的东西还是有很多细节问题需要注意。最近把一个项目做完了,正好有时间可以总结一些技术要点和大家分享一下。

     我采用的是gmapping算法来对环境进行地图的构建,这就需要里程计的信息。首先是gmapping根据我的实际效果在场地不是很大的情况下还是能够较好的完成建图的过程的,下面可以给出一张效果图。

gmapping效果图

由于gmapping采用粒子滤波的方法,和amcl一样都是对里程计信息要求比较高的,在我实践过程中里程计信息几乎决定了建图的好坏,下面我会详细的介绍一下里程计信息的获取与计算。

一、通信方式

      为什么我要开始就提通信呢?因为我的亲生经历就在通信上花费了大把大把的时间,所以一开始选取一种好的通信方式既能提高里程计发布的频率提高精度又能避免走很多弯路。下面这部分会涉及到一些底层单片机的东西。

  首先我采用的是stm32F407作为底层的驱动控制,然后使用一个w5500模块将spi转换成以太网和电脑上位机通信。(至于w5500是什么可以上某宝搜一下)通信需要考虑到一下几个因素,第一就是速度。在我看来普通的串口通信很难满足gmapping对里程计信息的需求,实际情况测试下延时比较长效果很差,而且容易数据错误。以下是我推荐的通信方式

       1.USB通信,采用USB的HID模式进行通信,不管是速率还是稳定性都能较好的满足,我也曾采用过这种方式。

          缺点:stm32的usb通信较难,很难在短时间内掌握usb通信,网上资料少。

      2.以太网通信,以太网具有10M或100M的高速传输数据的能力,完全满足要求。

         缺点:stm32的以太网代码量较大,可能会导致代码运行速度变慢或者接触不良时卡在中断导致车子疯掉。

     3.w5500模块spi转以太网通信,优点就是只需要关注spi通信,代码少不用理会网络通信的一些问题。

         缺点:每次和电脑连接都要复位一次,不是很方便(电路设计上可以解决这个问题,需要自己设计)

最后,我采用了第三种方式。至于每种方式的代码和资料,不管是下位机还是上位机的程序,需要的可以留言。

     还有一点值得注意,就是我们里程计的信息需要的是浮点型的才能更加精确,但是我们怎么传输浮点型的数据呢?

那就是采用联合结构体的方式。下面给出一个博客,我就不细讲了。

https://blog.youkuaiyun.com/huhuang/article/details/51585009

二、里程计计算

 里程计的计算主要就是下面这个问题:
 给你四个或者两个电机的编码器的数值,计算出小车目前的位置和速度。

(下面部分内容来自深蓝学院的激光slam课程 不是打广告,尊重版权)

首先介绍四个麦克纳姆轮的小车的运动模型,这和我做的是一样的。

可以参考这个博客

麦轮底盘的运动学计算

 

下面给出我的计算过程,手写的有点丑凑合着看吧。

计算过程

实际上,ROS大多采用的两轮的差速控制并不是我们这种麦轮结构。

差速原理

对于两轮差分的运动学计算,可以参考这个博客

https://blog.youkuaiyun.com/u012926144/article/details/80787175

至于其他的比如全向轮的底盘的解算大多大同小异。

现在我们确实是获得了小车速度信息,但是位置信息还没有得到。有人说积分一下不就好了,但是实际上没有那么简单,因为目前的小车的速度是在小车坐标系下的,并不是世界坐标系下面的。

所以我们需要将速度转换到世界坐标系下然后再进行积分,求得小车目前的位置。

坐标转换

将我们利用运动学模型计算出来的值乘上一个旋转矩阵,然后计算出世界坐标系下的位姿,连成一条轨迹。

三、里程计信息的发布

好了,终于到了最后一步。

现在我们成功的计算出了里程计的信息,那怎么发布到ROS上面给slam算法提供数据呢?

其实只需要关注这两个信息的发布便可

ros::Publisher odom_pub = n.advertise<nav_msgs::Odometry>("odom", 600);
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 600);

一个是发布里程计信息,然后另外一个发布机器人和地图的位置的TF转换关系。

好了,今天就到这了有什么问题或者要什么资料都可以留言哦!!!!

代码链接附上,17年做的了,可能有bug,勿喷。

https://github.com/linyicheng1/ICRA-electronics-design-competition 

### ACML在ROS小车激光雷达导航中的使用教程 在ROS中,AMCL(Adaptive Monte Carlo Localization)是一种用于2D移动机器人定位的概率系统。它利用粒子滤波器根据已知地图激光雷达数据估计机器人位置[^2]。以下是关于如何在ROS小车激光雷达导航中使用AMCL进行定位的详细说明。 #### 1. 环境准备 确保安装了必要的ROS包,包括`amcl``gmapping`(如果需要构建地图)。可以通过以下命令安装: ```bash sudo apt-get install ros-<ros_distro>-navigation ros-<ros_distro>-map-server ros-<ros_distro>-amcl ``` 将`<ros_distro>`替换为当前使用ROS版本,例如`noetic`或`melodic`。 #### 2. 地图加载 AMCL需要一个预先构建的地图来执行定位。可以使用`map_server`加载地图文件: ```xml <launch> <node name="map_server" pkg="map_server" type="map_server" args="$(find your_package)/maps/your_map.yaml"/> </launch> ``` 确保`your_map.yaml`文件正确配置了地图路径分辨率等参数[^1]。 #### 3. 配置AMCL节点 在启动文件中配置AMCL节点以匹配小车的具体硬件传感器设置。以下是一个典型的AMCL配置示例: ```xml <launch> <node pkg="amcl" type="amcl" name="amcl"> <param name="use_map_topic" value="true"/> <param name="initial_pose_x" value="0.0"/> <param name="initial_pose_y" value="0.0"/> <param name="initial_pose_a" value="0.0"/> <param name="min_particles" value="500"/> <param name="max_particles" value="2000"/> <param name="odom_frame_id" value="odom"/> <param name="base_frame_id" value="base_link"/> <param name="global_frame_id" value="map"/> <param name="update_min_d" value="0.2"/> <param name="update_min_a" value="0.5"/> <param name="resample_interval" value="1"/> <param name="transform_tolerance" value="0.5"/> <param name="recovery_alpha_slow" value="0.001"/> <param name="recovery_alpha_fast" value="0.1"/> </node> </launch> ``` 上述配置定义了AMCL的核心参数,如粒子数量、初始位姿、坐标系名称以及更新条件等[^2]。 #### 4. 激光雷达数据发布 确保激光雷达数据通过`/scan`话题发布。通常,激光雷达驱动程序会自动完成此操作。检查数据是否正常发布: ```bash rostopic echo /scan ``` #### 5. 启动导航堆栈 结合AMCL与ROS导航堆栈,启动完整的导航系统。以下是一个简化的启动文件示例: ```xml <launch> <!-- Map Server --> <node name="map_server" pkg="map_server" type="map_server" args="$(find your_package)/maps/your_map.yaml"/> <!-- AMCL --> <include file="$(find your_package)/launch/amcl.launch"/> <!-- Move Base --> <node pkg="move_base" type="move_base" name="move_base" output="screen"> <rosparam file="$(find your_package)/config/costmap_common_params.yaml" command="load" ns="global_costmap"/> <rosparam file="$(find your_package)/config/costmap_common_params.yaml" command="load" ns="local_costmap"/> <rosparam file="$(find your_package)/config/global_costmap_params.yaml" command="load"/> <rosparam file="$(find your_package)/config/local_costmap_params.yaml" command="load"/> <rosparam file="$(find your_package)/config/base_local_planner_params.yaml" command="load"/> </node> </launch> ``` 此文件集成了地图服务器、AMCL`move_base`节点,提供完整的导航功能[^1]。 #### 6. 初始化与调试 启动系统后,在RViz中可视化机器人的位置估计激光雷达数据。通过设置初始位姿(2D Pose Estimate工具),帮助AMCL快速收敛到正确的位置。观察粒子分布机器人轨迹,确保定位准确。 --- ```python # 示例代码:发送目标点以测试导航 import rospy from geometry_msgs.msg import PoseStamped def send_goal(x, y, theta): goal = PoseStamped() goal.header.frame_id = "map" goal.pose.position.x = x goal.pose.position.y = y goal.pose.orientation.w = theta pub.publish(goal) if __name__ == "__main__": rospy.init_node("goal_sender") pub = rospy.Publisher("/move_base_simple/goal", PoseStamped, queue_size=1) send_goal(1.0, 1.0, 0.0) # 发送目标点 (1, 1) 朝向 0 弧度 ``` --- ### 注意事项 - 确保小车里程计数据(`/odom`话题)激光雷达数据(`/scan`话题)质量较高,否则会影响AMCL的性能。 - 如果地图不精确或环境变化较大,AMCL可能会出现漂移或丢失定位的情况[^2]。
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值