0
$\begingroup$

Rosanswers logo

I only have two sensors, gps and and imu, that I am trying to integrate using robot_localization. I've created a launch file based on this question, pasted at the end.

There are a couple of issues. When I run the launch file I'm getting warnings about not having a base_link->map transform. The node handles the transform between odom and base link, do I need to create a transform from odom to map myself? There wasn't anything indicated in the linked answer so I assumed not, but I seem to be missing something. Warnings are pasted below

[ WARN] [1467926395.059514047]: Could not obtain base_link->map transform. Will not remove offset of navsat device from robot's origin. [ WARN] [1467926397.126389602]: Could not obtain transform from map to base_link. Error was "map" passed to lookupTransform argument source_frame does not exist. 

Second, the output of /odometry/gps is stuck at 0 for all values despite my gps data coming in fine, I would guess because of the map to base_link transform issue. Any help figuring out where I went wrong in my setup would be greatly appreciated.

EDIT- After rereading the robot_localization wiki I removed the map_frame line from the file as suggested but get the same results. Why is it still looking for a transform for the map_frame if I'm not using one?

<launch> <node pkg="tf2_ros" type="static_transform_publisher" name="bl_imu" args="0 0 0 0 0 0 1 base_link imu_link" /> <!-- Start piksi driver, remap spp output to /gps/fix --> <node pkg="swiftnav_piksi" type="piksi_node" name="piksi_node"> <param name="port" value="/dev/ttyUSB0" /> <remap from="fix" to="/gps/fix"/> </node> <!-- Start imu running, remap output to /imu/data --> <node pkg="ros_erle_imu" type="imu_talker" name="imu_talker"> <remap from="imu9250" to="/imu/data"/> </node> <!-- Start --> <node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization" clear_params="true"> <param name="frequency" value="30"/> <param name="sensor_timeout" value="0.1"/> <param name="two_d_mode" value="true"/> <param name="map_frame" value="map"/> <param name="odom_frame" value="odom"/> <param name="base_link_frame" value="base_link"/> <param name="world_frame" value="odom"/> <param name="transform_time_offset" value="0.0"/> <param name="odom0" value="/odometry/gps"/> <param name="imu0" value="/imu/data"/> <rosparam param="odom0_config">[true, true, false, false, false, false, false, false, false, false, false, false, false, false, false]</rosparam> <rosparam param="imu0_config">[false, false, false, true, true, true, false, false, false, true, true, true, true, true, true]</rosparam> <param name="odom0_differential" value="false"/> <param name="imu0_differential" value="false"/> <rosparam param="process_noise_covariance">[0.05, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.025, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.025, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.015]</rosparam> <rosparam param="initial_estimate_covariance">[1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9]</rosparam> </node> <!-- navsat_transform --> <node pkg="robot_localization" type="navsat_transform_node" name="navsat_transform" respawn="true" output="screen"> <param name="frequency" value="30"/> <param name="delay" value="3"/> <param name="magnetic_declination_radians" value="0.190240888"/> <param name="yaw_offset" value="1.570796327"/> <param name="zero_altitude" value="true"/> <param name="broadcast_utm_transform" value="false"/> <param name="publish_filtered_gps" value="true"/> <param name="use_odometry_yaw" value="false"/> <param name="wait_for_datum" value="false"/> </node> </launch> 

EDIT 2- IMU

header: seq: 1522 stamp: secs: 1468000016 nsecs: 240786098 frame_id: imu_link orientation: x: 0.00976581033319 y: -0.0116279097274 z: 0.194468542933 w: 0.979070544243 orientation_covariance: [0.0025, 0.0, 0.0, 0.0, 0.0025, 0.0, 0.0, 0.0, 0.0025] angular_velocity: x: 0.0 y: 0.0 z: 0.0 angular_velocity_covariance: [0.02, 0.0, 0.0, 0.0, 0.02, 0.0, 0.0, 0.0, 0.02] linear_acceleration: x: 0.287402331829 y: 0.0 z: 9.9489107132 linear_acceleration_covariance: [0.04, 0.0, 0.0, 0.0, 0.04, 0.0, 0.0, 0.0, 0.04] 

GPS

header: seq: 1738 stamp: secs: 1468000156 nsecs: 872385898 frame_id: gps status: status: 0 service: 1 latitude: 37.773469084 longitude: -122.417696017 altitude: 5.37939040617 position_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] position_covariance_type: 0 

Originally posted by igd on ROS Answers with karma: 46 on 2016-07-07

Post score: 0


Original comments

Comment by Tom Moore on 2016-07-08:
Please post sample input messages.

Comment by igd on 2016-07-08:
Added the rostopic echo output for /gps/fix and /imu/data, I'll figure out how to share a bag file as well

EDIT- So the warnings were from incorrectly set frame_ids. If I delete the map frame and change odom and world to gps they're silenced. Position is still drifting a ton though.

Comment by igd on 2016-07-08:
Bag file https://github.com/swift-nav/ros_rover/blob/master/2016-07-08-20-03-16.bag GPS/IMU data only bag file https://github.com/swift-nav/ros_rover/blob/master/2016-07-08-21-42-57.bag

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

Turns out my issue was from still not setting my frames correctly. I made a static transform between gps (the frame_id of my /gps/fix messages) and base link, left the map_frame as map, and set odom_frame and world_frame to odom, now I'm getting reasonable results. My launch file is below in case it might be useful to anyone with similar issues

<!-- Start piksi driver, remap spp output to /gps/fix --> <node pkg="swiftnav_piksi" type="piksi_node" name="piksi_node"> <param name="port" value="/dev/ttyUSB0" /> <remap from="fix" to="/gps/fix"/> </node> <!-- Start imu running, remap output to /imu/data --> <node pkg="ros_erle_imu" type="imu_talker" name="imu_talker"> <remap from="imu9250" to="/imu/data"/> </node> <!-- Start --> <node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization" clear_params="true"> <param name="frequency" value="30"/> <param name="sensor_timeout" value="0.1"/> <param name="two_d_mode" value="false"/> <param name="map_frame" value="map"/> <param name="odom_frame" value="odom"/> <param name="base_link_frame" value="base_link"/> <param name="world_frame" value="odom"/> <param name="transform_time_offset" value="0.0"/> <param name="odom0" value="/odometry/gps"/> <param name="imu0" value="/imu/data"/> <rosparam param="odom0_config">[true, true, false, false, false, false, false, false, false, false, false, false, false, false, false]</rosparam> <rosparam param="imu0_config">[false, false, false, false, false, true, false, false, false, false, false, true, false, false, false]</rosparam> <param name="odom0_differential" value="false"/> <param name="imu0_differential" value="true"/> <param name="odom0_relative" value="false"/> <param name="imu0_relative" value="false"/> <param name="imu0_remove_gravitational_acceleration" value="true"/> <param name="print_diagnostics" value="true"/> <param name="odom0_queue_size" value="10"/> <param name="imu0_queue_size" value="10"/> <param name="debug" value="false"/> <param name="debug_out_file" value="debug_ekf_localization.txt"/> <rosparam param="process_noise_covariance">[0.05, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.025, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.025, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.015]</rosparam> <rosparam param="initial_estimate_covariance">[1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9]</rosparam> </node> <!-- navsat_transform --> <node pkg="robot_localization" type="navsat_transform_node" name="navsat_transform" respawn="true" output="screen"> <param name="frequency" value="30"/> <param name="delay" value="3"/> <param name="magnetic_declination_radians" value="0.190240888"/> <param name="yaw_offset" value="1.570796327"/> <param name="zero_altitude" value="true"/> <param name="broadcast_utm_transform" value="true"/> <param name="publish_filtered_gps" value="true"/> <param name="use_odometry_yaw" value="false"/> <param name="wait_for_datum" value="false"/> </node> </launch> 

Originally posted by igd with karma: 46 on 2016-07-08

This answer was ACCEPTED on the original site

Post score: 1


Original comments

Comment by JadTawil on 2017-09-25:
would you explain your reasoning in selectring the true/false configuration for odom0_config and imu0_config?

i.e. why is odom0 not true for velocities as well? from the documentaion of robot localization: If the odometry provides both position and linear velocity, fuse the linear velocity

Comment by yip on 2023-04-16:
i thought because when choose gps as odom, it doesn't provide the velocity as we konw.

Comment by Kaushal on 2023-08-02:
I am trying to make the robot localization work with Gazebo. I keep getting the above error. But it is random. Sometimes I get it sometimes I dont. I am spawning my URDF in Gazebo and robot state publisher is publishing to the TF tree. That is where I am getting the frames.

$\endgroup$