Why isn't rviz2 responding to my publisher node?
Hi, I'd like to write a publisher node that outputs messages of type JointState and then is read by rviz2, displaying the moving joints of my robot onto its display. I followed the nav2 docs up to this stage which go through how to use the joint_state_publisher_gui to move the joints in rviz2. This worked correctly and it seemed as if these messaged were being published onto the /joint_states topic as when I echoed them into my terminal it was displaying messages that made sense.
My logic was to then write a publisher node as seen below, that would publish messages of type JointState, onto the /joint_state topic and that would cause rviz2 to show the movement. I made the node and it seemed to work, as again, when I echoed it into another terminal it was displaying the correct messages, however the joints of my robot on rviz2 was not showing any movement.
Have I made an error in judgement, or is my code incorrect?
Publisher node:
> #!/usr/bin/env python3
>
> import rclpy import math from
> rclpy.node import Node import random
>
> from sensor_msgs.msg import JointState
>
>
> class MinimalPublisher(Node):
>
> def __init__(self):
> super().__init__('joint_publisher')
> self.publisher_ = self.create_publisher(JointState,
> 'joint_states', 10)
> timer_period = 2 # seconds
> self.timer = self.create_timer(timer_period,
> self.timer_callback)
> self.i = 0.0
>
> def timer_callback(self):
> msg = JointState()
> msg.name = ['shoulder_fr_twist_joint',
> 'shoulder_fl_twist_joint',
> 'shoulder_br_twist_joint',
> 'shoulder_bl_twist_joint',
> 'shoulder_fr_joint',
> 'shoulder_fl_joint',
> 'shoulder_br_joint',
> 'shoulder_bl_joint',
> 'forearm_fr_joint',
> 'forearm_fl_joint',
> 'forearm_br_joint',
> 'forearm_bl_joint']
> # pick random int between the limits
> msg.position = [random.uniform(-0.4, 0.4),
> random.uniform(-0.4, 0.4),
> random.uniform(-0.4, 0.4),
> random.uniform(-0.4, 0.4),
> random.uniform(-0.8, 0.8),
> random.uniform(-0.8, 0.8),
> random.uniform(-0.8, 0.8),
> random.uniform(-0.8, 0.8),
> random.uniform(-0.8, 1),
> random.uniform(-0.8, 1),
> random.uniform(-0.8, 1),
> random.uniform(-0.8, 1)]
> msg.velocity = []
> msg.effort = []
>
> self.publisher_.publish(msg)
> self.get_logger().info('Publishing:
> "%s"' % self.i)
> self.i += 0.1
>
>
> def main(args=None):
> rclpy.init(args=args)
>
> minimal_publisher = MinimalPublisher()
>
> rclpy.spin(minimal_publisher)
>
> # Destroy the node explicitly
> # (optional - otherwise it will be done automatically
> # when the garbage collector destroys the node object)
> minimal_publisher.destroy_node()
> rclpy.shutdown()
>
>
> if __name__ == '__main__':
> main()
Please let me know if you would like any further information, I've been stuck on this for a few days and would love for this to be cleared up!