Racecar 基于ROS通信机制的多点导航实验

article/2025/8/18 23:02:21

基于ROS通信机制的多点导航实验

  • 一、实验目的
  • 二、实验环境
  • 三、实验原理
  • 四、实验内容
  • 五、实验步骤
    • 1.获取rviz发送目标点的topic;
    • 2.对已经建好的图获取相应目标点的坐标(多个,即小车要去的目标),还没建图先完成建图;
    • 3.查阅资料,编写发布一目标点的python或c脚本;
    • 4.编写发布多个目标点的python或c脚本。
  • 六、实验数据与结果评价
    • 实验数据:
    • 结果评价:
      • 1.脚本能否发送目标点
      • 2.Turtlebot到达一个目标点后能否继续发送第二个目标点

一、实验目的

  • 1.进一步了解ROS通信机制;
  • 2.了解Turtlebot各个节点之间的关系;
  • 3.熟悉使用ROS消息类型;
  • 4.了解小车闭环控制。
  • 5.了解rviz是如何将目标点发送出去的。

二、实验环境

Ubuntu16.04+ROS 。

三、实验原理

发布者订阅者实现,发布者发出目标点,订阅者接受到后控制Turtlebo进行导航。

四、实验内容

  • 1.获取rviz发送目标点的topic;
  • 2.对已经建好的图获取相应目标点的坐标(多个,即小车要去的目标),还没建图先完成建图;
  • 3.查阅资料,编写发布一目标点的python或c脚本;
  • 4.编写发布多个目标点的python或c脚本。

五、实验步骤

1.获取rviz发送目标点的topic;

在这里插入图片描述

2.对已经建好的图获取相应目标点的坐标(多个,即小车要去的目标),还没建图先完成建图;

打开gazebo roslaunch nav_sim myrobot_world.launch
在这里插入图片描述
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
通过移动小车,设置目标点,记录左侧显示的位置坐标。x y z 和分别绕xyz轴旋转的角度:roll pitch yaw

3.查阅资料,编写发布一目标点的python或c脚本;

#include<iostream>
#include <ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<geometry_msgs/PoseStamped.h>
using namespace std;
int flag=1;
class Goal{
public:geometry_msgs::PoseStamped goal;Goal(){pub=n.advertise<geometry_msgs::PoseStamped>("/move_base_simple/goal",10);
sub=n.subscribe("/cmd_vel",1,&Goal::callback,this);goal.header.frame_id = "map";//改为自己记录目标点的坐标goal.pose.position.x = pose.x; goal.pose.position.y = pose.y;  goal.pose.position.z = pose.z;   goal.pose.orientation.x = pose._x;goal.pose.orientation.y = pose._y;goal.pose.orientation.z = pose._z;goal.pose.orientation.w = pose._w;   }
private:ros::NodeHandle n; ros::Publisher pub;ros::Subscriber sub;void callback(const geometry_msgs::Twist &v);
};
void Goal::callback(const geometry_msgs::Twist &v)
{ if(flag==1&&v.linear.x==0){ROS_INFO("Sending goal!");pub.publish(goal);}
}
int main(int argc,char **argv)
{ros::init(argc,argv,"send_goal");Goal g;ros::spin();return 0;
}

4.编写发布多个目标点的python或c脚本。

 #include<iostream>
#include <ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<geometry_msgs/PoseStamped.h>
using namespace std;
int flag=1;
int g1=0,g2=0,g3=0;
class Goal{
public:geometry_msgs::PoseStamped goal_1;geometry_msgs::PoseStamped goal_2;geometry_msgs::PoseStamped goal_3;Goal(){pub=n.advertise<geometry_msgs::PoseStamped>("/move_base_simple/goal",10);sub=n.subscribe("/cmd_vel",1,&Goal::callback,this);goal_1.header.frame_id = "map";goal_2.header.frame_id = "map";goal_3.header.frame_id = "map";//以下三个目标的改为自己目标点的信息
//Goal onegoal_1.pose.position.x = 0.033449; goal_1.pose.position.y = 8.273015;  goal_1.pose.position.z = 0.050003;   goal_1.pose.orientation.x = 0;goal_1.pose.orientation.y = 0;goal_1.pose.orientation.z = 0;goal_1.pose.orientation.w = 1.487145;   //Goal twogoal_2.pose.position.x = -0.207746;goal_2.pose.position.y = 17.607371;goal_2.pose.position.z = 0.050003;   goal_2.pose.orientation.x = 0;goal_2.pose.orientation.y = 0;goal_2.pose.orientation.z = 0;goal_2.pose.orientation.w = 1.483080;//Goal threegoal_3.pose.position.x = 2.467109;goal_3.pose.position.y = 9.938154;goal_3.pose.position.z = 0.050002;   goal_3.pose.orientation.x = 0;goal_3.pose.orientation.y = 0;goal_3.pose.orientation.z = 0;goal_3.pose.orientation.w = -1.889479;}
private:ros::NodeHandle n; ros::Publisher pub;ros::Subscriber sub;void callback(const geometry_msgs::Twist &v);
};void Goal::callback(const geometry_msgs::Twist &v){//发送第一个目标点,如果发送成功,v将大于0if(flag==1&&v.linear.x==0){ROS_INFO("Sending goal one!");pub.publish(goal_1);g1=1;}if(v.linear.x>0&&flag==1)flag=2;if(flag==2&&v.linear.x==0&&g1){ROS_INFO("Sending goal two!");pub.publish(goal_2);g2=1;}if(v.linear.x>0&&flag==2&&g2)flag=3;if(flag==3&&v.linear.x==0&&g2){ROS_INFO("Sending goal three!");pub.publish(goal_3);g3=1;}    }
int main(int argc,char **argv)
{ros::init(argc,argv,"many_goal");Goal g;ros::spin();return 0;
}

在CMakeLists.txt文件中添加

add_executable(send_goal src/send_goal.cpp)
target_link_libraries(send_goal ${catkin_LIBRARIES})
add_executable(many_goal src/many_goal.cpp)
target_link_libraries(many_goal ${catkin_LIBRARIES})

在move_base.launch文件中启动send_goal.cpp或many_goal.cpp
加入两行:

<!--node pkg="nav_sim" type="send_goal" respawn="false" name="send_goal" output="screen"/-->
<node pkg="nav_sim" type="many_goal" respawn="false" name="many_goal" output="screen"/>

编译成功后:运行

roslaunch nav_sim myrobot_world.launch
roslaunch nav_sim move_base.launch

六、实验数据与结果评价

实验数据:

  • 1.目标点数:3个
  • 2.目标点位置:
    one❌0.033449;y:8.273015;z:0.050003;_x:0;_y:0;_z:0;_w:1.487145;
    two❌-0.207764;y:17.607371;z:0.050003;_x:0;_y:0;_z:0;_w:1.483080;
    three❌2.467109;y:9.938154;z:0.050002;_x:0;_y:0;_z:0;_w:-1.889479;
  • 3.坐标系frame_id :map

结果评价:

1.脚本能否发送目标点

可以,但需要手动点2D Nav Goal
在这里插入图片描述

2.Turtlebot到达一个目标点后能否继续发送第二个目标点

可以
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:也可以不用Turtlebot,使用nav _sim包的小车或者racecar的minicar。


http://chatgpt.dhexx.cn/article/CBrLPlOn.shtml

相关文章

C语言的整数除法

c语言的整数除法是向下取整的。

C语言 从5~100之间找出能被5或7整除的数

从5~100之间找出能被5或7整除的数 算法分析&#xff1a;注意“或”的理解&#xff1a;或此或彼或彼此 #include "stdio.h" main( ) { int i;for(i5;i<100;i)if(i%50||i%70)printf("%d\t",i); }有伙伴问倒序输出&#xff1a; 在线编译C语言&#xff1a;…

C语言实现计算数字能否被3个数整除

C语言实现计算数字能否被3个数整除 编程实现&#xff1a;输入一个整数&#xff0c;判断它能否被3&#xff0c;5&#xff0c;7整除&#xff0c;并输出以下信息之一&#xff1a; ①能同时被3&#xff0c;5&#xff0c;7整除&#xff1b; ②能被其中两数(要指出哪两个)整除&#x…

C语言-求能被7或11整除的整数

本关任务&#xff1a;编写程序求[1&#xff0c;1000]范围内能被7或11整除&#xff0c;但不能同时被7和11整除的整数。按每行8个数&#xff0c;每个数占5个字符且以左对齐的格式进行输出。 #include<stdio.h> int main() {int i1;int count0;for(i1;i<1000;i){if((i%7…

c语言学习-判断一个数是否能被3整除

判断一个数是否能被3整除 在主函数中输入整型数据n,判断该数是否能被3整除&#xff0c;如果能被3 整除&#xff0c;输出“yes”,否则输出“no” 程序流程图&#xff1a; void main() { int a; printf("please enteraguess number:\n"); scanf("%d",&…

C语言--编写程序,输入一个整数,判断它能否被3,5,7整除

编写程序&#xff0c;输入一个整数&#xff0c;判断它能否被3,5,7整除&#xff0c;并输出下列信息之一&#xff1a; 能同时被3,5,7整除&#xff1b;能被x和y两个数整除&#xff1b;能被x整除&#xff1b;不能被3,5,7任一个数整除。 #include <stdio.h> void main() { in…

【C语言】数据整除判断

题目&#xff1a;C语言编程实现——输入一个整数&#xff0c;判断它能否被 3&#xff0c;5&#xff0c;7 整除&#xff0c;并输出以下信息之一&#xff1a; ①能同时被 3&#xff0c;5&#xff0c;7 整除&#xff1b; ②能被其中两数&#xff08;要指出哪两个&#xff09;整除…

C语言—整除问题、求余、赋值、逻辑运算符易错点

前言 &#x1f428;这一篇主要是讲那些老师可能不会讲&#xff0c;但是很多初学者都容易踩坑的地方 &#x1f914; 根据自己踩过的的坑整理了一下&#x1f927; 文章目录 前言一、整除问题1️⃣第一种情况&#xff1a;整数相除&#xff0c;抹去小数位2️⃣第二种情况&#xff…

东南大学本 硕 博论文中期答辩 毕业答辩ppt模板2021版

东南大学本硕博开题、中期、毕业论文答辩ppt模板 ppt模板样式如下&#xff1a; 如果对您有用 &#xff0c;欢迎点赞&#xff0c;关注和收藏&#xff0c;谢谢各位路官。 下载地址 https://download.csdn.net/download/Vertira/19026191

计算机硕士系统毕业论文答辩ppt,计算机硕士论文答辩ppt

为毕业生写计算机硕士论文答辩ppt提供计算机硕士论文答辩ppt范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文,包括论文选题、开题报告、文献综述、任务书、参考文献等,是优秀免费计算机硕士论文答辩ppt网站。 费孝通的博士论文答辩“花天酒地” 费孝通的博士论文答辩…

毕业生必看:硕士答辩注意事项!

通过本次硕士答辩感触最深的就是能从中学习到很多东西&#xff0c;而最主要的就是专家在审查论文的时候会有哪些点&#xff1f;在提问的过程中会提到什么问题&#xff1f;还有就是各位师弟师妹们在陈述自己论文的时候要结合自己PPT重点的引导专家看论文等等&#xff0c;具体本次…

热搜!硕士答辩看到一篇非常惊喜的论文,网友直呼:求导师分享全文

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 本文整理自微博、中国青年报&#xff08;ID&#xff1a;zqbcyol &#xff09;、澎湃新闻、中国知网 近日&#xff0c;#硕士答辩看到一篇非常惊喜的论文#词条登上微博热搜&…

Git远程仓库—Github

一、创建远程仓库 以下操作为演示在Github网站上创建远程仓库 1.登陆注册Github2.创建仓库入口 3.编辑仓库信息 4.仓库创建完成 5.查看仓库地址 远程仓库地址 https://github.com/qruihua/info.git 二、配置SSH 选择SSH操作 如果某台电脑需要与Github上的仓库交互&#xff0c…

Git远程仓库与分支管理

文章目录 Git远程仓库什么是远程仓库什么是GitHub环境搭建添加远程库从远程库克隆 Git分支管理创建与合并分支解决冲突分支管理策略Bug分支Feature分支多人协作Rebase Git远程仓库 什么是远程仓库 远程仓库就是 在公网服务器上的仓库。 Git离线提交的原理就是&#xff1a;修改…

【Linux】使用git 连接到远程gitee仓库

一.创建gitee仓库 登陆到自己的gitee&#xff0c;点击新建仓库 输入仓库名称&#xff0c;注意gitee初次创建仓库时只能设置成私有的 创建后的页面是这样的&#xff0c;复制HTTPS 二.git三板斧 1.安装git 打开xshell&#xff0c;输入命令&#xff1a; yum install git 可以输入…

Git本地远程仓库的搭建(局域网内的提交和推送)

需要和同事一起开发一个Unity项目&#xff0c;所以要用到git&#xff0c;这东西以前都是公司的主程搭建好的&#xff0c;现在需要自己弄&#xff0c;虽然很简单的东西&#xff0c;但是也搞了好久。 之前就搭建过一次局域网git&#xff0c;当时就花了2天时间&#xff0c;现在要…

git远程仓库使用流程

git远程仓库使用流程 远程仓库使用流程远程仓库介绍远程仓库使用流程如何将本地文件夹关联远程仓库 多人开发配置流程远程仓库SSH配置远程仓库使用流程总结git分支使用流程分支介绍1.2-分支使用流程 远程仓库使用流程 Git命名作用详细描述git clone克隆远程仓库代码把服务器的…

Git远程仓库配置SSH(以github为例)

1. 设置本地git账户邮箱和用户名 输入命令git config --global user.name "Git账号"以及git config --global user.email "Git邮箱"。 输入命令git config --global --list&#xff0c;查看配置是否正确。 2. 生成新的SSH密钥 输入命令ssh-keygen -t…

Git远程仓库基本配置

当我们在本地创建了Git仓库&#xff0c;我们如何和github仓库远程同步呢&#xff1f; 1、首先需要在github中创建一个仓库 1.1、填写仓库信息 2、完成创建后就可以将本地的git仓库和github上的仓库关联了 #注意&#xff1a;这里的地址要改成自己的地址 $ git remote add ori…

Git_GitHub_远程仓库

https://www.yiibai.com/git 一、在GitHub上创建一个远程仓库 二、两种方式上传项目到 GitHub Github支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用&#xff0c;但是每次提交代码和下载代码时都需要输入用户名和密码。如果使用ssh方式就…