77 rclcpp::NodeOptions node_options;
78 node_options.allow_undeclared_parameters(
true);
79 node_options.automatically_declare_parameters_from_overrides(
true);
81 if (m_node ==
nullptr) {
86 rclcpp::Parameter simTime(
"use_sim_time", rclcpp::ParameterValue(
true ) );
87 m_node->set_parameter( simTime );
88 const std::string m_tf_topic =
"/tf";
89 m_publisher_tf = m_node->create_publisher<tf2_msgs::msg::TFMessage>(m_tf_topic, 10);
91 m_ros2Publisher_odometry = m_node->create_publisher<nav_msgs::msg::Odometry>(
m_topic_name, 10);
104 if (m_odometry2D_interface!=
nullptr && m_ros2Publisher_odometry && m_publisher_tf) {
106 double synchronized_timestamp = 0;
107 m_odometry2D_interface->
getOdometry(odometryData, &synchronized_timestamp);
109 if (std::isnan(synchronized_timestamp) ==
false)
111 m_timeStamp.
update(synchronized_timestamp);
118 nav_msgs::msg::Odometry odometryMsg;
122 odometryMsg.pose.pose.position.x = odometryData.
odom_x;
123 odometryMsg.pose.pose.position.y = odometryData.
odom_y;
124 odometryMsg.pose.pose.position.z = 0.0;
125 geometry_msgs::msg::Quaternion odom_quat;
127 double cosYaw = cos(halfYaw);
128 double sinYaw = sin(halfYaw);
131 odom_quat.z = sinYaw;
132 odom_quat.w = cosYaw;
133 odometryMsg.pose.pose.orientation = odom_quat;
134 odometryMsg.twist.twist.linear.x = odometryData.
base_vel_x;
135 odometryMsg.twist.twist.linear.y = odometryData.
base_vel_y;
136 odometryMsg.twist.twist.linear.z = 0;
137 odometryMsg.twist.twist.angular.x = 0;
138 odometryMsg.twist.twist.angular.y = 0;
142 tf2_msgs::msg::TFMessage rosData;
144 geometry_msgs::msg::TransformStamped tsData;
148 tsData.transform.rotation.x = 0;
149 tsData.transform.rotation.y = 0;
150 tsData.transform.rotation.z = sinYaw;
151 tsData.transform.rotation.w = cosYaw;
152 tsData.transform.translation.x = odometryData.
odom_x;
153 tsData.transform.translation.y = odometryData.
odom_y;
154 tsData.transform.translation.z = 0;
156 odometryMsg.header.stamp.sec = int(m_timeStamp.
getTime());
157 odometryMsg.header.stamp.nanosec = int(1000000000UL * (m_timeStamp.
getTime() -
int(m_timeStamp.
getTime())));
159 tsData.header.stamp.sec = int(m_timeStamp.
getTime());
160 tsData.header.stamp.nanosec = int(1000000000UL * (m_timeStamp.
getTime() -
int(m_timeStamp.
getTime())));
162 if (rosData.transforms.size() == 0)
164 rosData.transforms.push_back(tsData);
166 else if (rosData.transforms.size() == 1)
168 rosData.transforms[0] = tsData;
176 m_ros2Publisher_odometry->publish(odometryMsg);
178 m_publisher_tf->publish(rosData);
virtual yarp::dev::ReturnValue getOdometry(yarp::dev::OdometryData &odom, double *timestamp=nullptr)=0
Gets the odometry of the robot, including its velocity expressed in the world and in the local refere...