< >
Home » ROS2与Navigation2入门教程 » ROS2与Navigation2入门教程-Python3简单命令(Simple Commander)API

ROS2与Navigation2入门教程-Python3简单命令(Simple Commander)API

说明:

  • 介绍基于Python3简单命令(Simple Commander)API

概述:

  • Nav2软件堆栈中Simple (Python3) Commander的目标是为Python3用户提供“作为库的导航”功能。

  • Nav2软件堆栈提供了一个API来为用户处理ROS2和动作服务器的所有任务,这样用户就可以专注于构建利用Nav2功能的应用程序(在根据自己的喜好对所选的插件进行配置后)。

  • Nav2软件堆栈还在nav2_simple_commander软件包中为用户提供该API用法的演示和示例,用于帮助用户构建自主移动机器人的基本通用功能。

  • 下面的代码展示了一个简单的示例。

  • 注意:goToPose()、goThroughPoses()、followWaypoints()等方法都是非阻塞的,以便可以在单线程应用程序中用于接收和处理反馈。

  • 因此,在等待任务完成时,while not nav.isNavComplete()设计很有必要对导航完成中的更改进行轮询,而且如果导航没有完成,还要对应用程序关心的一些任务(例如处理反馈、使用机器人正在收集的数据做一些事情、或故障检测等)进行轮询。

  • 可以使用这个简单指挥官抢占相同类型的命令(例如,可以用另一个goToPose()抢占goToPose()),但是如果在goToPose()和 goThroughPoses()或followWaypoints()之间进行切换,则必须明确取消当前命令并发出一条新命令。

from nav2_simple_commander.robot_navigator import BasicNavigator
import rclpy

rclpy.init()
nav = BasicNavigator()

# ...

nav.setInitialPose(init_pose)
nav.waitUntilNav2Active() # if autostarted, else use lifecycleStartup()

# ...

nav.goToPose(goal_pose)
while not nav.isNavComplete():
  feedback = nav.getFeedback()
  if feedback.navigation_duration > 600:
    nav.cancelNav()

# ...

result = nav.getResult()
if result == NavigationResult.SUCCEEDED:
    print('Goal succeeded!')
elif result == NavigationResult.CANCELED:
    print('Goal was canceled!')
elif result == NavigationResult.FAILED:
    print('Goal failed!')

API

  • 基本导航仪(navigator)提供的方法(带有输入和预期的返回值)如下表所示。
  • 如果服务器失败,可能会抛出异常或返回一个None对象,因此请确保将导航调用正确封装在try/catch中并检查返回的None 类型。
Robot Navigator方法描述
setInitialPose(initial_pose)设置机器人的初始位姿(PoseStamped) 以进行定位。
goThroughPoses(poses)请求机器人行驶通过一组位姿(PoseStamped列表)。
goToPose(pose)请求机器人行驶至某个位姿(PoseStamped)。
followWaypoints(poses)请求机器人遵循一组航点(PoseStamped列表)行驶。这会在每个位姿上执行所选的TaskExecutor插件。
cancelNav()取消一个正在进行中的goThroughPoses、goToPose或者followWaypoints任务。
isNavComplete()检测是否完成导航,会在100ms后超时。如果已完成,会返回True;如果仍在行进中,则返回False。
getFeedback()获取来自导航任务的反馈消息,返回动作服务器反馈消息。
getResult()获取导航任务的最终结果,在isNavComplete返回True后被调用。返回动作服务器结果消息。
getPath(start, goal)获取从起点到目标位姿(PoseStamped)的路径(nav_msgs/Path)
getPathThroughPoses(start, goals)获取从起点到一组目标位姿(PoseStamped列表)的路径( nav_msgs/Path)。
changeMap(map_filepath)请求将当前地图变更至 map_filepath指向的yaml地图。
clearAllCostmaps()同时清除全局和局部成本地图。
clearLocalCostmap()清除局部成本地图。
clearGlobalCostmap()清除全局地图。
getGlobalCostmap()获取返回的全局成本地图( nav2_msgs/Costmap)。
getLocalCostmap()获取返回的局部成本地图( nav2_msgs/Costmap)。
waitUntilNav2Active()阻塞直到Nav2完全在线并且生命周期节点处于活动状态。此方法与自动启动或外部生命周期启动结合使用。
lifecycleStartup()向所有生命周期管理服务器发送请求以使它们进入活动状态,如果autostart为False并且希望此程序控制Nav2的生命周期,则请使用此方法。
lifecycleShutdown()向所有生命周期管理服务器发送请求以关闭它们。

示例和演示

请输入图片描述

  • example_nav_to_pose.py——此示例展示了导航仪导航到某位姿的功能,以及许多辅助方法。

  • example_nav_to_pose.py——此示例展示了导航仪导航到某位姿的功example_nav_through_poses.py——此示例展示了导航仪导航通过多个位姿的功能,以及许多辅助方法。

  • example_nav_to_pose.py——此示例展示了导航仪导航到某位姿的功example_waypoint_follower.py——此示例展示了导航仪的航点跟随功能,以及许多所需的辅助方法。

软件包nav2_simple_commander有一些演示来突显用户可以使用API构建的几个简单的自主机器人应用程序:

  • demo_security.py——此演示是一个简单的机器人安全应用程序,展示了如何让机器人使用Navigate Through Poses无限期地沿着安全路线进行巡逻。

  • demo_picking.py——此演示是一个简单的物品拣选应用程序,展示了如何让机器人行驶到仓库中的特定货架来拣选物品,或者让人将物品放入篮子中并使用Navigate To Pose将该篮子运送到目的地进行运输。

  • demo_inspection.py——此演示是一个简单的货架检查应用程序,展示了如何使用Waypoint Follower和任务执行器对货架进行拍照、RFID扫描等,以分析当前货架状态并定位仓库中的物品。

参考:

  • https://navigation.ros.org/commander_api/index.html

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与navigation2入门教程