navigation导航

1.在mercury_x1_ros/src/turn_on_mercury_robot/launch的路径下,找到navigation.launch文件,鼠标右键打开编辑该文件。

2.设置需要用于导航的地图

找到第11行的位置,这一行就是导入你所用于导航的地图参数文件。

<arg name="map_file" default="$(find turn_on_mercury_robot)/map/MERRCURY.yaml"/>

我这里就是用MERRCURY.yaml这个参数文件进行导航,当然你也可以改为你想要导航的参数文件。

举个例子,在gmapping的流程中,我在mercury_x1_ros/src/turn_onmercury_robot/map路径下生成map_demo_505.yaml,而且我需要用来导航,那么就得这么改。

 <arg name="map_file" default="$(find turn_on_mercury_robot)/map/map_demo_505.yaml"/>

3.启动roslaunch导航文件

确保你其他的终端程序已经关闭,然后打开一个新的终端执行以下指令

roslaunch turn_on_mercury_robot navigation.launch

4.会自动打开一个rviz可视化界面,机器人默认位姿就是在建图的起始点

可以点击2D Nav Goal发送导航目标点

了解左下角导航操作区

① 可设置目标点的最大数量:要求所设置目标点个数不能大于该参数(可以小于)

② 是否循环:若勾选,导航至最后一个目标点后,将重新导航至第一个目标点。例:1->2->3->1->2->3->···,该选项必须在开始导航前勾选

③ 任务目标点列表: x/y/yaw,地图上给定目标点的位姿(xy坐标与航向角yaw)。

  • 设置完目标最大数量,保存后,该列表会生成对应数量的条目
  • 每给出一个目标点,此处会读取到目标点的坐标与朝向

④ 开始导航:开始任务

⑤ 取消:取消当前目标点导航任务,机器人停止运动。再次点击开始导航后,会从下一个任务点开始。

例:1->2->3,在1->2的过程中点击取消,机器人停止运动,点击开始导航后,机器人将从当前坐标点去往3。

⑥ 重置:将清空当前所有目标点

设置任务目标点个数,点击确认保存。然后点击ToolBar上的2D Nav Goal,在地图上给定目标点。(每次设置都需要先点击2D Nav Goal),目标点有朝向区分,箭头顶端为机器人朝前方向。点击开始导航,导航开始,在rviz中看到起点到目标点位间有一条机器人的全局规划路径,机器人会沿着路线运动到目标点位。

  • 编写一个简单python实现导航点位的发送
import sys
import rospy
import actionlib

from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from actionlib_msgs.msg import *
from geometry_msgs.msg import Point
from geometry_msgs.msg import Twist

class MapNavigation:
    def __init__(self):
        self.goalReached = None
        rospy.init_node('map_navigation', anonymous=False)

    # move_base
    def moveToGoal(self, xGoal, yGoal, orientation_z, orientation_w):
        ac = actionlib.SimpleActionClient("move_base", MoveBaseAction)
        while (not ac.wait_for_server(rospy.Duration.from_sec(5.0))):
            sys.exit(0)

        goal = MoveBaseGoal()
        goal.target_pose.header.frame_id = "map"
        goal.target_pose.header.stamp = rospy.Time.now()
        goal.target_pose.pose.position = Point(xGoal, yGoal, 0)
        goal.target_pose.pose.orientation.x = 0.0
        goal.target_pose.pose.orientation.y = 0.0
        goal.target_pose.pose.orientation.z = orientation_z
        goal.target_pose.pose.orientation.w = orientation_w

        rospy.loginfo("Sending goal location ...")
        ac.send_goal(goal)

        ac.wait_for_result(rospy.Duration(600))

        if (ac.get_state() == GoalStatus.SUCCEEDED):
            rospy.loginfo("You have reached the destination")
            return True
        else:
            rospy.loginfo("The robot failed to reach the destination")
            return False

if __name__ == "__main__":
    goal_1 = [(-0.0277661, -0.00824622, 0.0431145, 0.999068)]   
    goal_2 = [(0.428357, -1.99509, 0.999547, -0.037365)]     
    goal_3 = [(0.318357, -2.10509, -0.681143, 0.732115)]     
    goal_4 = [(1.88323, -1.84847, 0.0746518, 0.997171)]     
    goal_5 = [(2.05847, -0.492321, -0.00194264, 0.999828)]  
    map_navigation = MapNavigation()

    x_goal, y_goal, orientation_z, orientation_w = goal_2[0]
    flag_feed_goalReached = map_navigation.moveToGoal(x_goal, y_goal, orientation_z, orientation_w)
    if flag_feed_goalReached:
        print("command completed")
    else:
        raise ValueError

上面代码重点是各个goal_x的获取,可以通过以下操作进行获取。确保你其他的终端程序已经关闭,然后打开一个新的终端执行以下指令

roslaunch turn_on_mercury_robot navigation.launch

然后用键盘控制机器人控制到你需要定的导航点位上

roslaunch mercury_x1_teleop keyboard_teleop.launch

在rviz中点击左下角的Add,找到By display type的一栏,选中TF后点击OK

找到Frames->base_link中的Position和Orientation一栏,这个就是当前base_link相对于map的tf转换,记录下Position的X/Y和Orientation的Z/W,给到python代码中goal_1变量中,将改变量发给move_base后,就会开始导航到该点。

以此类推,用键盘控制到第二点,记录第二个位置goal_2

results matching ""

    No results matching ""