Чтение переменной из приложения, созданного QT Creator, и публикация его в ROS - PullRequest
0 голосов
/ 26 июня 2019

Мне дали графический интерфейс, созданный с помощью QT Creator, который считывает и обновляет крутящие моменты от четвероногого робота.Однако мне нужно иметь возможность публиковать эту переменную крутящего момента в ros через издателя, чтобы ее можно было использовать в контроллере.

Я новичок в ROS, QT и C ++.

Я пытался посмотреть на ros_qt, но не уверен, сработает ли это для моего кода.

main.cpp

#include "mainwindow.hh
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

mainwindow.hh

#include "ServoTable.hh"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

protected:
  void timerEvent(QTimerEvent *event) override;
.....

(Здесь я вижу значение крутящего момента, которое я хочу опубликовать (изображение прилагается)

ServoTable.hh

#include <QAbstractTableModel>
#include "dogbot/Servo.hh"
class ServoTable
  : public QAbstractTableModel
{
QVariant data(const QModelIndex &index, int role) const override;
....

private slots:
  //! Queue an update for a row
void queueDataUpdate();
...
};

ServoTable.cc

#include "ServoTable.hh"

....

QVariant ServoTable::data(const QModelIndex &index, int role) 
const
{
  auto it = m_row2joint.find(index.row());
  if(it == m_row2joint.end()) {
  return QVariant(); // Doesn't seem to exist.
 }
 const DogBotN::JointC *joint = it->second;
 const DogBotN::ServoC *servo = dynamic_cast<const DogBotN::ServoC *>(joint);

 if (role == Qt::DisplayRole) {
 switch(index.column())
 {
    case ColumnTorque: {
      QString numStr;
      numStr.setNum(joint->Torque(),'f',2);
      return numStr;
    }
  }
  return QVariant();
}

функция: Torque () определена в другом файле

float Torque() const
{ return m_torque; }

в основном возвращает приватную переменную из другого класса

Мой попытался издатель:

#include "GUI/Servo.hh"
#include "std_msgs/String.h"

#include <ros/ros.h>
#include <sstream>


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

  ros::init(argc, argv, "talker");
  ros::NodeHandle n;

  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg;

    std::stringstream ss;
    ss << DogBotN::JointC::Torque() << count;
    msg.data = ss.str();

    ROS_INFO("%s", msg.data.c_str());

    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
  }


  return 0;
}

Ошибка Iполучаем, что DogBotN :: JointC :: Torque () не может быть вызван без объекта. Разве я не могу просто прочитать его из потока GUI, который отвечает за обновления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...