سؤال

أنا جديد على ROS ... وأحاول إنشاء مولد رقم عشوائي بسيط ، والذي سينشر القيم التي تم إنشاؤها عشوائيًا. لهذا ، قمت بإنشاء فئة الموضع:

include "stdlib.h"

namespace RandomPositionGenerator {


class Position {
private:
double x;
double y;
double z;
public:
Position();
void setPosition();
void getPosition(double &a, double &b, double &c);
};

Position::Position(){}

void Position::setPosition() {
x = rand();
y = rand();
z = rand();
}

void Position::getPosition(double &a, double &b, double &c) {
 a=x;
 b=y;
 c=z;

}

}

واستخدمت هذه الفئة لإنشاء ناشر بلدي:

include "ros/ros.h"
include "std_msgs/String.h"
include "sstream"
include "Position.cpp"

/**
 * This method generates position coordinates at random.
**/
int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");

    ros::NodeHandle n;
    ros::Publisher position_pub = n.advertise<RandomPositionGenerator:: Position>      ("position", 50);
    ros::Rate loop_rate(10);

    double pos_x=0;
    double pos_y=0;
    double pos_z=0;

    while (ros::ok())
    {
   RandomPositionGenerator:: Position pos;
   pos.setPosition();
   pos.getPosition(pos_x,pos_y,pos_z);

       ROS_INFO("The co-ordinates are : x=",pos_x);

       position_pub.publish(pos);
       ros::spinOnce();
       loop_rate.sleep();

    }


   return 0;
}

والآن أحصل على الأخطاء التالية:

  1. "__S_GetDatatype" ليس عضوًا في "RandompositionGenerator :: position"
  2. "__S_GETMD5SUM" ليس عضوًا في "RandompositionGenerator :: position"
  3. "Const Class RandompositionGenerator :: Position" ليس لديه عضو يدعى "__getDatatype"

وبعض الأخطاء الأكثر مماثلة ... يرجى تصحيحني ... لست متأكدًا من أين أنا مخطئ ، أو إذا كان هناك أي شيء فعلته في هذا الجزء الصغير من الكود!

هل كانت مفيدة؟

المحلول

يجب عليك استخدام رسالة ROS الفعلية بدلاً من فئة مخصصة للبيانات التي ترغب في نشرها/الاشتراك فيها. نرى http://wiki.ros.org/ros/tutorials/creatingmsgandsrv لكيفية إنشاء رسالة جديدة يمكنك استخدامها عند نشر البيانات. يعني استخدام رسالة ROS أيضًا أن أدوات ROS الحالية مثل rostopic وروابط اللغة بأكملها مثل rospy لبيثون أو rosjava بالنسبة لـ Java ، ستتمكن بسهولة من التفاعل مع عقدة C ++ الخاصة بك.

لهذه الحالة بالذات ، يمكنك ببساطة استخدام رسالة ROS القياسية لنقطة ثلاثية الأبعاد ، Geometry_MSGS/Point. يمكنك العثور على قائمة شاملة إلى حد ما من الرسائل الموحدة في common_msgs توثيق. يحتوي استخدام رسالة موحدة على عدد من الفوائد على إنشاء رسالتك الخاصة مع نفس المحتوى - الأكبر هو أن هناك العديد من الأدوات أو غيرها من البرامج في النظام البيئي ROS الذي قد ترغب في الاستفادة منه لاحقًا ، والذي سيكون عملية غير مؤلمة إلى حد ما إذا كنت تستخدم بالفعل أنواع الرسائل ذات الاستعداد.

إذا كنت بحاجة فعلاً إلى استخدام فئة الموضع المخصصة (دون مجرد تحويلها إلى رسالة ROS) ، فيمكنك إلقاء نظرة على ROSCPP التسلسل توثيق. أود بقوة اقترح مقابل تسلسل الفصل المخصص الخاص بك بدلاً من استخدام رسالة ROS الفعلية التي تقوم بإنشائها أو رسالة موحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top