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


    一、实验目的

    • 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

    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。

    上周的任务:

  • 相关阅读:
    详解设计模式:责任链模式
    Linux安装Tomcat并且设置开机自启动
    第三章-内存管理
    固定资产管理子系统报表分为什么大类,包括哪些科目
    Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第5章 Vue.js组件 5.5 Vue获取DOM元素的方法(ref)
    Cisco ASA、FTD和HyperFlex HX的漏洞分析复现
    如何选择合适的自动化测试工具?
    一份 Python 日志配置,同时适用于开发和生产环境
    Stream竟然还有应用进阶学习?作为程序员的你知道吗
    辣椒碱人血清白蛋白纳米粒Capsaicin-HRP-HSA|辣椒素卵清白蛋白纳米粒Vanillylnonanamide-OVA|齐岳
  • 原文地址:https://blog.csdn.net/gezongbo/article/details/125361191