ROS下空环境中用激光雷达做跟随

#include<ros/ros.h>
#include<sensor_msgs/LaserScan.h>
#include<geometry_msgs/Twist.h>


float x_pillar;                 //机器人距离物体在X轴上的距离
float y_pillar;                 //机器人距离物体在Y轴上的记录
float alpha_pillar;             //机器人于物体之间的角度
float smallest_distance = 200;  //定义了一个接收激光雷达扫描的距离

geometry_msgs::Twist vel_msg_;
ros::Publisher pub;


void callback(const sensor_msgs::LaserScan::ConstPtr& scan)
{

    int arr_size = floor((scan->angle_max-scan->angle_min)/scan->angle_increment);
    //使用arr_size接收激光雷达扫描一次的激光点数((最大角度-最小角度)/单位角度 = 激光点的个数)

    for(int i=0;i< arr_size;i++)
    {    
        if(scan->ranges[i]<smallest_distance)
        {    
        smallest_distance = scan->ranges[i];
                //for语句来找到扫描一次后离机器人最近的直线距离的点
        alpha_pillar = (scan->angle_min + i*scan->angle_increment);
        //并计算出角弧度    
        }
    }
    
    x_pillar = smallest_distance*cos(alpha_pillar);
    y_pillar = smallest_distance*sin(alpha_pillar);
    //通过得到的直线距离点,再通过三角函数公式,算出物体在以机器人为原点的X轴和Y轴的偏移量
    
    ROS_INFO("Pillar offset angle(red):[%lf]",alpha_pillar);
    ROS_INFO("Pillar x diatance(m):[%lf]",x_pillar);
    ROS_INFO("Pillar y distance(m):[%lf]",y_pillar);
    //这里我们输出通过我们计算出来的角弧度和X和Y轴的距离
    
    float p_gain_vel = 1;
        float p_gain_ang = 0.4;
    //定义一个线速度和角速度的比值量

        if(x_pillar > 0.3) //当物体在车前时,算出来的x_pillar是大于零的
        {
            if (x_pillar > 5 )
             {     //当物体的距离大于5米时,直接用x和Y距离*速度比值
                 vel_msg_.linear.x = x_pillar * p_gain_vel  ;
                 vel_msg_.angular.z = -(y_pillar * p_gain_ang) ;
        
             }
            else
              {//减速递减
        if(x_pillar > 2 )
        {
         //当物体距离在2米到5米之间时,我们使线速度再*0.2使速度再小一点
                 vel_msg_.linear.x = x_pillar * p_gain_vel * 0.2 ;
                 vel_msg_.angular.z = -(y_pillar * p_gain_ang ) ;
        }
        else
        {
            if(x_pillar < 0.3)
            {     //当物体距离达到0.3米一下时我们让小车停止
                  vel_msg_.linear.x = 0;
                              vel_msg_.angular.z = 0;
            }
        }
 
              }
       }
       else
       {         //当物体距离达到0.3米一下时我们让小车停止
                 vel_msg_.linear.x = 0;
                 vel_msg_.angular.z = 0;
       }
       if(x_pillar < -0.3) //当物体在车子后面时,我们就可以先只给车子一个角速度让车子转过来
       {                   //这样物体又在车子前面了,这样就又执行上面的语句了
         vel_msg_.angular.z = -(y_pillar * p_gain_ang ) ;
       }
    //发布我们计算好的速度指令
        pub.publish(vel_msg_);
    //这条语句是在车子停了以后,当物体再次移动位置时,重新初始化最大距离
        //这样小车就可以继续跟随物体了
    smallest_distance=200;
    
}


int main(int argc,char** argv)
{
    //首先初始化和创建句柄
    ros::init(argc,argv,"HuskyHighlevelController");
    ros::NodeHandle n;

    //订阅机器人的激光雷达的信息
    ros::Subscriber sub = n.subscribe("/scan",1000,callback);
    //定义一个发布者,发布我们处理过激光后,转化成线速度和角速度的信息
    pub=n.advertise<geometry_msgs::Twist>("/husky_velocity_controller/cmd_vel",1000);

    ros::spin();

}

  • 0
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要更改husky功能包激光雷达,需要按照以下步骤进行操作: 1.了解husky功能包:首先,需要了解Husky功能包的结构和组成。Husky是一个常见的移动机器人平台,激光雷达是其必备的传感器之一,负责感知周围环境并生成地图。 2.选择适合的激光雷达:根据实际需求,选择适合的激光雷达。这可能涉及到激光雷达的规格、性能以及功能等因素。如果需要更高精度或更长距离的扫描能力,可以选择更先进的激光雷达。 3.更改硬件连接:将新的激光雷达与Husky机器人进行硬件连接。这通常需要连接传感器的电源线、数据线和地线等。确保连接正确并稳固。 4.配置驱动程序:根据新激光雷达的型号,选择或配置适当的驱动程序。驱动程序负责控制激光雷达的工作模式和参数设置。 5.更改参数配置:在Husky功能包,找到激光雷达的参数配置文件,并根据新激光雷达的规格和性能进行必要的修改。这包括激光雷达的扫描范围、旋转速度、分辨率等。 6.重新编译和运行:根据修改后的参数配置,重新编译Husky功能包,并将程序上传至机器人。通过启动机器人,验证激光雷达功能是否正常运行。 7.测试和调试:进行测试和调试,确保新激光雷达与Husky的配合正常。可以检查机器人生成的地图、避障功能以及传感器数据的准确性。 总之,更改Husky功能包激光雷达需要选择合适的硬件并进行相应的硬件连接和驱动程序配置。同时,还需要修改参数配置文件并测试调试,确保新激光雷达与Husky机器人的正常配合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值