目录
手动发布rviz中的publish point
我在利用move—base跑仿真时,是使用的rviz中的publish point按钮,在加载的地图上点一系列的目标点,让仿真车辆按照我点的轨迹去跑;在实车的情况下,如果每一次都靠手动去在rviz中创建目标点的话,我感觉实车的运行轨迹不够精确,所以想创建文件或者是在终端使用命令去发送这些点来代替手动在rviz中的创建的点。
思路方法
方法一:
因为实车搭载了Gps,首先想到的就是先使用遥控让车辆跑一下路线,记录下gps的信息,让实车回到开始位置,将gps信号转为map上的点发送给move—base。
方法二:
方法一的简化,还是利用rviz中的publish point按钮直接在地图点击一系列的点,但是要记录下点的信息,然后让实车回到初始位置去发布这些点。
实现
按照由易到难的原则,先把方法二的功能实现出来,再进一步进行优化!!
publish point的发布的话题“/clicked_point”
rostopic info /clicked_point
Type: geometry_msgs/PointStamped
Publishers:
* /rviz (http://zero:37475/)
Subscribers:
* /car/move_base (http://zero:37663/)
发现了个有趣的现象,在rviz中手动点击publish point的时,当加载的两个publish point之间距离比较小时,move_base会发布“/move_base/goal”话题,那么问题就简单了,我只需要在终端向“/cliceke_point”话题发布两个 publish point,且这两点的位置相近即可,随后move_base包会自动发布“/move_base/goal”话题,模型开始移动!!
发布“/clicked_point”内容
rostopic pub /clicked_point geometry_msgs/PointStamped \ '{header: {frame_id: "map"},point: {x: 7.79252910614,y: -0.434817790985,z: 0.00178050994873}}'
rostopic pub /clicked_point geometry_msgs/PointStamped \ '{header: {frame_id: "map"},point: {x: 8.09252910614,y: -0.434817790985,z: 0.00178050994873}}'
ok!!成功的让它跑起来了!!
使用脚本发布一系列的点
#!/bin/sh
rostopic pub -1 /clicked_point geometry_msgs/PointStamped "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: 'map'
point:
x: -5.0
y: 0.0
z: 0.0"
rostopic pub -1 /clicked_point geometry_msgs/PointStamped "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: 'map'
point:
x: -4.0
y: 0.0
z: 0.0"
rostopic pub -1 /clicked_point geometry_msgs/PointStamped "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: 'map'
point:
x: -3.0
y: 0.0
z: 0.0"
rostopic pub -1 /clicked_point geometry_msgs/PointStamped "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: 'map'
point:
x: -2.7
y: 0.0
z: 0.0"
疑惑
为何发布的publish point 两点的距离大些时,move_base不会发布“/move_base/goal”话题,即模型不会动起来??距离小的时候就可以??
解答:
因为我的全局规划路径使用的waypoint,在全局规划路径的配置中,设置了这个距离参数,可以调整的!!
补充
对于评论讲的发布
/clicked_point
话题之后模型并没有动起来,解释如下:
我们要让move_base订阅clicked_point话题,怎么实现呢?这里可以使用开源的全局算法waypoint-global-planner(https://github.com/gkouros/waypoint-global-planner);
在move_base调用就可以了!!
示例:
move_base.launch
:
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
<rosparam file="$(find my_navigation)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find my_navigation)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find my_navigation)/config/local_costmap_params.yaml" command="load" />
<rosparam file="$(find my_navigation)/config/global_costmap_params.yaml" command="load" />
<!--global_planner-->
<rosparam file="$(find my_navigation)/config/base_global_planner_params.yaml" command="load" />
</node>
</launch>
base_global_planner_params.yaml
:
base_global_planner: "waypoint_global_planner/WaypointGlobalPlanner"
#planner_frequency: 0.0 #此为move_base参数
#planner_patience: 1.0 #此为move_base参数,在move_base_params.yaml中也进行了设定
WaypointGlobalPlanner:
# epsilon: 1e-1 # distance threshold for final waypoint
epsilon: 0.5 # distance threshold for final waypoint
waypoints_per_meter: 10 # number of waypoints per meter for the interpolation of the path