ros遥控小车运行

1、 roscore

2、 sudo chmod a+rw /dev/ttyACM0

3、 rosrun rosserial_python serial_node.py /dev/ttyACM0

4、 rosrun turtlesim turtle_teleop_key

 

代码:::

#include <ros.h>
#include <Servo.h>
#include <geometry_msgs/Twist.h>


//定义五中运动状态
#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4
//定义需要用到的引脚
int leftMotor1 = 4;
int leftMotor2 = 5;
int rightMotor1 = 6;
int rightMotor2 = 7;


//x轴方向的速度
double lin_vel = 0.0;
//y轴方向的速度
double ang_vel = 0.0;
//定义接受的键
int cmd_ctrl = 0;


//注册ROS节点
ros::NodeHandle nh;


//回调函数
void messageCb(const geometry_msgs::Twist& vel) {
  lin_vel = vel.linear.x;
  ang_vel = vel.angular.z;
  cmd_ctrl = 1 * lin_vel + 3 * ang_vel;
  }
//设置订阅的消息类型和发布的主题
ros::Subscriber<geometry_msgs::Twist> sub("/turtle1/cmd_vel", messageCb);


void setup() {
  // put your setup code here, to run once:
  //设置控制电机的引脚为输出状态
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);


  nh.initNode();
  nh.subscribe(sub);
}


void loop() {
  // put your main code here, to run repeatedly:
  nh.spinOnce();


  switch(cmd_ctrl)
  {
      case 2:
        motorRun(FORWARD);  
        delay(1000);
        break;
       case -2:
         motorRun(BACKWARD);    
         delay(1000);
         break;
       case 6:
         motorRun(TURNLEFT);     
         delay(1000);
         break;
       case -6:
         motorRun(TURNRIGHT);    
         delay(1000);
         break;
      default:
        motorRun(STOP);       
        break;
    }


    cmd_ctrl = STOP;
}
//运动控制函数
void motorRun(int cmd)
{
      switch(cmd) {
      case  FORWARD:
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, HIGH);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
        break;
      case BACKWARD:
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     case TURNLEFT:
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2,  HIGH);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     case TURNRIGHT:
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
      break;
     default:
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);
  }
}



版权声明:本文为qq_41931519原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。