laser_scan_matcher模拟里程计输出
mrobot_navigation导航功能包
topic_example串口通信
- 最初由于比赛需要而尝试了单纯依靠激光雷达实现简易导航,最终效果可以输出导航所需要的线速度与角速度信息。
- 测试平台为:ubuntu16.04系统,ros-kinetic版本,思岚(A1,A2)激光雷达,实现功能需要确保已正确安装ROS环境。
- 所用代码地址:https://github.com/sxs505/Logistics-car-rplidar
- 运行编译可以直接将src下所需要的导航功能包与topic_example串口通信等复制至自己的工作空间的src下,然后编译即可
- 具体实现说明:
5.1 依靠激光雷达实现gmapping建图功能
安装雷达驱动,编译laser_scan_matcher功能包通过后,启动demo_gmapping_A1.launch或hector_slam.launch即可实现建图功能。
(也可使用hector算法,无需其他数据,手持雷达即可实现建图)
laser_scan_matcher可模拟里程计输出
启动其demo_gmapping_A1.launch即可实现gmapping建图功能
5.2. 实现导航功能
mrobot_navigation为导航主要使用的功能包,其中config为可以设置的导航参数,各个参数可以参考
进行更改调整。
启动nav_demo.launch文件即可实现导航功能,但因为具体使用环境不同可能会产生报错,对于具体问题需要具体分析解决
启动指令为
roslaunch mrobot_navigation nav_demo.launch
5.3. 实现导航信息的串口通信
topic_example为获取导航信息节点,可以截取导航时的线速度与角速度信息并将其通过串口发送出去。根据开发方式不同,也可以采用其他方式获取导航信息控制底盘运动。
运行指令为:
rosrun topic_example publish_node
注意事项:
TF变换
导航功能无法正常运行最可能的原因是由于TF变换存在问题
已知的信息有:amcl或localization仿真功能包
订阅
1. scan (sensor_msgs/LaserScan)
2. tf (tf/tfMessage)
3. initialpose (geometry_msgs/PoseWithCovarianceStamped)
4. map (nav_msgs/OccupancyGrid)
发布
5. amcl_pose (geometry_msgs/PoseWithCovarianceStamped)
6. particlecloud (geometry_msgs/PoseArray)
7. tf (tf/tfMessage)
从map到odom的坐标变换将由此功能包发布,
如果重复对某一坐标之间进行静态坐标变换可能会出现机器人在RVIZ中来回跳动的情况
在launch文件中只需写入下列一个坐标变换即可,如出现报错可根据提示自行解决或在此博客下留言
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.0 0.0 0.0 0.0 0.0 0.0 /base_link /laser 40" />
机器人模型
机器人模型在导航中并非必须的,对于机器人模型在rviz中的警告可以不用考虑。但如果开发机器人模型与turtlebot机器人相差不多,因方便起见可以使用自带机器人模型。在Logistics-car-rplidar/src/mrobot_gazebo/launch/zero.launch文件中已经将无需使用的结点注释掉。建议机器人模型节点在导航功能启动前启动,防止报错。
导航前准备及信息查看
导航前需要使用2D Post estimate对机器人位姿进行初始化,使得机器人雷达扫描点与之前所建地图尽可能重合。初始点的好坏对机器人导航效果有着一定的影响。
使用2D NAV Goal点击地图即可为机器人设置导航目标点,机器人会自动规划出行进路线,此时可以通过
rostopic echo /cmd_vel
以上命令进行查看
判断机器人导航是否可行
可以通过观察机器人在rviz界面中的tf坐标树是否会随现实机器人的移动而移动,如若不行则可能坐标变换存在问题。
其次可以观察多次发布导航点规划的路径起始点是否是会随机器人位置改变而改变,如若不行则可能坐标变换存在问题。
串口与雷达权限
雷达权限指令
sudo chmod 777 /dev/ttyUSB0
串口权限指令
sudo chmod 777 /dev/ttyUSB1
(注意串口权限指令会由于通信方式及串口号不同而不用)
附上近期参与过的机器人启动文件及其各部分解析,因为存在解析语言注意不可直接复制粘贴使用
<launch>
<param name="use_sim_time" value="false" />
<!-- 配置雷达 -->
<node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen">
<param name="serial_port" type="string" value="/dev/ttyUSB0"/> //该部分为雷达串口
<param name="serial_baudrate" type="int" value="115200"/> //该部分为雷达串口波特率
<param name="frame_id" type="string" value="laser"/> //雷达ID
<param name="inverted" type="bool" value="false"/> //雷达是否倒置
<param name="angle_compensate" type="bool" value="true"/> //雷达角度补偿
</node>
<!--地图信息-->
<node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />
<arg name="map_file" default="/home/xt/my_map.yaml"/> //此处为导航地图选择,可以根据自己情况替换
<!-- 运行move_base节点 -->
<include file="$(find mrobot_navigation)/launch/move_base.launch" />
<!--模拟里程计信息功能包-->
<node pkg="laser_scan_matcher" type="laser_scan_matcher_node" name="laser_scan_matcher_node" output="screen">
<param name="max_iterations" value="10"/>
<param name="fixed_frame" value = "odom"/>
<param name="max_iterations" value="10"/>
<param name="base_frame" value = "base_link"/>
<param name="use_odom" value="true"/>
<param name="publy_pose" value = "true"/>
<param name="publy_tf" value="true"/>
</node>
<!--ros自带机器人模型--> //该节点为非必需节点
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" >
<param name="publish_frequency" type="double" value="20.0" />
</node>
<!-- 启动AMCL节点 --> //蒙特卡洛定位方法
<include file="$(find mrobot_navigation)/launch/amcl.launch" />
<!-- 设置坐标变换--> //机器人各部分之间的链接关系
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.0 0.0 0.0 0.0 0.0 0.0 /base_link /laser 40" />
<!-- 运行rviz --> //rviz显示
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find mrobot_navigation)/rviz/nav.rviz"/>
</launch>