ROS中gmapping包中的机器人坐标

zhy@zhy-Inspiron-7460:~/catkin_map$ rostopic list
/RosAria/battery_recharge_state
/RosAria/battery_state_of_charge
/RosAria/battery_voltage
/RosAria/bumper_state
/RosAria/cmd_vel
/RosAria/motors_state
/RosAria/parameter_descriptions
/RosAria/parameter_updates
/RosAria/pose
/RosAria/sonar
/RosAria/sonar_pointcloud2
/clicked_point
/initialpose
/lichao_goal_marker
/lichao_goal_marker_array
/map
/map_metadata
/map_updates
/move_base_simple/goal
/rosout
/rosout_agg
/scan
/slam_gmapping/entropy
/tf
/tf_static

zhy@zhy-Inspiron-7460:~/catkin_map$ rostopic info /RosAria/pose
Type: nav_msgs/Odometry

Publishers: 
 * /RosAria (http://zhy-Inspiron-7460:35755/)

Subscribers: None


zhy@zhy-Inspiron-7460:~/catkin_map$ rosmsg show nav_msgs/Odometry
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
  geometry_msgs/Pose pose
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w
  float64[36] covariance
geometry_msgs/TwistWithCovariance twist
  geometry_msgs/Twist twist
    geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z
  float64[36] covariance

测试代码c++

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
#include "std_msgs/String.h"

#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

double point_x,point_y,point_z;
//数据类型前面要加const,否则会报错;
void poseCallback(const nav_msgs::Odometry::ConstPtr& msg)
{
 geometry_msgs::Point p;

 p.x=msg->pose.pose.position.x;
 p.y=msg->pose.pose.position.y;
 p.z=msg->pose.pose.position.z;

 point_x=p.x;
 point_y=p.y;
 point_z=p.z;
 cout<<"X :"<<point_x<<'\t'<<"Y : "<<point_y<<'\t'<<"Z : "<<point_z<< endl;
}
int main(int argc, char **argv)
{
  ros::init(argc, argv, "pose");
  ros::NodeHandle n;
  ros::Subscriber sub=n.subscribe("/RosAria/pose",50,poseCallback);
  ros::spin();
  return 0;
}

打印出来的坐标不是 0,0,0;
如果是odom坐标,一开始的坐标因该是0,0,0,初步推断gmapping里面的poes是修正过后的世界坐标系的坐标点.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS,获取当前机器人坐标可以通过以下c++代码实现: ```c++ #include <ros/ros.h> #include <geometry_msgs/PoseStamped.h> #include <tf/transform_listener.h> int main(int argc, char** argv) { ros::init(argc, argv, "robot_pose"); ros::NodeHandle node; tf::TransformListener listener; ros::Publisher pose_pub = node.advertise<geometry_msgs::PoseStamped>("robot_pose", 10); ros::Rate rate(10.0); while (node.ok()){ tf::StampedTransform transform; try{ listener.lookupTransform("/map", "/base_link", ros::Time(0), transform); // 获取机器人base_link相对于地图map的位姿信息 } catch (tf::TransformException &ex) { ROS_ERROR("%s",ex.what()); continue; } geometry_msgs::PoseStamped pose_msg; pose_msg.header.frame_id = "/map"; // 机器人坐标系为地图map坐标系下的坐标系 pose_msg.header.stamp = ros::Time::now(); pose_msg.pose.position.x = transform.getOrigin().x(); // 获取机器人在x轴上的坐标 pose_msg.pose.position.y = transform.getOrigin().y(); // 获取机器人在y轴上的坐标 pose_msg.pose.position.z = transform.getOrigin().z(); // 获取机器人在z轴上的坐标 pose_msg.pose.orientation.x = transform.getRotation().x(); // 获取机器人的姿态信息 pose_msg.pose.orientation.y = transform.getRotation().y(); pose_msg.pose.orientation.z = transform.getRotation().z(); pose_msg.pose.orientation.w = transform.getRotation().w(); pose_pub.publish(pose_msg); // 发布机器人坐标信息 rate.sleep(); } return 0; } ``` 以上代码,我们通过geometry_msgs::PoseStamped消息类型来表示机器人坐标信息,并通过ros::Publisher类发布机器人坐标信息。在每次循环,我们使用tf::TransformListener类来监听tf变换,并使用lookupTransform函数获取机器人base_link相对于地图map的位姿信息。然后,我们将机器人坐标信息填入geometry_msgs::PoseStamped消息,并通过pose_pub.publish函数发布机器人坐标信息。最后,我们通过rate.sleep()函数控制程序的运行频率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值