Publish to Topics of different node [Solved]
Dear All, I have a silly question. is there a way to publish to topics of different node using c++ methods?
I mean like we are subscribing to topics of different nodes, is there a way to publish to topics of different nodes?
I want to do something like this ("/pubJoints").publish(1.4);
I hope I explained the question clearly.
Thanks . waiting for your valuable reply...
Asked by PKumars on 2016-03-30 13:47:31 UTC
Answers
Here is a complete template where I'm using this for a 7-dof dynamixel arm for sending joint values from .cpp node..
here is a node where I'm publishing to topics of another node and those particular topics are /joint0_controller/command /joint1_controller/command /joint2_controller/command /joint3_controller/command /joint4_controller/command /joint5_controller/command /joint6_controller/command /joint7_controller/command
and msg type is std_msgs/Float64
########### .cpp code..........
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
// Message publication
#include "std_msgs/MultiArrayLayout.h"
#include "std_msgs/MultiArrayDimension.h"
#include "std_msgs/Float32MultiArray.h"
#include "std_msgs/Float64.h"
#include <std_msgs/Float64.h>
#include <sstream>
using namespace std;
// publisher declaration
ros::Publisher shoulder_roll_joint, shoulder_pitch_joint, shoulder_yaw_joint,
elbow_pitch_joint, elbow_yaw_joint, wrist_pitch_joint, wrist_roll_joint, gripper_joint;
int main(int argc, char** argv)
{
ros::init(argc, argv, "arm_joints");
ros::NodeHandle nh;
// publisher declaration
shoulder_roll_joint = nh.advertise<std_msgs::Float64>("/joint0_controller/command", 1);
shoulder_pitch_joint = nh.advertise<std_msgs::Float64>("/joint1_controller/command", 1);
shoulder_yaw_joint = nh.advertise<std_msgs::Float64>("/joint2_controller/command", 1);
elbow_pitch_joint = nh.advertise<std_msgs::Float64>("/joint3_controller/command", 1);
elbow_yaw_joint = nh.advertise<std_msgs::Float64>("/joint4_controller/command", 1);
wrist_pitch_joint = nh.advertise<std_msgs::Float64>("/joint5_controller/command", 1);
wrist_roll_joint = nh.advertise<std_msgs::Float64>("/joint6_controller/command", 1);
gripper_joint = nh.advertise<std_msgs::Float64>("/joint7_controller/command", 1);
ros::Rate rate(50.0); // frequency of operation
while (1)
{
std_msgs::Float64 areaValue;
std_msgs::Float64 Joint0, Joint1, Joint2, Joint3, Joint4, Joint5, Joint6, Joint7;
Joint0.data = 0.0;
Joint1.data = -1.2;
Joint2.data = 0.0;
Joint3.data = -1.2;
Joint4.data = -1.2;
Joint5.data = -1.2;
Joint6.data = 0.0;
Joint7.data = 0.0;
shoulder_roll_joint.publish(Joint0);
shoulder_pitch_joint.publish(Joint1);
shoulder_yaw_joint.publish(Joint2);
elbow_pitch_joint.publish(Joint3);
elbow_yaw_joint.publish(Joint4);
wrist_pitch_joint.publish(Joint5);
wrist_roll_joint.publish(Joint6);
gripper_joint.publish(Joint7);
rate.sleep();
}
return 0;
};
Hope it helps someone.
if anyone finds error or difficulty in understanding then please let me know.
Regards, Prasanna
Asked by PKumars on 2016-03-31 04:19:54 UTC
Comments
I have to sign up to say thank you to you! This post really helped me! Good job! Best regards
Asked by AnNguyen on 2019-11-09 06:50:08 UTC
The "Anonymous" part of the "Anonymous Publish Subscribe" architecture that ROS is based on means that a node does not have to know if there are subscribers on a topic or not.
This means that publishing to a topic with subscribers is exactly the same as publishing to a topic that doesn't have any subscribers.
If you have a particular node that you're trying to interact with by publishing messages, you should publish them with the same type and topic name as the subscriber. Usually the topic names and types will be documented on the node's wiki page, or if the node is running you can find topic names with rostopic list
and the type of a topic with rostopic info
.
Asked by ahendrix on 2016-03-31 13:40:42 UTC
Comments
What do you want to do that isn't possible with the standard C++ publisher like http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber(c%2B%2B) ?
Asked by ahendrix on 2016-03-30 21:07:29 UTC
Hm... not sure if I understand correctly. You mean you want to create a node which publishes to multiple topics with different topic names?
Asked by DavidN on 2016-03-30 21:19:45 UTC
I'm sorry if I couldn't describe clearly. I wanted to publish to topic that's already waiting to take some values. I have two nodes running and I wanted to publish to topics of second node from first node. BTW I solved that problem and I'm posting it now.
Asked by PKumars on 2016-03-31 04:15:51 UTC