码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Racecar 基于ROS通信机制的多点导航实验


    基于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
    #include 
    #include
    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    通信系统综合实验报告
    doc 0星 超过10%的资源 2.31MB
    下载

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

     #include
    #include 
    #include
    #include
    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 one
            goal_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 two
            goal_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 three
            goal_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将大于0
            if(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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    在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})
    
    • 1
    • 2
    • 3
    • 4

    在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"/>
    
    • 1
    • 2

    编译成功后:运行

    roslaunch nav_sim myrobot_world.launch
    roslaunch nav_sim move_base.launch
    
    • 1
    • 2

    六、实验数据与结果评价

    实验数据:

    • 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。

    上周的任务:

  • 相关阅读:
    TensorFlow搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
    驱动上下游高效协同,跨境B2B电商平台如何释放LED产业供应链核心价值
    K-Means(上):数据分析 | 数据挖掘 | 十大算法之一
    《安富莱嵌入式周报》第324期:单对以太网技术实战,IROS2023迪士尼逼真机器人展示,数百万模具CAD文件下载,闭环步进电机驱动器,CANopen全解析
    基础的C语言编程题,喊你快来巩固一下
    Redis - 10、主从复制
    Java-Day19 Java集合(集合框架、Collection接口、List接口及List接口实现类)
    LeetCode 热题 100(九):回溯复习。77. 组合、17. 电话号码的字母组合、39. 组合总和
    二叉搜索树之:【中序遍历一棵二叉搜索树】【给一棵有固定形态的二叉搜索树填值】【用BST中序遍历的性质填值】【之前讲过层序遍历】
    防火墙软件 iptables
  • 原文地址:https://blog.csdn.net/gezongbo/article/details/125361191
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号