Turtlebot 2e 导航之 `move_base` 参数详解: 社会活动导航层`social_navigation_layers`初探

14 篇文章 10 订阅
13 篇文章 3 订阅

Turtlebot 2e 导航之 move_base 参数详解: 社会活动导航层social_navigation_layers初探

Wiki: http://wiki.ros.org/social_navigation_layers
github: https://github.com/DLu/navigation_layers

Wiki介绍:

social_navigation_layers是用于导航功能包的基于插件实现的cost map,代码实现过程中考虑了人类各种社交活动的约束,例如空间距离约束(proxemic distance)。

社会活动导航层(Social Navigation Layers)

目前存在两种以考虑人类社会活动为对象的导航代价层。虽然名字不同,但它们却拥有共同的功能:共同订阅人在何处的消息,用高斯分布调节人群周围的通行代价。两者皆从SocialLayer类继承而来。

可在costmap的配置中用下列类型指定Social Navigation Layers的类型。

  • social_navigation_layers::ProxemicLayer
  • social_navigation_layers::PassingLayer

ProxemicLayer/PassingLayer

两层的接口一致,介绍如下。

订阅的topic

/people (people_msgs/People)
表示机器人周围的人

参数

  • enabled (bool, default: True)
    是否启用该层
  • cutoff (double, default: 10.0)
    调节代价地图时发布行人位置的最小值
  • amplitude (double, default: 77.0)
    峰值调整幅度
  • covariance (double, default: 0.25)
    调整方差
  • factor (double, default: 5.0)
    用于缩放速度的因子
  • keep_time (double, default: 0.75)
    清除行人足迹前的暂停时间

代价图会发生什么变化

person.png

Proxemic 层

Proxemic层使用上面定义的参数在检测到的人附近增加一个高斯状的通行代价。如果行人静止,则高斯分布将是完美的帽子形。但若行人在移动,则代价值将沿行人行走的方向增加。行人前面的代价值增加的幅度与定义的缩放因子成正比。

当行人静止时:
在这里插入图片描述

当行人走动时:
在这里插入图片描述
(注意到行人前面的部分其代价值发生了变化!)

Passing 层

该层旨在使机器人始终在人的左侧通过,因此仅在行人的一侧增大其通行成本。

在这里插入图片描述

social_navigation_layers的启用

启用很方便,仅需要下载github的代码到src目录,然后catkin_make后:

  1. 修改global_costmap_params.yaml:
   plugins:
     - {name: static_layer,            type: "costmap_2d::StaticLayer"}
     - {name: social_layer,            type: "social_navigation_layers::ProxemicLayer"}
     - {name: obstacle_layer,          type: "costmap_2d::ObstacleLayer"}
#     - {name: voxel_layer,             type: "costmap_2d::VoxelLayer"}
     - {name: inflation_layer,         type: "costmap_2d::InflationLayer"}

注意:

  • obstacle_layer设置为costmap_2d::ObstacleLayer将不利于调试
  • 这里启用的是ProxemicLayer, 类似也可启用PassingLayer
  1. 修改local_costmap_params.yaml, 启用行人检测插件。
 plugins:
     - {name: social_layer,            type: "social_navigation_layers::ProxemicLayer"}
     - {name: obstacle_layer,          type: "costmap_2d::ObstacleLayer"}
     - {name: inflation_layer,         type: "costmap_2d::InflationLayer"}

参数设置

costmap_common_params.yaml增加social_layer的参数:

social_layer:
   enabled:               true
   cutoff:                10.0    #  double, default: 10.0 - Smallest value to publish on costmap adjustments
   amplitude:             77.0    #  double, default: 77.0 - Amplitude of adjustments at peak
   covariance:            0.25    #  double, default: 0.25 - Covariance of adjustments
   factor:                5.0     #  double, default: 5.0 -  Factor with which to scale the velocity
   keep_time:             0.75    #  double, default: 0.75

根据David V. Lu的讨论(https://github.com/DLu/navigation_layers/issues/34),能否成功检测出人的关键参数主要有:

  • cutoff: 126.0
  • amplitude: 254
  • covariance: 1.35
  • factor: 5.0

这些参数的数值需要根据采用的雷达数据进行调节。参数意义见上面介绍。

其他资源

  1. 使用基于HMM结合Bayesian Human motion Intentionalitiy prediction( BHMIP)预测行人位置的功能包:
  1. 编写自己的cost map layer:
    请参考: http://wiki.ros.org/costmap_2d/Tutorials/Creating a New Layer

  2. ROS导航:向cost-map中添加超声波障碍图层
    https://blog.csdn.net/qq_25241325/article/details/83824504

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下代码实现在Python中使用move_base实现rviz小车定点导航: ```python import rospy from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal import actionlib def move_to_goal(x, y): # 初始化节点 rospy.init_node('move_base_client') # 创建一个actionlib客户端,连接move_base服务器 client = actionlib.SimpleActionClient('move_base', MoveBaseAction) client.wait_for_server() # 创建一个MoveBaseGoal对象 goal = MoveBaseGoal() goal.target_pose.header.frame_id = "map" goal.target_pose.header.stamp = rospy.Time.now() # 设置目标点的坐标 goal.target_pose.pose.position.x = x goal.target_pose.pose.position.y = y goal.target_pose.pose.orientation.w = 1.0 # 发送目标点给move_base服务器 client.send_goal(goal) # 等待move_base完成导航 wait = client.wait_for_result() # 判断是否成功到达目标点 if not wait: rospy.logerr("Action server not available!") rospy.signal_shutdown("Action server not available!") else: return client.get_result() if __name__ == '__main__': try: # 设置目标点的坐标 x = 1.0 y = 2.0 # 调用move_to_goal函数实现导航 result = move_to_goal(x, y) # 判断是否成功到达目标点 if result: rospy.loginfo("Goal execution done!") except rospy.ROSInterruptException: rospy.loginfo("Navigation test finished.") ``` 这段代码使用了move_base_msgs和actionlib库,通过创建一个MoveBaseGoal对象,设置目标点的坐标,然后发送给move_base服务器,实现小车的定点导航

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值