local_planner.launch
包括节点localPlanner
和pathFollower
,以及发布sensor ---> vehicle
和 sensor ---> camera
的tf变换
避障: 由
local_planner
实现. 程序一启动就先预生成Motion primitives
. The motion primitives are modeled as Monte Carlo samples and organized in groups 现实中快遇到障碍物时,local planner
可以在几毫秒内判断出哪些 motion primitives 会和障碍相撞,然后从motion primitives中选出最可能朝向目标的一组。Sending waypoints, navigation boundary, and speed: 一收到waypoint, navigation boundary, and speed 的消息, the system will navigate the vehicle inside the navigation boundary to the waypoint. 发送的
navigation boundary
和速度是可设置的,默认速度2m/s
. 可以参考waypoint_example
如何发送这些消息Waypoint: 话题
way_point
,geometry_msgs::PointStamped
类型的消息,在map
坐标系。 发布者当然是rvizGA
和localPlanner
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21header:
seq: 6
stamp:
secs: 215
nsecs: 380000000
frame_id: "map"
point:
x: 9.90468215942
y: 12.2474937439
z: 0.839443683624
---
header:
seq: 7
stamp:
secs: 215
nsecs: 380000000
frame_id: "map"
point:
x: 9.90468215942
y: 12.2474937439
z: 0.839443683624Navigation boundary (optional): 话题
navigation_boundary
,geometry_msgs::PolygonStamped
的消息, 在map
坐标系。 默认没有发布,订阅者是localPlanner
system_real_robot.launch
中的部分:1
2
3
4
5<include file="$(find local_planner)/launch/local_planner.launch" >
<arg name="cameraOffsetZ" value="$(arg cameraOffsetZ)"/>
<arg name="goalX" value="$(arg vehicleX)"/>
<arg name="goalY" value="$(arg vehicleY)"/>
</include>
这个launch其实就是localPlanner
和 pathFollower
两个节点,再加两个tf转换1
2
3<node pkg="tf" type="static_transform_publisher" name="vehicleTransPublisher" args="-$(arg sensorOffsetX) -$(arg sensorOffsetY) 0 0 0 0 /sensor /vehicle 1000"/>
<node pkg="tf" type="static_transform_publisher" name="sensorTransPublisher" args="0 0 $(arg cameraOffsetZ) -1.5707963 0 -1.5707963 /sensor /camera 1000"/>
节点localPlanner
一直在发布话题path
,可以将源码中的宏PLOTPATHSET
改为0,最好是做成ROS Param.
只有path follower
会发布cmd_vel
,在机器人前往目标点的过程中, local planner会不断的对比机器人当前位置和目标点位置的差距,根据这个差值去控制机器人的直线速度和转向速度,最终不断逼近目标点。
代码中常出现的laserCloud
和vehicleX
都是在map
坐标系下