0

Rosanswers logo

Hello,

I am trying to fuse my odometry from my 2D differential drive robot, with my imu using the ekf from RL. The odometry works fine on it's own, but I think I must be missing something simple in my config files as I cannot get the ekf node to subscribe to the odom topic I am publishing.

ekf_filter_node:
    ros__parameters:
    frequency: 30.0
    sensor_timeout: 0.1
    two_d_mode: true
    transform_time_offset: 0.0
    transform_timeout: 0.0
    print_diagnostics: true
    debug: false
    debug_out_file:
    publish_tf: true
    publish_acceleration: false
    map_frame: map              
    odom_frame: odom          
    base_link_frame: base_link 
    world_frame: odom           
    odom0: /odom/data     #does not appear under $ros2 node info
    odom0_config: [true, true, true,
                   false, false, false,
                   false, false, false,
                   false, false, true,
                   false, false, false]
    odom0_queue_size: 5
    odom0_nodelay: true
    odom0_differential: true
    odom0_relative: false
    odom0_pose_rejection_threshold: 5.0
    odom0_twist_rejection_threshold: 1.0
    imu0: /imu/data     #ekf properly subscribes to this topic
    imu0_config: [false,  false,  false,
                  false,  false,  false,
                  false,  false,  false,
                  false,  false,  true,
                  true,   false,  false]
    imu0_nodelay: false
    imu0_differential: false
    imu0_relative: true
    imu0_queue_size: 10
    imu0_pose_rejection_threshold: 0.8                
    imu0_twist_rejection_threshold: 0.8                
    imu0_linear_acceleration_rejection_threshold: 0.8  
    imu0_remove_gravitational_acceleration: true
    use_control: false
    stamped_control: false
    control_timeout: 0.2
    control_config: [true, false, false, false, false, true]

...

I am generating my transforms from the ros2_differential_drive package:

    self.base_frame_id = self.declare_parameter('base_frame_id', 'base_link').value  
    self.odom_frame_id = self.declare_parameter('odom_frame_id', 'odom')
   ...
self.create_subscription(Int16, "lwheel", self.lwheel_callback, 10)
        self.create_subscription(Int16, "rwheel", self.rwheel_callback, 10)
        self.odom_pub = self.create_publisher(Odometry, "odom/data", 10)
        self.odom_broadcaster = TransformBroadcaster(self)

...

    transform_stamped_msg = TransformStamped()
    transform_stamped_msg.header.stamp = self.get_clock().now().to_msg()
    transform_stamped_msg.header.frame_id = self.odom_frame_id
    transform_stamped_msg.child_frame_id = self.base_frame_id
    transform_stamped_msg.transform.translation.x = self.x
    transform_stamped_msg.transform.translation.y = self.y
    transform_stamped_msg.transform.translation.z = 0.0
    transform_stamped_msg.transform.rotation.x = quaternion.x
    transform_stamped_msg.transform.rotation.y = quaternion.y
    transform_stamped_msg.transform.rotation.z = quaternion.z
    transform_stamped_msg.transform.rotation.w = quaternion.w

    self.odom_broadcaster.sendTransform(transform_stamped_msg)

    odom = Odometry()
    odom.header.stamp = now.to_msg()
    odom.header.frame_id = self.odom_frame_id
    odom.pose.pose.position.x = self.x
    odom.pose.pose.position.y = self.y
    odom.pose.pose.position.z = 0.0
    odom.pose.pose.orientation = quaternion
    odom.child_frame_id = self.base_frame_id
    odom.twist.twist.linear.x = self.dx
    odom.twist.twist.linear.y = 0.0
    odom.twist.twist.angular.z = self.dr
    self.odom_pub.publish(odom)

I would greatly appreciate any advice you have. Thank you!


Originally posted by LiquidTurtle1 on ROS Answers with karma: 15 on 2022-08-30

Post score: 0


Original comments

Comment by LiquidTurtle1 on 2022-08-30:
Just to clarify, the differential_drive package publishes data of type nav_msgs/Odometry, so it should be accessible to RL

Publishers: /odom/data: nav_msgs/msg/Odometry

1 Answers1

0

Rosanswers logo

I was able to get the node to subscribe to the odometry topic by adding {'odom0': '/odom/data'} to my launch file:

    Node(
        package='robot_localization',
        executable='ekf_node',
        name='ekf_filter_node',
        output = 'screen',
        parameters=[os.path.join(get_package_share_directory("mlabot"), 'config', 'ekf.yaml'), {'odom0': '/odom/data'}],
        ),

Originally posted by LiquidTurtle1 with karma: 15 on 2022-09-13

This answer was ACCEPTED on the original site

Post score: 0