ROS python 开始\停止导航、发布目标点、获取实时位置

这篇博客详细介绍了如何在ROS环境中进行仿真操作,包括启动roscore、加载空地图、开启rviz以及发布目标点进行机器人导航。通过命令行和Python脚本两种方式设置了目标点,并演示了如何取消导航目标以及获取机器人实时位置。同时,讲解了使用tf监听器获取坐标变换的过程。
摘要由CSDN通过智能技术生成

在四个终端中分别执行以下命令,开启仿真
需要先有对应的包

roscore
roslaunch rbx1_bringup fake_turtlebot.launch 开启仿真
roslaunch rbx1_nav fake_move_base_blank_map.launch 加载空地图
rosrun rviz rviz -d `rospack find rbx1_nav`/nav.rviz 开启rviz

发布目标点,发送后立即开始运动
命令行形式
PoseStamped数据类型,主要要指明frame_id,position(x\y\z ),
orientation(四元数)
frame_id 可以选‘map’(世界坐标系)、‘base_link’(小车的坐标系)

rostopic pub /move_base_simple/goal  geometry_msgs/PoseStamped \
 '{header: {frame_id: "map"},pose: {position:{x: 1.0,y: 0,z: 0},orientation: {x: 0,y: 0,z: 0,w: 1}}}'

python 形式

#! /usr/bin/env python

import rospy
import time
from geometry_msgs.msg import PoseStamped

if __name__ == '__main__':
    rospy.init_node('pubpose')
    turtle_vel_pub = rospy.Publisher('move_base_simple/goal', PoseStamped, queue_size=1)
    
    mypose=PoseStamped()
    turtle_vel_pub.publish(mypose) #先发送一个空位置,试探一下,否则第一个包容易丢
    time.sleep(1)
    
    mypose=PoseStamped()
    mypose.header.frame_id='base_link' #设置自己的目标
    mypose.pose.position.x=1
    mypose.pose.position.y=0
    mypose.pose.position.z=0
    mypose.pose.orientation.x=0
    mypose.pose.orientation.y=0
    mypose.pose.orientation.z=1
    mypose.pose.orientation.w=0
    
    turtle_vel_pub.publish(mypose) #发送自己设置的目标点

    time.sleep(5)

取消目标点,停止导航
即给/move_base/cancel 节点发送GoalID

rostopic pub /move_base/cancel actionlib_msgs/GoalID -- {}

实时获取小车当前位置即获取tf
参考wiki tf listener

    #!/usr/bin/env python
import rospy
import tf
if __name__ == '__main__':
    rospy.init_node('turtle_tf_listener')

    listener = tf.TransformListener() #开始监听tf
    while not rospy.is_shutdown():
         try:
             (trans,rot) = listener.lookupTransform('map', 'base_link', rospy.Time(0)) #获取'base_link'相对于'map'的坐标变换,返回两个列表
         except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
             continue
         print('position',trans)
         print('orient',rot)
         time.sleep(0.5)

发布当前位置作为目标点,也可以终止导航

  • 15
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个简单的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 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值