• odom_out_and_back.cpp


    点击打开链接原文在这,搬运以便学习记录,感谢原作者

    <span style="font-family: Arial, Helvetica, sans-serif;">#include "ros/ros.h"  </span>
    #include "std_msgs/String.h"//geometry_msgs  
    #include "geometry_msgs/Twist.h"//包含elocity space消息  
    #include <tf/transform_listener.h>  
    #include "math.h"  
    #include <sstream>  
    #include <iostream>  
    #include <rbx1_nav/CalibrateAngularConfig.h>  
    #include <rbx1_nav/CalibrateLinearConfig.h>  
    using namespace std;  
      
      
    int main(int argc, char **argv)  
    {  
        ros::init(argc,argv,"out_and_back");//指定节点“out_and_back”  
        ros::NodeHandle n;//创造一个节点句柄  
        ros::Publisher cmd_vel_pub=n.advertise<geometry_msgs::Twist>("/cmd_vel",1000);//将在/cmd_vel话题上发布一个geometry_msgs::Twist消息  
        int rate=20;//定义更新频率  
        ros::Rate loop_rate(rate);//更新频率20Hz,它会追踪记录自上一次调用Rate::sleep()后时间的流逝,并休眠直到一个频率周期的时间  
      
        //初始化操作  
        double linear_speed=0.2;//向前的线速度0.2m/s  
        double goal_distance=1.0;//行进记录1.0m  
        double angular_speed=1.0;//角度素1.0rad/s  
        double goal_angle=M_PI;  
        double angular_tolerance = 0.5*M_PI/180;//角度容忍度  
        tf::TransformListener listener;  
      
        geometry_msgs::Twist move_cmd;//定义消息对象  
        move_cmd.linear.x=move_cmd.linear.y=move_cmd.linear.z=0;  
        move_cmd.angular.x=move_cmd.angular.y=move_cmd.angular.z=0;  
      
      
      
      
        tf::StampedTransform transform;  
        try{  
      
          listener.waitForTransform("odom", "base_link", ros::Time(0), ros::Duration(1.0));  
          listener.lookupTransform("odom", "base_link",  
                                   ros::Time(0), transform);  
        }  
        catch (tf::TransformException &ex) {  
          ROS_ERROR("%s",ex.what());  
          ros::Duration(1.0).sleep();  
        }  
      
        double x_start = transform.getOrigin().x();  
        double y_start = transform.getOrigin().y();  
        double angle_start = acos(transform.getRotation().z())*2;  
        double distance = 0.0;  
        double angle = 0.0;  
        cout<<"angle_start: "<<angle_start<<endl;  
      
        while(ros::ok())//等待键盘ctrl+C操作则停止  
        {  
      
            tf::StampedTransform transform_;  
            try{  
      
              listener.waitForTransform("odom", "base_link", ros::Time(0), ros::Duration(1.0));  
              listener.lookupTransform("odom", "base_link",  
                                       ros::Time(0), transform_);  
            }  
            catch (tf::TransformException &ex) {  
              ROS_ERROR("%s",ex.what());  
              ros::Duration(1.0).sleep();  
            }  
      
            move_cmd.linear.x = linear_speed;  
      
            if(distance < goal_distance){  
      
                cmd_vel_pub.publish(move_cmd);  
                loop_rate.sleep();  
      
                distance = sqrt(pow((transform_.getOrigin().x() - x_start),2)+pow((transform_.getOrigin().y() - y_start),2));  
                cout<<"distance: "<<distance<<endl;  
      
                cout<<"odom.x: "<<transform_.getOrigin().x()<<endl;  
                cout<<"odom.y: "<<transform_.getOrigin().y()<<endl;  
                }  
      
            else {  
      
                if(angle + angular_tolerance < goal_angle){  
      
      
                    move_cmd.linear.x=0.0;  
                    move_cmd.angular.z=angular_speed;  
                    cmd_vel_pub.publish(move_cmd);  
                    loop_rate.sleep();  
      
                    angle = abs(acos(transform_.getRotation().z())*2 - angle_start);  
                    cout<<"angle: "<<angle<<endl;  
                }  
      
                else{  
      
                    move_cmd.linear.x=0.0;  
                    move_cmd.angular.z=0.0;  
                    cmd_vel_pub.publish(move_cmd);  
                    loop_rate.sleep();  
                    cout<<"stop!"<<endl;  
                }  
      
      
                }  
      
        }  
      
    return 0;  
    }  

  • 相关阅读:
    embeding 是什么
    linux xlearn安装
    argmin ,argmax函数
    随机森林算法OOB_SCORE最佳特征选择
    Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softma
    Spring回调方法DisposableBean接口
    java中InvocationHandler 用于实现代理。
    Spring之FactoryBean
    weblogic 的安装和配置
    JBoss7 安装配置
  • 原文地址:https://www.cnblogs.com/siahekai/p/5840319.html
Copyright © 2020-2023  润新知