TEB轨迹规划算法教程-增加动态障碍
TEB轨迹规划算法教程-增加动态障碍
说明:
- 介绍如何在teb_local_planner中包含动态障碍。
- 在之前的教程中,您学习了如何通过一系列costmap_converter/ObstacleMsg消息提供用户提供的障碍。
- 消息定义包括称为速度的geometry_msgs/TwistWithCovariance字段,该字段捕获当前质心的速度。
- 目前,teb_local_planner包只处理linear.x和linear.y。
编写一个简单的动态障碍发布者
- 在下文中,我们将创建一个发布动态障碍的小python节点。
- 对于规划部分,我们将运行教程设置和测试优化中描述的test_optim_node。
- 或者,您也可以根据配置并运行机器人导航,使用正确配置的导航启动文件测试您的发布者。
- 创建一个名为publish_dynamic_obstacles.py的python节点:
#!/usr/bin/env python
import rospy, math, tf
from costmap_converter.msg import ObstacleArrayMsg, ObstacleMsg
from geometry_msgs.msg import Point32, QuaternionStamped, Quaternion, TwistWithCovariance
from tf.transformations import quaternion_from_euler
def publish_obstacle_msg():
pub = rospy.Publisher('/test_optim_node/obstacles', ObstacleArrayMsg, queue_size=1)
rospy.init_node("test_obstacle_msg")
y_0 = -3.0
vel_x = 0.0
vel_y = 0.3
range_y = 6.0
obstacle_msg = ObstacleArrayMsg()
obstacle_msg.header.stamp = rospy.Time.now()
obstacle_msg.header.frame_id = "odom" # CHANGE HERE: odom/map
# Add point obstacle
obstacle_msg.obstacles.append(ObstacleMsg())
obstacle_msg.obstacles[0].id = 99
obstacle_msg.obstacles[0].polygon.points = [Point32()]
obstacle_msg.obstacles[0].polygon.points[0].x = -1.5
obstacle_msg.obstacles[0].polygon.points[0].y = 0
obstacle_msg.obstacles[0].polygon.points[0].z = 0
yaw = math.atan2(vel_y, vel_x)
q = tf.transformations.quaternion_from_euler(0,0,yaw)
obstacle_msg.obstacles[0].orientation = Quaternion(*q)
obstacle_msg.obstacles[0].velocities.twist.linear.x = vel_x
obstacle_msg.obstacles[0].velocities.twist.linear.y = vel_y
obstacle_msg.obstacles[0].velocities.twist.linear.z = 0
obstacle_msg.obstacles[0].velocities.twist.angular.x = 0
obstacle_msg.obstacles[0].velocities.twist.angular.y = 0
obstacle_msg.obstacles[0].velocities.twist.angular.z = 0
r = rospy.Rate(10) # 10hz
t = 0.0
while not rospy.is_shutdown():
# Vary y component of the point obstacle
if (vel_y >= 0):
obstacle_msg.obstacles[0].polygon.points[0].y = y_0 + (vel_y*t)%range_y
else:
obstacle_msg.obstacles[0].polygon.points[0].y = y_0 + (vel_y*t)%range_y - range_y
t = t + 0.1
pub.publish(obstacle_msg)
r.sleep()
if __name__ == '__main__':
try:
publish_obstacle_msg()
except rospy.ROSInterruptException:
pass
- 现在结合rviz运行teb_local_planner test_optim_node:
roslaunch teb_local_planner test_optim_node.launch
- 在下文中,我们假设包含python脚本的包名为mypublisher。
- 确保您的脚本标记为可执行文件(chmod + x publish_dynamic_obstacles.py)。
- 打开一个新终端并运行新创建的python脚本:
roslaunch mypublisher publish_dynamic_obstacles.py
- 您现在应该看到一个可视化(rviz),它应该与前一个教程中的类似,
- 特别是您应该能够看到默认的test_optim_node障碍物(交互式标记)和新的移动(动态)障碍物
- 但是,teb_local_planner/test_optim_node中尚未启用动态障碍功能。
- 我们将在下一节中完成此操作。
- 在继续之前,请将交互式标记移动到远离计划场景的位置,如下图所示:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号