Мне дали графический интерфейс, созданный с помощью 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, который отвечает за обновления?