Robotics StackExchange | Archived questions

Hi, I want to wrap the publisher inside a C++ class,the error is "Call to publish() on an invalid Publisher"

I find the error is not define the publisher in internet,but i have defined it in my class. The following is a part of the code.

class planner
{
private:
    ros::Publisher setpoint_raw_local_pub;
pubilc:
    void send_pos_setpoint(const Eigen::Vector3d& pos_sp, float yaw_sp);
}

planner::planner(ros::NodeHandle* nodehandle):nh(*nodehandle)
{
    calc_timer = nh.createTimer(ros::Duration(0.05), &planner::calc_cb, this); 
}

void planner::init_publisher()
{
    setpoint_raw_local_pub = nh.advertise<mavros_msgs::PositionTarget>
    ("/mavros/setpoint_raw/local", 10, this);
}

And I defined a class member function call publisher

void planner::send_pos_setpoint(const Eigen::Vector3d& pos_sp, float yaw_sp)
{
mavros_msgs::PositionTarget pos_setpoint; 
pos_setpoint.type_mask = 0b100111111000;  // 100 111 111 000  xyz + yaw

pos_setpoint.coordinate_frame = 1;

pos_setpoint.position.x = pos_sp[0];
pos_setpoint.position.y = pos_sp[1];
pos_setpoint.position.z = pos_sp[2];

pos_setpoint.yaw = yaw_sp;

setpoint_raw_local_pub.publish(pos_setpoint);
}

When i want to call the "sendpossetpoint" function,it will throw an error in "setpointrawlocal_pub.publish" .

I also put the definitions all in pubilc,it didn't work. but when i turn publisher definitions and the "sendpossetpointinto" function into global variables,it workes.

However, i also want to konw how can i slove this question.(i think the changed code is not graceful,haha

Thanks for incoming answers, sorry for my vocabulary i'm not native english.

Asked by levelmoon on 2023-02-22 02:29:05 UTC

Comments

The code in the question does not call init_publisher. If you did not call init_publisher, then calling it might improve things.

Asked by miura on 2023-02-26 00:29:16 UTC

Answers