actionlib movebase多点导航

#include "ros/ros.h"

#include "iostream"

#include "vector"

#include "move_base_msgs/MoveBaseAction.h"

#include "actionlib/client/simple_action_client.h"


typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;

//客户端类型


std::vector<std::vector<float>> pts = {
  
  {0.0, 0.0}, {-1.0, -1.0}, {0.0, 0.0},{-1.0, -1.0}};


// void pts_Callback(const geometry_msgs::PointStamped::ConstPtr& msg){

// pts.push_back({msg->point.x, msg->point.y});

// }


int main(int argc, char **argv)

{

ros::init(argc, argv, "navi_action");

ros::NodeHandle nh;

int i = 1;

// ros::Subscriber sub = nh.subscribe("/clicked_points", 10, pts_Callback);

MoveBaseClient ac("move_base", true);

// "move_base" is the name of the action server:服务器

// true -> don't need ros::spin()

while (!ac.waitForServer(ros::Duration(3.0)))

{

ROS_INFO("Waiting for action server");

}

for(auto pt : pts){

move_base_msgs::MoveBaseGoal goal;

goal.target_pose.header.frame_id = "map";

goal.target_pose.header.stamp = ros::Time::now();

goal.target_pose.pose.position.x = pt[0];

goal.target_pose.pose.position.y = pt[1];

goal.target_pose.pose.orientation.w = 1.0;

ac.sendGoal(goal);

ac.waitForResult();

if (ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)

{

ROS_INFO("Arrived %d pts",i);

}else{

ROS_INFO("Failed");

}

i++;

}

}

第二版:在rviz点击4个目标点来设置目标点:

#include "ros/ros.h"
#include "iostream"
#include "vector"
#include "geometry_msgs/PointStamped.h"
#include "move_base_msgs/MoveBaseAction.h"
#include "actionlib/client/simple_action_client.h"

//客户端类型
typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;

//目标点{x,y,w=1}
std::vector<std::vector<float>> pts = {
  
  {0.0, 0.0}, {-1.0, -1.0}, {0.0, 0.0},{-1.0, -1.0}};
//控制回调次数
int counter = 0;


void pts_Callback(const geometry_msgs::PointStamped::ConstPtr& msg){
    counter++;
    pts[counter-1] = {msg->point.x, msg->point.y};
}

int main(int argc, char **argv) 
{
    ros::init(argc, argv, "navi_action");
    ros::NodeHandle nh;
    //显示第几个点
    int num = 1;
    ros::Subscriber sub = nh.subscribe("/clicked_point", 10, pts_Callback);
    while (counter < 4) {
        ros::spinOnce();  // 处理一次回调函数
    }
    MoveBaseClient ac("move_base", true); 
    // "move_base" is the name of the action server:服务器
    // true -> don't need ros::spin()
    while (!ac.waitForServer(ros::Duration(3.0)))
    {
        ROS_INFO("Waiting for action server");
    }
    for(auto pt : pts){
        move_base_msgs::MoveBaseGoal goal; 
        goal.target_pose.header.frame_id = "map";
        goal.target_pose.header.stamp = ros::Time::now();
        goal.target_pose.pose.position.x = pt[0];
        goal.target_pose.pose.position.y = pt[1];
        goal.target_pose.pose.orientation.w = 1.0;
        ac.sendGoal(goal);
        ac.waitForResult();
        if (ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
        {
            ROS_INFO("Arrived in %d pts",num);
        }else{
            ROS_INFO("Failed in %d pts",num);
        }
        num++;
    }
}

### TurtleBot3多点路径规划与导航 为了使TurtleBot3能够在多个目标点之间自主导航,可以编写一个Python脚本来发送一系列的目标位置给`move_base`节点。这允许机器人按照预定顺序访问各个地点。 下面是一个简单的例子来展示如何实现这一功能: #### 创建 Python 脚本 首先创建一个新的Python文件用于定义机器人的行为逻辑[^1]。 ```python #!/usr/bin/env python import rospy from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal import actionlib from tf.transformations import quaternion_from_euler def goal_pose(pose): goal_pose = MoveBaseGoal() goal_pose.target_pose.header.frame_id = 'map' goal_pose.target_pose.pose.position.x = pose[0][0] goal_pose.target_pose.pose.position.y = pose[0][1] q = quaternion_from_euler(0, 0, pose[1]) goal_pose.target_pose.pose.orientation.x = q[0] goal_pose.target_pose.pose.orientation.y = q[1] goal_pose.target_pose.pose.orientation.z = q[2] goal_pose.target_pose.pose.orientation.w = q[3] return goal_pose if __name__ == '__main__': rospy.init_node('multi_point_navigation') client = actionlib.SimpleActionClient('move_base', MoveBaseAction) client.wait_for_server() poses = [[[1.789, -2.45], 1.57], [[-1.789, 2.45], 0]] for pose in poses: goal = goal_pose(pose) client.send_goal(goal) client.wait_for_result() ``` 这段代码初始化了一个名为 `multi_point_navigation` 的ROS节点,并连接到 `move_base` 动作服务器。随后遍历预设的位置列表 `poses` 并向动作客户端提交每一个作为新的移动目标。当到达一个目标后才会继续前往下一个目标[^3]。 注意:在实际应用前需确保已正确配置好环境变量并启动了必要的ROS核心组件和服务,比如通过命令启动导航栈[^2]: ```bash roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值