ROS底盘简单人体跟随代码

本文介绍了一个基于ROS的机器人导航控制系统,通过订阅目标位置并调整线速度和角速度来实现对机器人的精确控制。系统使用了MoveBaseAction和Twist消息类型,通过PID控制器调整速度,确保机器人能够稳定地接近目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <ros/ros.h>
#include <move_base_msgs/MoveBaseAction.h>
#include <actionlib/client/simple_action_client.h>
#include <geometry_msgs/Twist.h>
#include <iostream>
#include <stdio.h>
#include"geometry_msgs/Point.h" //////!!!!!

using namespace std;

typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;
int x_aim=0;///////!!!!
int y_aim=0;///////!!!
int z_aim=0;///////!!!
/////


ros::Publisher pub;
geometry_msgs::Twist vel;


void chatterCallback(const geometry_msgs::Point::ConstPtr& msg)
{
   x_aim=(int)msg->x;
   y_aim=(int)msg->y;
   z_aim=(int)msg->z;

    vel.linear.x = 0;
    vel.linear.y = 0;
    vel.angular.z = 0;
 
   float P_vel = 1;
   float P_ang = 1;
    if(z_aim > 1000)
    {
        if(z_aim >1500)
        {
            vel.linear.x = 0.5 * P_vel;
            vel.angular.z = 0;
            if(x_aim > 100)
            {
                vel.angular.z = x_aim/100 * P_ang;
            }
            if(x_aim < -100)
            {
                vel.angular.z = x_aim/100 * P_ang;
            }
        }
        else
        {
            vel.linear.x = 0.3 * P_vel;
            vel.angular.z = 0;
            if(x_aim > 100)
            {
                vel.angular.z = x_aim/100 * P_ang;
            }
            if(x_aim < -100)
            {
                vel.angular.z = x_aim/100 * P_ang;
            }
            
        }
        if(z_aim<1000)
        {
            vel.linear.x = 0;
            vel.angular.z = 0;
            if(x_aim > 100)
            {
                vel.angular.z = x_aim/100 * P_ang;
            }
            if(x_aim < -100)
            {
                vel.angular.z = x_aim/100 * P_ang;
            }        
        }
    }
    else if(z_aim<600)
    {
        vel.linear.x = -0.3*P_vel;
        vel.angular.z = 0;        
    }

    //ROS_INFO("--------------------------------");
    //ROS_INFO("vel.linear.x:[%lf]",vel.linear.x);
    //ROS_INFO("vel.linear.y:[%lf]",vel.linear.y);
    //ROS_INFO("vel.angular.z:[%lf]",vel.angular.z);
    cout<<"-----------------------------------"<<endl;;
    cout<<"vel.linear.x:"<<vel.linear.x<<endl;
    cout<<"vel.linear.y:"<<vel.linear.y<<endl;
    cout<<"vel.angular.z:"<<vel.angular.z<<endl;

    pub.publish(vel);


 

   
}

//////


int main(int argc, char** argv){

  ros::init(argc, argv, "simple_navigation_goals");
  ros::NodeHandle n;///////!!!!!
  cout<<"follow start"<<endl;

  ros::Subscriber sub = n.subscribe("aim_pose",1000,chatterCallback);///////!!!!!
  pub = n.advertise<geometry_msgs::Twist>("cmd_vel",1000);
  usleep(50*1000);
  ros::spin();/////  

  return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值