ROS通过程序设定起始点和目标点

【python+ROS+路径规划】三、获取初始位置和目标点位置 将rivz中地图点的坐标映射到栅格地图中 阅读详情

ROS通过程序设定起始点和目标点

C++

头文件

#ifndef GOAL_PUB_H
#define GOAL_PUB_H

#include <ros/ros.h>  
#include <move_base_msgs/MoveBaseAction.h>  
#include <actionlib/client/simple_action_client.h>  
#include "geometry_msgs/PoseWithCovarianceStamped.h"     
#include "std_msgs/String.h"

#define GOHOME "HOME"
#define GODRAMING "DRAMING"

typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;
 class goal_pub
 {
     public:
         typedef struct _POSE
         {     
             double X;
             double Y;
             double Z;
             double th_x;
             double th_y;
             double th_z;
             double th_w;

         } POSE;
         MoveBaseClient* ac_;
         void setHome( ros::Publisher pub,POSE pose);
         void setGoal(POSE pose);

     private:
         tf::StampedTransform world_pose;
         tf::TransformListener listener_;
 };

#endif

源文件

#include "goal_pub.h"
using namespace std;

bool Callback_flag = false;
string msg_str = "";

goal_pub::POSE HOME = {0, 0, 0,  0, 0, 0, 0};
goal_pub::POSE pose1 = {1.484616458416 , 0.0, 0.0,  0.0, 0.0, 0, 0.0};
goal_pub::POSE pose2 = {2.15833854675  , 0.0, 0.0,  0.0, 0.0, 0, 0.0};

//设置起始点
void goal_pub::setHome( ros::Publisher pub,POSE pose)
{
    geometry_msgs::PoseWithCovarianceStamped msg_poseinit;
    msg_poseinit.header.frame_id = "map";
    msg_poseinit.header.stamp = ros::Time::now();
    msg_poseinit.pose.pose.position.x = pose.X;
    msg_poseinit.pose.pose.position.y = pose.Y;
    msg_poseinit.pose.pose.position.z = pose.Z;

    double roll,pitch,yaw;
    roll=pose.th_x;
    pitch=pose.th_y;
    yaw=pose.th_z;

    //欧拉角转四元数
    geometry_msgs::Quaternion q;
    q=tf::createQuaternionMsgFromRollPitchYaw(roll,pitch,yaw);  

    msg_poseinit.pose.pose.orientation.x = q.x;
    msg_poseinit.pose.pose.orientation.y = q.y;
    msg_poseinit.pose.pose.orientation.z = q.z;
    msg_poseinit.pose.pose.orientation.w = q.w;
//   <br>  /×因为ros话题原理本身的问题,Setting pose 需要按照以下发送×/<br>

    pub.publish(msg_poseinit);
    ros::Duration(1.0).sleep();
    pub.publish(msg_poseinit);
    ros::Duration(1.0).sleep();
    pub.publish(msg_poseinit);
    ros::Duration(1.0).sleep();
	
}

//设置目标点
void goal_pub::setGoal(POSE pose)
{
     //tell the action client that we want to spin a thread by default 
    MoveBaseClient ac("move_base", true); 
       
    //wait for the action server to come up 
    while(!ac.waitForServer(ros::Duration(5.0)))
    { 
        ROS_WARN("Waiting for the move_base action server to come up"); 
    } 
    move_base_msgs::MoveBaseGoal goal; 
  
    double roll,pitch,yaw;
    roll=pose.th_x;
    pitch=pose.th_y;
    yaw=pose.th_z;

    //欧拉角转四元数
    geometry_msgs::Quaternion q;
    q=tf::createQuaternionMsgFromRollPitchYaw(roll,pitch,yaw);  
    
    //we'll send a goal to the robot to move 1 meter forward 
    goal.target_pose.header.frame_id = "map"; 
    goal.target_pose.header.stamp = ros::Time::now(); 
 
    goal.target_pose.pose.position.x = pose.X;
    goal.target_pose.pose.position.y = pose.Y; 
    goal.target_pose.pose.position.z = pose.Z; 
    goal.target_pose.pose.orientation.x = q.x;
    goal.target_pose.pose.orientation.y = q.y;
    goal.target_pose.pose.orientation.z = q.z;
    goal.target_pose.pose.orientation.w = q.w;  
     
    ROS_INFO("Sending goal"); 
    ac.sendGoal(goal); 
    ac.waitForResult(); 
    if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED) 
      ROS_INFO("it is successful"); 
     else 
       ROS_ERROR("The base failed  move to goal!!!");  
}

void poseCallback(const std_msgs::String::ConstPtr &msg)
{
     ROS_INFO_STREAM("Topic is Subscriber ");
     std::cout<<"get topic text: " << msg->data << std::endl;
     Callback_flag = true;
     msg_str = msg->data;
}   

int main (int argc, char **argv)
{
ros::init(argc, argv, "base_pose_control"); 
ros::NodeHandle nh;
//发布位姿估计消息,设定起始点
ros::Publisher pub_initialpose = nh.advertise<geometry_msgs::PoseWithCovarianceStamped>("/initialpose", 10);
ros::Subscriber sub = nh.subscribe("/base/pose_topic",10,poseCallback); 
goal_pub goal;

ros::Rate rate_loop(10);
goal.setHome(pub_initialpose,HOME);

while(ros::ok())
  {
      if(Callback_flag == true)
      {
        Callback_flag = false;
        if(msg_str == GOHOME)
        {
             msg_str = "";
             goal.setGoal(pose1);
        }
        else  if(msg_str == GODRAMING)
        {
             msg_str = "";
             goal.setGoal(pose2);
        }
        else
        {
        }
      }
      ros::spinOnce();
     rate_loop.sleep();
  }
  return 0;
}

Python


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
import actionlib
from actionlib_msgs.msg import *
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from nav_msgs.msg import Path
from geometry_msgs.msg import PoseWithCovarianceStamped
from tf_conversions import transformations
from math import pi
import time

class Goal:
    arrived=0
    def __init__(self):
        rospy.loginfo('wait move_base server ......')
        self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)#wait move_base server
        self.move_base.wait_for_server(rospy.Duration(60))
        rospy.loginfo('move_base server actived !')
        self.set_pose_pub = rospy.Publisher('/initialpose', PoseWithCovarianceStamped, queue_size=5)
        self.pub_cancel = rospy.Publisher("move_base/cancel",GoalID,queue_size=5)

    def set_pose(self, p):
        if self.move_base is None:
            return False
        x, y, th = p
        pose = PoseWithCovarianceStamped()
        pose.header.stamp = rospy.Time.now()
        pose.header.frame_id = 'map'
        pose.pose.pose.position.x = x
        pose.pose.pose.position.y = y
        q = transformations.quaternion_from_euler(0.0, 0.0, th/180.0*pi)
        pose.pose.pose.orientation.x = q[0]
        pose.pose.pose.orientation.y = q[1]
        pose.pose.pose.orientation.z = q[2]
        pose.pose.pose.orientation.w = q[3]
        self.set_pose_pub.publish(pose)
        print('set home success')
        return True

    def goto(self, p):
        goal = MoveBaseGoal()
        goal.target_pose.header.frame_id = 'map'
        goal.target_pose.header.stamp = rospy.Time.now()
        goal.target_pose.pose.position.x = p[0]
        goal.target_pose.pose.position.y = p[1]
        q = transformations.quaternion_from_euler(0.0, 0.0, p[2]/180.0*pi)
        goal.target_pose.pose.orientation.x = q[0]
        goal.target_pose.pose.orientation.y = q[1]
        goal.target_pose.pose.orientation.z = q[2]
        goal.target_pose.pose.orientation.w = q[3]
        self.move_base.send_goal(goal, self._done_cb, self._active_cb, self._feedback_cb)
        while not rospy.is_shutdown():
            # print self.move_base.get_state()
            if self.arrived == 1:
                self.arrived=0
                break
            time.sleep(0.5)
        return True
    
    def cancel_goal(self):
        data = GoalID()
        for i in range(0,2):
            self.pub_cancel.publish(data)
            time.sleep(0.5)
            
    def cancel(self):
        self.move_base.cancel_all_goals()
        return True

    def _done_cb(self, status, result):
        # print (result)
        if status==2: 
            self.arrived=1
            rospy.loginfo('target canceled !!')
        if status==3: 
            self.arrived=1
            rospy.loginfo('target arrived !')
            
    def _active_cb(self):
        rospy.loginfo("target received ")

    def _feedback_cb(self, feedback):
        rospy.loginfo("[Navi] navigation feedback\r\n%s"%feedback)
        

ROS-使用命令发布导航目标点(publish point) 手动发布rviz中的publish point 我在利用move—base跑仿真时,是使用的rviz中的publish point按钮,在加载的地图上点一系列的目标点,让仿真车辆按照我点的轨迹去跑;在实车的情况下,如果每一次都靠手动去在rviz中创建目标点的话,我感觉实车的运行轨迹不够精确,所以想创建文件或者是在终端使用命令去发送这些点来代替手动在rviz中的创建的点。 思路方法 方法一: 因为实车搭载了Gps,首先想到的就是先使用遥控让车辆跑一下路线,记录下gps的信息,让实车回到开始位置,将gps信号转 阅读详情

相关推荐

ROS中使用A星算法进行路径规划

ROS中使用A星算法进行路径规划前言python编写A星算法描述具体实现ROS结合A星算法描述具体实现实现结果 前言 由于本人这学期修了一门《智能工程》的课程,课程的大作业要求大家自主编写机器人导航程序,包括:路径规划、轨迹规划、控制器、机器人建模等相关程序,因此特在此写下一篇博客,记录开发过程。 这是第一篇博客,用于记录如何将自己编写的A星算法用于ROS中。 python编写A星算法 描述 先声...

a819096127的博客 1万+

ROS:通过world文件对map以及机器人初始位置进行配置

ROS:通过world文件对map以及机器人初始位置进行配置world文件中的map配置world文件中的机器人初始位置配置yaml中的map配置 参考: link. 本文主要对其中的地图和机器人配置部分进行更详细的说明。 world文件中的map配置 world文件中的机器人初始位置配置 yaml中的map配置 下面展示一些 内联代码片。 image: willow-full-0.05.pgm ...

weixin_44978098的博客 3708

ROS: Hello ROS程序

作为学习一门新语言的套路,我们首先要学习的是最简单的hello world程序。

buaazyp的博客 755

ROS机器人直行1米,接着旋转180°,再返回到起始点。之二

ROS机器人直行1米,接着旋转180°,再返回到起始点。

haorenhaoren123的专栏 5949

ROS介绍以及常用指令

ROS 1.什么是ros ROS 的雏形诞生: 斯坦福大学人工智能实验室的STAIR 机器人项目这个项目希望完成一个服务机器人原型,在视觉的辅助下,可以在复杂环境中运动,还可以通过机械臂操控环境中的物体。 STAIR 机器人配备了一个运动底盘,一个小型机械臂,立体摄像头、激光雷达。 摩根·奎格利(Morgan Quigley)在开发中意识到,各种功能集成在一个机器人上非常不容易,因此那时他就考虑并采用了“分布式”的方式来连接不同的模块。并将这一概念成功应用到机器人软件系统中,取名为Switchyard。 R

weixin_47397805的博客 3989

ROS智能车自主导航仿真(melodic)

智能车自主导航仿真 一、准备工作 新建一个工作空间: 此时工作空间是空的,但是可以进行编译: 编译后的工作空间: 注册: 下载源码包: cd ~/car_ws/src git clone https://github.com/xmy0916/racecar.git 下载成功: 下载相应的插件: sudo apt-get install ros-melodic-driver-base sudo apt-get install ros-melodic-gazebo-ros-control sudo

weixin_43709601的博客 1万+

ROS STAGE 设置机器人坐标系

因为想要使实体和仿真结合起来我一直想改动机器人自身坐标系的位置: 1. 首先机器人文件中可以添加传感器,我们可以设置传感器位于机器人本身的位姿。例如:laser(pose [ -0.1 0.0 -0.11 0.10 ]) 2. 但是我想更改base_link坐标系的时候并没有找到如何更改,显然是没有的 很显然base_link坐标系就不是我想要的,我想此坐标系位于小车的正中心。 bas...

qq_25368751的博客 1085

ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理

本文主要介绍ROS导航包Navigation中的 Movebase节点中的路径规划的相关流程,并对其进行梳理概括,同时本文也是《ROS局部路径规划器插件teb_local_planner规划流程概括总结》部分的前述文章。

慕羽★的博客 5026

ROS机器人直行1米,接着旋转180°,再返回到起始点。之一

ROS 使机器人直行1米,接着旋转180°,再返回到起始点。

haorenhaoren123的专栏 4689

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。通过使用`wx很抱歉,Markdown格式在当前聊天界面无法显示。我将为您提供纯文本格式的博客内容,您可以将其复制到Markdown编辑器中进行格式化。PDF转换工具本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。该工具使用了wxPython和PyMuPDF库。功能该PDF转换工具具有以下功能:1. 选择PDF文件:通过点击“选择文件”按钮,用户可以选择要转换的PDF文件。

Winfredzhang的博客 2735

小爱音箱Play增强版刷机接入大模型:自定义唤醒词与远程控制全攻略

智能音箱作为家庭语音入口,受限于厂商预设技能,难以满足个性化需求。通过串口刷机与Linux系统分区改造,可以完全掌控设备底层,将豆包、通义千问等大模型API接入原有音频链路,实现真正智能的语音问答。自定义唤醒词打破了“小爱同学”的唯一唤醒方式,结合ESP32-S3外挂模块,还能优化远场拾音。更深入的应用在于将音箱打造为家庭中控,通过大模型工具调用解析自然语言指令,实现远程控制电脑、智能灯等设备。本文从设备选型、拆机串口、系统备份到语音链路搭建,完整梳理了小爱音箱Play增强版的改造路径,适合具备动手能力的开

weixin_30036289的博客 717

ROS2导航SLAM建图探索

大家好,我是昨晚熬夜太多脑壳痛的小鱼。今天带大家一起探索一些ROS2+turtlebot3的slam建图。 第一步就是要有一个ROS2的环境,这个没有的请打开小鱼的fishros网站,选择一行代码安装ROS2进行安装。 安装 sudo apt install ros-foxy-turtlebot3* 安装 mkdir -p ros2slam/src && cd ros2slam/src/ git clone https://github.com/ROBOTIS-GIT/turtlebot

生活不止眼前的苟且 1万+

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

如何编写ROS程序

1.创建工作区 $ mkdir -p ~/catkin_ws/src ///-p表示递归创建目录 $ cd ~/catkin_ws/ $ catkin_make $ source devel/setup.bash $ echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/kinetic/share 你可以用任何你喜欢的名字命名你的工作区 2.创建package 创建一个新ROS功能包的命令应该在你工作区中的src目录下运行 创

yang1fei2的博客 1477

从零构建AI智能体:基于opencode框架的Agent开发全流程指南

AI智能体(AI Agent)作为人工智能领域的重要发展方向,正从概念走向工程实践。其核心原理在于赋予AI自主规划、执行和迭代的能力,使其不再局限于简单的问答,而是能够理解复杂目标、分解任务、调用工具并完成闭环。这一技术价值在于将AI从“对话伙伴”升级为“执行伙伴”,极大地拓展了自动化边界,在智能客服、数据分析、自动化运维等场景展现出巨大潜力。本文聚焦于如何利用opencode这一热门开发框架,快速构建具备实际能力的智能体。通过拆解其核心组件如技能库、规划器与运行时,并结合具体实践案例,系统阐述了从环境搭建

weixin_29055699的博客 434

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 826

ROS入门第一个程序-Hello, World!

这里写自定义目录标题1、ROS安装2、创建工作区3. 编写代码4. 编译hello程序5. 编译工作区6.设置环境变量setup.bash7. 执行hello程序 1、ROS安装 (1)参考网站(点击此处)安装ros. (2)测试ros是否成功安装的方法:成功运行小乌龟程序,成功即可! Ctrl+Alt+T三次,打开三个终端,分别在三个终端命令行输入: roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key 其中

选好坑 挖好坑 才会结出好的果子 2222

客服转人工率直降60%!OpenClaw深度集成NLP引擎,打造企业级对话自动化智能客服系统

本文介绍了一套基于OpenClaw智能体框架和NLP大模型引擎的智能客服系统解决方案。该系统通过深度集成NLP引擎实现精准语义理解,采用分层架构设计支持多渠道接入和业务系统对接,显著提升了客服效率。核心亮点包括:92%的重复问题自动解决率,60%的转人工率下降,40%的人力成本降低,以及从30秒压缩至0.5秒的平均响应时长。文章详细阐述了技术选型、系统架构设计、核心模块实现等关键环节,展示了如何通过智能对话系统破解传统客服业务中的人力资源与服务质量矛盾。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 361

ROS小车设置一系列导航点,使其沿着规划路径直线行驶

ROS系统内置了许多建图以及导航节点,在导航时我们通过拖拽箭头的方式实现目的地的设置,那么能不能通过程序写入一系列导航点,让小车依次沿着这些点前行呢?

qq_49164258的博客 1万+

华为od机试|华为od机试真题2025|华为od题库|华为od机考|2025C卷B卷

华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|B卷C卷

u014481728的博客 10万+

【推荐100个unity插件之8】实现多人在线联机游戏——Mirror插件的使用介绍(附项目源码)

基于Mirror的Unity多人游戏开发指南 本文介绍了使用Mirror插件开发Unity多人游戏的基本流程。Mirror是Unity的高级网络API,替代了已废弃的UNet系统。文章详细讲解了如何导入Mirror插件,创建NetworkManager网络管理器,处理常见错误,以及创建玩家角色和出生点。 主要内容包括: 创建场景NetworkManager并配置必要组件 为玩家添加NetworkIdentity和NetworkTransform组件 设置玩家初始生成位置和生成方式 常见错误及解决方法 通过M

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

ROS学习入门之一(第一个ROS小程序)

1、ROS安装 参考 https://www.linuxidc.com/Linux/2017-08/146030.htm 测试方法:小乌龟程序运行成功 分别在三个命令窗口输入 roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_ke 2、创建工作区 首先第一步, 你要创建一个工作区,我们全部创建的包,都应该放到这个工作区中。你可以取一个你喜欢的名字作为你工作区的名称 例如,我所创建的工作区叫test,那么你就在你的工

波波诸葛伟 267

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

第一个hello ros程序

1  设置环境变量       在用户权限下输入以下命令               每次启动一个新的shell,且要在这个shell中运行ROS时,只要运行上述source命令,ROS就能顺利工作。       但是切换用户或者新建一个shell时,且要继续运行ros时,需要多次输入source命令,过于重复       为了解决上述弊端,为每个用户的.bashrc文件添加上述指令 ...

guosuling的博客 2017

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ros用Python程序控制moveit机器人运动-正向运动学(一)

ros用Python程序控制moveit机器人运动-运动学(一) 笔者工作环境: ros-kinetic universal_robot功能包 1.创建好工作空间和已经将universal_robot功能包拷贝到src文件夹下 创建工作空间和拷贝universal_robot功能包不在赘述,参考我其他的博文。 ros-新建ros工作空间与环境变量配置 ros+ur机械臂+robotiq ft300+onrobot rg2+gazebo+rviz联合仿真 这里将universal_robot功能包的地址放在这

求知小鸟 7841

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ROS2 Python在rviz2中实时显示轨迹和点

ROS2提供了强大的rviz2工具,之前绘制轨迹使用过python中的matplotlib,还有Qt C++中的qwtplot3d,但是由于水平有限,效果都不尽人意。这段三维动态显示的代码本质上与前一个代码相同,就是在匀速圆周运动的同时,在z轴上有一个速度,整体就是一个螺旋上升的效果,运动轨迹酷似一个弹簧。θ角(th)是从0开始由Δθ角不断累加得到的,任意时刻运动质点的速度向量就相当于将初始时刻的运动矢量逆时针旋转了θ角(th)。另一个节点的运行方式相同,在rviz2中的配置与第一个节点完全一致。

m0_73885374的博客 3296
上一篇: ROS中欧拉角和四元数转换
下一篇: 建立一个python的ROS功能包
MUCH_WAY
博客等级 码龄8年 25粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值