【ROS Rikirobot基础-使用系列 第四章节】Rikirobot小车使用激光雷达进行自动导航

利用激光雷达进行自动导航

这里我们教大家使用的是利用激光雷达导航,关于深度摄像头的导航我们后面会教大家使用
1、上电启动小车,主控端执行启动小车的命令:

roslaunch rikirobot bringup.launch

2、主控端启动导航的命令,等待启动完成:

roslaunch rikirobot navigate.launch
这里写图片描述

3、在远程端打开可视频工具rviz,在远程端运行下面命令,然后把出现的窗口最大化,然后左上角,有一个File->OpenConfig,然后到catkin_ws/src/rikirobot_project/rikirobot/rviz这个路径下面打开navigate.rviz,等待窗口把数据加载完成,导航的第一步就是要初始化位姿,用“2D Pose Estimate”,在地图的可视区域拖一下,记住拖一下不是随便拖,是你机器人的实际位置,在地图上显示的这个区域拖一下,那个箭头带表方向,这个也很重要,这个意思就是你告诉机器人,你在地图上的定位是错误的,你应该在我给定的这个位置(tip:如果不想每次给定位姿,你可以在建图时,机器人的起始位置是在那里,你导航时一样,把机器人放到这个位置,就不用估计位姿),位姿校正完成后,我们就用“2D Nav Goal”发送目标,这个作用是告诉你,你现在去我指定的地方,也是在地图的可视化区域拖一下,然后小车此时自动规化路径,自己避开地图上的障碍物,到达目的地,而且是可以动态避障的,你在一定距离内出现在地图区域,它也可以重新规化路径,绕过你这个动态的障碍物:

rosrun rviz rviz
这里写图片描述

关于导航中出现的问题

1、为什么导航时遇到障碍物要转几次才能绕过去呢?
因为算法在遇到障碍物后,需求重新计算后,通过旋转重新规化路径,才能完成。当然如果你用好的主控,路导航算法,通过参数上的调整,可以让车提前感知到后,提前计算,提前规化。
2、为什么我的车在过道或者障碍物前不停的转,像傻掉一样了?
这是因为你的动态区域就是障碍物的缓冲区域,如上图的蓝色区域,这种情况是在告诉你,你现在的过道或者障碍已经小于我设定值,我过不去了,但我通过不停的旋转也没有找到第二条可以到达你给定的位置,通过软件上调整动态区域的参数来优化上面问题,但参数不是调整的越小越好,如果太小了,缓冲区域太小,小车有可能会撞上障碍物,要记住,它是机器,是按算法约束的条件来执行的。
3、为什么导航多次,运行时间久了,导航就会出现偏差,或者到达的位置不准确?
这是因为我们车是由硬件组成的,硬件是有误差的,这种误差最终会反馈到里程计上,里程计就会影响小车在实际运动过程中到达的位置,如果我们的车1m的误差有1cm,通过长时间运行会不断的扩大 这个误差,如果导航过程已经出现误差,也可以重新通过校正位姿来修正,也就是告诉小车,嗨,你现在的位置不对,你在应该在这里。
4、关于导航过程出现的一些其它的错误与警告怎么办?
由于ROS导航时系统非常大,你看启动导航时加载的参数都有几十个,出现的警告与错误,都是由于条件不满足而导致的,大家可以根据相关的警告或者错误自己百度或者谷歌。

最后的最后

Rikirobot提供两驱动、四驱动、麦克纳姆轮、Omni全向三轮、Omni全向四轮、履带、阿克曼(舵机转向)、大型负载的各种ROS车,有配套指导、及完善售后。
QQ交流群:130486387
RIKIROBOT店铺连接
下面是店铺的二维码与Rikirobot的交流群,有兴趣的可以扫一扫。
店铺二维码QQ交流群
这里写图片描述

使用IMU和激光雷达进行机器人定位,可以采用扩展卡尔曼滤波(Extended Kalman Filter,EKF)算法。 首先,需要在ROS环境中安装`robot_localization`功能包,可以通过以下命令进行安装: ``` sudo apt-get install ros-<distro>-robot-localization ``` 其中,`<distro>`是ROS版本号,例如`kinetic`、`melodic`等。 接着,在ROS点中引入`robot_localization`的头文件,并创建一个`ros::NodeHandle`对象: ``` #include <ros/ros.h> #include <robot_localization/ekf_localization_node.hpp> ... ros::NodeHandle nh("~"); ``` 然后,需要设置EKF的参数,例如状态量、传感器数据类型等: ``` std::vector<std::string> state_vars = {"x", "y", "z", "roll", "pitch", "yaw", "xd", "yd", "zd", "rolld", "pitchd", "yawd"}; // 状态量 std::vector<std::string> odom_vars = {"x", "y", "z", "roll", "pitch", "yaw"}; // 里程计数据 std::vector<std::string> imu_vars = {"roll", "pitch", "yaw", "rolld", "pitchd", "yawd"}; // IMU数据 std::vector<std::string> laser_vars = {"x", "y", "z"}; // 激光雷达数据 robot_localization::EkfLocalizationNode::EkfConfig config; config.set_state_vars(state_vars); config.set_odom_vars(odom_vars); config.set_imu_vars(imu_vars); config.set_laser_vars(laser_vars); ``` 接着,可以通过以下代码创建EKF点: ``` robot_localization::EkfLocalizationNode ekf_node(config); ekf_node.setNodeHandle(&nh); ekf_node.init(); ``` 最后,可以在`ros::spin()`循环中调用EKF点的定位函数,例如: ``` while (ros::ok()) { ekf_node.correct(); // 使用IMU和激光雷达数据进行校正 pose = ekf_node.getRobotPose(); // 获取机器人位姿 ... ros::spinOnce(); } ``` 这样就可以使用C++编写ROS机器人使用IMU和激光雷达进行定位了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值