在另一个类中使用对象(需要参数)及其方法

问题描述 投票:0回答:1

我正在尝试使用 BeagleBone Black 对全向机器人进行编程。我发现 BlackLib 库对于控制引脚非常有效,但我在将其集成到更大的方案中时遇到了一些麻烦。如果我简单地创建与引脚相关的对象并将它们设置为高或低(或介于两者之间),我就可以根据需要控制电机。但是当我尝试创建一个包含 BlackLib 对象的对象时,我遇到了困难。在我看来,解决此问题的一个好方法是创建一个包含 GPIO 和 PWM BlackLib 对象的电机对象。然后我可以创建一个函数来轻松设置功率和方向

rightMotor(50); //Should set the power to 50% in one direction

我已经完成了其中一些工作,但在访问我自己的 Motors 类中的 BlackLib 对象内的函数时遇到问题。

这是我现在正在使用的代码。

#include "BlackLib/BlackLib.h"

struct Motors
{
  BlackPWM* pwm;
  BlackGPIO* gpio;

  void drive(int power)
  {
    if(power >= 0)
    {
      gpio.setValue(low);
      //gpio.setValue(low); generates the error described below. I'm not familiar enough with the intricacies of pointers to know how to handle this
      //motors.cpp: In member function ‘void Motors::drive(int)’:
      //motors.cpp:15:10: error: request for member ‘setValue’ in ‘((Motors*)this)->Motors::gpio’, which is of non-class type ‘BlackGPIO*’
//      pwm.setDutyPercent(power);
    }
    else
    {
//      gpio.setValue(high);
//      pwm.setDutyPercent(100+power);
    }
  }
};

int main()
{
  struct Motors rightMotor;
  rightMotor.pwm = new BlackPWM(P9_16);
  rightMotor.gpio = new BlackGPIO(GPIO_49,output);

  //Give the BeagleBone a little time to create the objects
  usleep(10000);

  rightMotor.pwm.setPeriodTime(500000);
  //I will eventually need to set the period time but I'm not sure how. I'm guessing this is the incorrect syntax
  //Ideally, I would create a function so that I could simply write rightMotor.setPeriodTime(500000);

  rightMotor.drive(50);
  sleep(1);
  rightMotor.drive(0);
}

如果我完全错了,并且有更好的方法可以做到这一点,请告诉我。我的最终目标是能够轻松控制多个电机。最终我想创建函数和类,例如

robot.turn(30);

robot.forward(100);
c++ beagleboneblack robotics
1个回答
0
投票

从阿拉斯加大学费尔班克斯分校计算机科学教授那里得到以下解决方案。现在可以按预期工作了。

struct Motors
{
        BlackPWM pwm;
        BlackGPIO gpio;

        Motors(pwm_pin_name pwmPin,gpio_name gpioPin) //motor constructor parameters
                : pwm(pwmPin),gpio(gpioPin,output) //member initializer list
        {
                pwm.setPeriodTime(500000);
        }

        void drive(int power)
        {
                if(power >= 0)
                {
                        gpio.setValue(low);
                        pwm.setDutyPercent(power);
                }
                else
                {
                        gpio.setValue(high);
                        pwm.setDutyPercent(100+power);
                }
        }
};

int main()
{
        //User interface pins
        BlackGPIO button(GPIO_44,input);

        Motors rightMotor(P9_16,GPIO_49);

        while(!button.isHigh())
        {
                rightMotor.drive(0);
        }

        //The BeagleBone needs a little time to create the PWM object
        usleep(10000);

        rightMotor.drive(-50);

        sleep(1);

        rightMotor.drive(0);
}
© www.soinside.com 2019 - 2024. All rights reserved.