完成rviz自己goal的插件后,来写一个订阅和发布到action的节点

 

#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <nav_msgs/Odometry.h>
#include <move_base_msgs/MoveBaseAction.h>
#include <actionlib/client/simple_action_client.h>
#include <geometry_msgs/PoseWithCovarianceStamped.h>
#include <unistd.h>
#include <geometry_msgs/PoseStamped.h>
#include "signal.h"

double pose_x_;
double pose_y_;
double pose_z_;
double pose_w_;

int count = 0;

    geometry_msgs::Point point;
    geometry_msgs::Quaternion quaternion;
    std::vector<geometry_msgs::Pose> pose_list;

    

void callback(const geometry_msgs::PoseStamped::ConstPtr& msg)
{

    pose_x_ = msg->pose.position.x;
    pose_y_ = msg->pose.position.y;
    pose_z_ = msg->pose.orientation.z;
    pose_w_ = msg->pose.orientation.w;
    ROS_INFO("pose_x_ : [%f]",pose_x_);
    ROS_INFO("pose_y_ : [%f]",pose_y_);
    ROS_INFO("pose_z_ : [%f]",pose_z_);
    ROS_INFO("pose_w_ : [%f]",pose_w_);

 

  //设置我们要机器人走的几个点。

    geometry_msgs::Pose pose;

    point.x = pose_x_;
    point.y = pose_y_;
    point.z = 0.000;
    quaternion.x = 0.000;
    quaternion.y = 0.000;
    quaternion.z = pose_z_;
    quaternion.w = pose_w_;
    pose.position = point;
    pose.orientation = quaternion;
    pose_list.push_back(pose);

    count++;

}

bool flag = true;

void sigint(int signum){
    flag = false;
}

int main(int argc, char** argv)
{
    ros::init(argc, argv,"sub_action");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("goal",1000,callback);
    actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> ac("move_base",true);
    
    signal(3, sigint);
    while(ros::ok() && flag){
        ros::spinOnce();        
    }
    

    
while(ros::ok()){
  ROS_INFO("Waiting for move_base action server...");
  //等待60秒以使操作服务器可用
  if(!ac.waitForServer(ros::Duration(30)))
  {
    ROS_INFO("Can't connected to move base server");
 
  }
  ROS_INFO("Connected to move base server");
  ROS_INFO("Starting navigation test");

  //循环通过四个航点
for(int j=0; j < count ; j++)
 {
    //初始化航点目标
     move_base_msgs::MoveBaseGoal goal;

     //使用地图框定义目标姿势
     goal.target_pose.header.frame_id = "map";

     //将时间戳设置为“now”
     goal.target_pose.header.stamp = ros::Time::now();

     //将目标姿势设置为第i个航点
     goal.target_pose.pose = pose_list[j];

     //让机器人向目标移动
     //将目标姿势发送到MoveBaseAction服务器
     ac.sendGoal(goal);

    //等1分钟到达那里
    bool finished_within_time = ac.waitForResult();

    //如果我们没有及时赶到那里,就会中止目标
    if(!finished_within_time)
    {
        ac.cancelGoal();
        ROS_INFO("Timed out achieving goal");
    }
    else
    {
        //We made it!
        if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
        {
            ROS_INFO("Goal succeeded!");
        }
        else
        {
            ROS_INFO("The base failed for some reason");
        }
    }
 }

}

}

 

 

 

ROS (Robot Operating System) 中,RVIZ一个流行的可视化工具,用于实时展示机器人感知的信息,包括地图数据。如果你想在 RVIZ 的地图上用 Python 划分区域,并通过手动导航到每个区域时触发相应的事件(比如输出 A、B 或 C 区),可以按照以下步骤操作: 1. **创建地图标记**: 使用`geometry_msgs/PolygonStamped`或者其他适合描述区域的msg类型,在Python节点中定义各个区域的边界。 ```python from geometry_msgs.msg import PolygonStamped polygon_A = PolygonStamped() # 定义区域A的坐标点列表 points_A = [Point(x1, y1), Point(x2, y2), ...] polygon_A.polygon.points = points_A ``` 2. **发布RVIZ**: 发布这个`PolygonStamped`消息到 RVIZ 可以显示出来。通常这需要先创建一个`rviz_display`并订阅map topic,然后在这个display中添加`MarkerArray`插件,将`PolygonStamped`作为其中的一个marker显示。 ```python import rclpy from rclpy.node import Node from visualization_msgs.msg import MarkerArray, Marker class MapAreaNode(Node): def __init__(self): super().__init__('map_area_node') self.publisher_ = self.create_publisher(MarkerArray, '/visualization_marker', 10) timer_period = 0.5 # 更新频率 self.timer = self.create_timer(timer_period, self.publish_areas) def publish_areas(self): marker_array = MarkerArray() marker_array.markers.append(polygon_to_marker(polygon_A)) self.publisher_.publish(marker_array) def polygon_to_marker(polygon_msg): marker = Marker( type=Marker.LINE_LOOP, id=1, header=polygon_msg.header, action=Marker.ADD, pose=... # 设置位置和姿态, scale=..., # 设置大小, color=... # 设置颜色 ns="area_markers", name=polygon_msg.header.frame_id + "_area" ) marker.pose.position.x, marker.pose.position.y = polygon_msg.polygon.center return marker ``` 3. **监听用户交互**: 在 RVIZ 中,可以设置鼠标点击或键盘输入等交互方式来检测用户是否进入某个区域。例如,你可以编一个回调函数,当用户在特定区域内点击时,发送一个信号(如Topic或者Service)。 4. **处理导航**: 创建一个导航行为,比如 `move_base` 消费者,监听导航命令,当接收到“去区域A”这样的指令时,检查当前的位置是否在A区域,如果是,则输出"A",依此类推。 ```python class NavigationHandler(Node): def __init__(self): super().__init__("navigation_handler") self.subscription = self.create_subscription(..., ..., ...) def callback(self, msg): if msg.area == "A": self.get_logger().info("You are in area A.") ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值