ROS计算导航路径路程(导航前计算距离)python

ROS计算导航路径路程(导航前计算距离)python

在网络上查找的代码都是些要么用A*算法实现路径规划(时间太久不说【长达18分钟】, 还需要将导航过程中的点与点之间的距离相加这又不知道浪费多少时间~),要么必须导航到目标点才能知道路程多大。
然而,目的地的远近通常也是机器人是否考虑过去的一个重要指标,比如还有另一个更近的机器人,为何不让那个更近的去呢?为此,我们试图解决在未导航前就知道距离目的地有多远。
当然,此处的路径长度当然不是简单的欧式距离,是根据地图避障以后的路程大小哦~

主函数里只需要修改成你的目的地地点坐标就可以了啦!

这个问题困扰了我两个星期且网上都是理论知识实属太难了,希望有困扰的小伙伴能免受这种痛苦~

#!/usr/bin/env python
import math
import roslib, rospy
from nav_msgs.msg import Path
from geometry_msgs.msg import PoseWithCovarianceStamped
from geometry_msgs.msg import PoseStamped
from move_base_msgs.msg import MoveBaseActionGoal
from actionlib_msgs.msg import GoalID


subscriber = None


def calculate_path_distance(goal_position_x, goal_position_y, goal_orientation_z, goal_orientation_w):
    global subscriber
    topic = '/move_base/GlobalPlanner/plan'
    rospy.init_node('calculate_path_distance', anonymous=True)
    pub_goal = rospy.Publisher('move_base_simple/goal', PoseStamped, queue_size=10)
    #  geometry_msgs/PoseWithCovarianceStamped
    pub_start = rospy.wait_for_message('/amcl_pose', PoseWithCovarianceStamped, timeout=None)
    subscriber = rospy.Subscriber(topic, Path, printPath)


    start_point = PoseWithCovarianceStamped()
    # start point position x
    start_point.pose.pose.position.x = pub_start.pose.pose.position.x
    # start point position y
    start_point.pose.pose.position.y = pub_start.pose.pose.position.y
    start_point.header.stamp = rospy.Time.now()
    start_point.pose.pose.orientation.z = pub_start.pose.pose.orientation.z
    start_point.pose.pose.orientation.w = pub_start.pose.pose.orientation.w
    start_point.header.frame_id = 'map'
    rospy.sleep(1)
    # pub_start.publish(start_point)
    # print("Start Point:")
    # print(start_point)
    # print("--------------------")
    goal_point = PoseStamped()
    # goal point position x
    goal_point.pose.position.x = goal_position_x
    # goal point Y
    goal_point.pose.position.y = goal_position_y
    goal_point.header.stamp = rospy.Time.now()
    goal_point.pose.orientation.z = goal_orientation_z
    goal_point.pose.orientation.w = goal_orientation_w
    goal_point.header.frame_id = 'map'
    rospy.sleep(2)
    pub_goal.publish(goal_point)
    # print("Goal Point:")
    # print(goal_point)
    # print("--------------------")

    # print("Listening to " + topic)
    rospy.spin()


def printPath(path):
    global subscriber
    first_time = True
    prev_x = 0.0
    prev_y = 0.0
    total_distance = 0.0
    if len(path.poses) > 0:
        # pub_stop = rospy.Publisher('move_base/cancel', GoalID, queue_size=10)
        rospy.sleep(1)
        # pub_stop.publish(GoalID())
    for current_point in path.poses:
        x = current_point.pose.position.x
        y = current_point.pose.position.y
        if not first_time:
            total_distance += math.hypot(prev_x - x, prev_y - y)
        else:
            first_time = False
        prev_x = x
        prev_y = y
    subscriber.unregister()
    print("Total Distance = " + str(total_distance) + " meters")
    # print("Press Ctrl+C to exit.")


if __name__ == '__main__':
    calculate_path_distance(-9.12162303925, 6.68007469177,  0.343458574332, 0.939167827237)
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是一个简单的Python脚本,演示如何在ROS中使用多点导航: ```python #!/usr/bin/env python import rospy from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal import actionlib # 定义目标点坐标 goal_positions = [ [(0.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)], [(1.0, 1.0, 0.0), (0.0, 0.0, 0.707, 0.707)], [(2.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)] ] def move_to_goal(x, y, theta): # 创建MoveBaseAction客户端 client = actionlib.SimpleActionClient('move_base', MoveBaseAction) client.wait_for_server() # 创建MoveBaseGoal对象 goal = MoveBaseGoal() goal.target_pose.header.frame_id = "map" goal.target_pose.pose.position.x = x goal.target_pose.pose.position.y = y goal.target_pose.pose.orientation.z = theta[2] goal.target_pose.pose.orientation.w = theta[3] # 发送目标点 client.send_goal(goal) client.wait_for_result() if __name__ == '__main__': rospy.init_node('multi_point_navigation') # 依次移动到目标点 for i, goal in enumerate(goal_positions): rospy.loginfo("Moving to Goal {}".format(i+1)) move_to_goal(*goal[0], goal[1]) ``` 上述代码实现了如下功能: 1. 定义了三个目标点,每个目标点包括位置和姿态信息。 2. 创建了MoveBaseAction客户端,并等待服务器启动。 3. 依次移动到每个目标点,并在到达后等待服务器响应。 注意,以上代码中需要使用move_base节点提供的MoveBaseAction接口,因此需要确保move_base节点已经启动。例如,可以使用以下命令启动move_base节点: ``` roslaunch turtlebot3_navigation turtlebot3_navigation.launch ``` 另外,还需要将上述代码保存为Python文件,并确保文件具有可执行权限。例如,可以使用以下命令将文件保存为multi_point_nav.py,并赋予可执行权限: ``` chmod +x multi_point_nav.py ``` 最后,运行该脚本即可开始多点导航: ``` rosrun your_package_name multi_point_nav.py ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值