通过gmapping和伪造的odom,完成Kinect建图
传感器信息:
- 环境深度信息:sensor_msgs/laserScan -----> RGBD三维点云数据:通过ros功能包depthimage to laserscan完成深度相机数据转换成激光数据
- 里程计信息:机器人发布的nav_msgs/Odemetry(pose:x,y,z三轴位置与方向以及矫正误差的协方差矩阵;twist):通过伪造的节点发布odom数据
发布gmapping需要的传感器信息和里程计消息:
- $ catkin_create_pkg odom_tf_package std_msgs rospy roscpp sensor_msgs tf nav_msgs
- $ touch odom_tf_node.cpp
- #include <tf/transform_broadcaster.h>
- #include <nav_msgs/Odometry.h>
- //需要实现“odom”参考系到“base_link”参考系的变换,以及nav_msgs/Odometry消息的发布
- int main(int argc, char** argv)
- {
- //定义一个消息发布者来发布“odom”消息,在定义一个tf广播,来发布tf变换信息
- ros::init(argc, argv, "odometry_publisher");
- ros::NodeHandle n;
- ros::Publisher odom_pub = n.advertise<nav_msgs::Odometry>("odom", );
- tf::TransformBroadcaster odom_broadcaster;
- // 默认机器人的起始位置是odom参考系下的0点
- double x = 0.0;
- double y = 0.0;
- double th = 0.0;
- // 让机器人的base_link参考系在odom参考系下以x轴方向0.1m/s,Y轴速度-0.1m/s,角速度0.1rad/s的状态移动
- double vx = 0.1;
- double vy = -0.1;
- double vth = 0.1;
- ros::Time current_time, last_time;
- current_time = ros::Time::now();
- last_time = ros::Time::now();
- //使用1Hz的频率发布odom消息,在实际系统中,往往需要更快的速度进行发布
- ros::Rate r(1.0);
- while(n.ok())
- {
- ros::spinOnce();
- current_time = ros::Time::now();
- //积分计算里程计信息
- double dt = (current_time - last_time).toSec();
- double delta_x = (vx * cos(th) - vy * sin(th)) * dt;
- double delta_y = (vx * sin(th) + vy * cos(th)) * dt;
- double delta_th = vth * dt;
- x += delta_x;
- y += delta_y;
- th += delta_th;
- //为了兼容二维和三维的功能包,让消息结构更加通用,里程计的偏航角需要转换成四元数才能发布,辛运的是,ROS为我们提供了偏航角与四元数相互转换的功能
- geometry_msgs::Quaternion odom_quat = tf::createQuaternionMsgFromYaw(th);
- //first, we'll publish the transform over tf
- geometry_msgs::TransformStamped odom_trans;
- odom_trans.header.stamp = current_time;
- odom_trans.header.frame_id = "odom";
- odom_trans.child_frame_id = "base_link";
- odom_trans.transform.translation.x = x;
- odom_trans.transform.translation.y = y;
- odom_trans.transform.translation.z = 0.0;
- odom_trans.transform.rotation = odom_quat;
- //send the transform
- odom_broadcaster.sendTransform(odom_trans);
- //next, we'll publish the odometry message over ROS
- nav_msgs::Odometry odom;
- odom.header.stamp = current_time;
- odom.header.frame_id = "odom";
- //set the position
- odom.pose.pose.position.x = x;
- odom.pose.pose.position.y = y;
- odom.pose.pose.position.z = 0.0;
- odom.pose.pose.orientation = odom_quat;
- //set the velocity
- odom.child_frame_id = "base_link";
- odom.twist.twist.linear.x = vx;
- odom.twist.twist.linear.y = vy;
- odom.twist.twist.angular.z = vth;
- //publish the message
- odom_pub.publish(odom);
- last_time = current_time;
- r.sleep();
- }
- }
编译源码:在odom_tf_package/CMakeLists.txt添加编译选项:
- add_executable(odom_tf_node src/odom_tf_node.cpp)
- target_link_libraries(odom_tf_node ${catkin_LIBRARIES})
在odom_tf_package中添加launch文件:
- mkdir -p launch
- cd launch
- touch gamppping_slam.launch添加代码如下:
- <launch>
- <node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser_frame 100" />
- <node pkg="tf" type="static_transform_publisher" name="base_footprint_2_base_link" args="0 0 0 0 0 0 /odom /base_link 100"/>
- <node pkg="tf" type="static_transform_publisher" name="base_link_2_base_stabilized_link" args="0 0 0 0 0 0 /base_link /camera_link 100"/>
- </launch>
启动kinect相机:$ roslaunch freenect_launch freenect.launch
完成深度信息转换成/scan信息:$ rosrun depthimage_to_laserscan depthimage_to_laserscan image:=/camera/depth/image_raw
发布Odom信息:$ rosrun odom_tf_package odom_tf_node
启动launch:$ roslaunch odom_tf_package gmapping_slam.launch
启动gmapping建图:$ rosrun gmapping slam_gmapping scan:=scan
在rviz中观察建图过程:$ rviz
查看tree图 :$ rosrun rqt_tf_tree rqt_tf_tree
通过gmapping和伪造的odom,完成Kinect建图的更多相关文章
- 使用hector-slam和Kinect V1建图
一.建图实际操作 下载源码测试源码,depthimage_to_laserscan,参考https://blog.csdn.net/u010925447/article/details/5649468 ...
- Velodyne VLP-16 gmapping 建图
1. 测试环境 Ubuntu 16.04 x64.ROS Kinetic.Velodyne VLP-16.RoboWare Studio 2. 安装 ROS 功能包 sudo apt-get inst ...
- TurtleBot3 Waffle (tx2版华夫)(9)建图-gmapping建图(A2雷达)
9.1. 说明 这一节我们来讲 Turtlebot3 的 SLAMSLAM(The Simultaneous Localization and Mapping) 同步定位与地图构建: 希望机器人从未知 ...
- 基于ros2 dashing的建图导航探索
基于ros2 dashing的建图导航探索 1. 环境准备 安装ros2 dashing, 参考链接: https://index.ros.org/doc/ros2/Installation/Dash ...
- 【翻译】Kinect v1和Kinect v2的彻底比较
本连载主要是比较Kinect for Windows的现行版(v1)和次世代型的开发者预览版(v2),以C++开发者为背景介绍进化的硬件和软件.本文主要是对传感的配置和运行条件进行彻底的比较. ...
- (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍
首页 视界智尚 算法技术 每日技术 来打我呀 注册 SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...
- Gmapping笔记
2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM 作者:kint_zhao 原文:https://blog. ...
- OpenCV、PCL;Xtion、kinect;OpenNI、kinect for windows SDK比较
一.对比介绍: 1. OpenCV:开源跨平台,OpenCV于1999年由Intel建立,如今由Willow Garage提供支持. 2. OpenNI:OpenNI组织创建于2010年11月.主要成 ...
- 【计算机视觉】深度相机(五)--Kinect v2.0
原文:http://blog.csdn.NET/qq1175421841/article/details/50412994 ----微软Build2012大会:Kinect for Windows P ...
随机推荐
- LeetCode 51 N-Queens II
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- js上传
有时候需要显示进度,这时候就需要做一些切割,具体上传代码如下: <!DOCTYPE HTML> <html lang="en-US"> <head&g ...
- JS设计模式——单例模式剖析
转载于原文地址:https://blog.csdn.net/q1056843325/article/details/52933426 举一个通俗的例子,在页面中点击登录按钮,弹出了一个登录浮窗,这个登 ...
- Windows10环境下使用VisualSVN server搭建SVN服务器
参考: Windows10环境下使用VisualSVN server搭建SVN服务器 要搭建个svn用.之前自己的服务器用的乌龟.后来用了这个VisualSVN server. 具体教程见上链接.暂无 ...
- Java课程寒假之《人月神话》有感之一
一.焦油坑 以前上课的时候,老师讲过早期的程序由于工作量不大,大多只需要几个人完成,随着软件规模的不断扩大,代码量直线上升,仅仅一两个人可能没有办法完成这样的任务,多以开始形成了团队的规模,焦油坑说的 ...
- 已知两点的经度和纬度,计算两点间的距离(php,javascript)
php代码:转载 http://www.cnblogs.com/caichenghui/p/5977431.html /** * 求两个已知经纬度之间的距离,单位为米 * * @param lng1 ...
- 用js实现二维数组的旋转
我最近因为做了几个小游戏,用到了二维数组,其中有需求将这个二维数组正翻转 90°,-90°,180°. 本人是笨人,写下了存起来. 定义的基本二位数组渲染出来是这种效果. 现在想实现的结果是下面的效果 ...
- 剑指offer——python【第28题】数组 中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 登录注册页面html模版
登录注册页面html模版 地址:http://download.csdn.net/detail/xiaosongaixiaoqian/5432033
- DEDE暴力破解后台登录页面
DEDE暴力破解后台登录页面 #!/usr/bin/env python '''/* * author = Mochazz * team = 红日安全团队 * env = pyton3 * */ '' ...