爱折腾-创客智造实验室 - ros新手
type: channel
link: https://www.ncnynl.com/tag/ros新手
items: ROS探索总结-3.ROS新手教程
items: ROS探索总结-4.简单的机器人仿真
items: ROS探索总结-5.创建简单的机器人模型smartcar
items: ROS探索总结-6.使用smartcar进行仿真
items: ROS探索总结-7.smartcar源码上传
items: ROS探索总结-8.键盘控制
items: ROS探索总结-9.操作杆控制
items: ROS探索总结-11.机器视觉
items: ROS探索总结-12.坐标系统
items: ROS探索总结-14.move_base（路径规划）

ROS探索总结-3.ROS新手教程
type: item
date: 2016-09-23T13:07:00+00:00
description: ROS新手教程 前面我们介绍了ROS的特点和结构，接下来就要开始准备动手感受一下ROS的强大了。ROS官网的wiki上针对新手的教程很详细，最好把所有的新手教程都搞清楚，这是后面开发最基础的东西。尽管如此，ROS对于新手来说还是很难上手，这里，我就来总结一下我当时学习的历程，也为其他新手作为一个参考。 一、ROS的安装 ROS的安装当然是我们开始动手的第一步了，这里我们使用的操作系统是ubuntu，因为ROS在ubuntu上的支持是最好的。 如果是新手，我建议使用”apt-get“的方法进行安装，不走很简单，按照wiki上说的，大概半个小时就可以安装完毕完全版的ROS：（现在最新版的ROS是groovy，但是我还是习惯使用fuerte） http://ros.org/wiki/fuerte/Installation/Ubuntu 如果想挑战源码编译，当然也没有问题： http://ros.org/wiki/fuerte/Installation/Ubuntu/Source 安装完毕之后运行一下“roscore”，如果没有问题，安装就成功了！ 注：groovy版本的安装： “apt-get”：http://www.ros.org/wiki/groovy/Installation/Ubuntu 源码编译：http://www.ros.org/wiki/groovy/Installation/Source 转载注： 安装部分的介绍已经比较旧, 参考稳定版本indigo http://wiki.ros.org/indigo/Installation 二、ROS的新手教程 wiki上的新手教程还是很详细的，对代码都有解释，新手一定要把这些例子和代码搞明白： http://www.ros.org/wiki/ROS/Tutorials 上面的教程都是英文的，如果感觉略有压力（本人就是），可以参考下面这两个博客中的部分翻译： http://blog.sina.com.cn/s/articlelist_1712413141_0_1.html 不过往后面的学习都是英文的资料了，还是要努力适应看英文的文档。 ROS使用的编程语言主要是C++和python，所以也有针对这两种语言的功能包roscpp和rospy，这两个包的教程与上面的教程基本相似，看完上面的教程也可以看看这两个包的教程： http://www.ros.org/wiki/rospy_tutorials http://www.ros.org/wiki/roscpp/Tutorials 努力学习完上面的这些教程，你至少应该明白ROS里面的节点和消息是干什么用的了吧，如果还没理解，那就再多看几遍吧！ 三、ROS中的常用功能 ROS中提供了很多强大的功能，我们学习完上面的基本知识之后要继续进行深入。 1、rviz rviz是ROS中一款强大的3D可视化工具，这个玩意在后面可是要频繁用到的，是必须要弄明白的，详细的教程可以参考wiki： http://www.ros.org/wiki/rviz 我们可以在里面创建自己的机器人，并且让机器人动起来。还可以创建地图，显示3D点云等等，总之，想在ROS中显示的东东都可以在这里显示出来。当然这些显示都是通过消息的订阅来完成的，机器人通过ROS发布数据，rviz订阅消息接收数据，然后显示，这些数据也是有一定的数据格式的，可以参考下面的链接： http://www.ros.org/wiki/rviz/DisplayTypes 看到上面的机器人了吧，是不是很酷，在rviz中，这样的机器人模型是通过urdf文件描述的，具体urdf文件怎么写，参考wiki： http://www.ros.org/wiki/urdf 2、tf tf是ROS中的坐标变换系统，在机器人的建模仿真中经常用到。 ROS中主要有两种坐标系： （1）固定坐标系：用于表示世界的参考坐标系; （2）目标坐标系：相对于摄像机视角的参考坐标系。 教程见：http://www.ros.org/wiki/tf 3、gazebo 这个工具是ROS中的物理仿真环境，gazebo本身就是一款机器人的仿真软件，基于ODE的物理引擎，可以模拟机器人以及环境中的很多物理特性，这个软件可以稍作了解，并不是后面开发所必须要的。 教程见：http://www.ros.org/wiki/simulator_gazebo/Tutorials 四、ROS常用机器人 1、PR2 看ROS的应用时，最常见到的机器人就是PR2。这个机器人是ROS的主要维护者（Willow Garage）针对ROS量身定做的机器人，有两个运行ubuntu和ROS的电脑，和两个机器臂以及很多牛逼的传感器，功能是非常强大的，但是售价那是相当的昂贵，国内很少…

ROS探索总结-4.简单的机器人仿真
type: item
date: 2016-09-23T13:09:00+00:00
description: 简单的机器人仿真 修改版：2016-10-13 by ncnynl 前边我们已经介绍了ROS的基本情况，以及新手入门ROS的初级教程，现在就要真正的使用ROS进入机器人世界了。接下来我们涉及到的很多例程都是《ROS by Example》这本书的内容，我是和群里的几个人一起从国外的亚马逊上买到的，还是很有参考价值的，不过前提是你已经熟悉之前的新手教程了。 《ROS by Example》目前是第二版《ROS by Example v1 indigo》 可点击加入Q群:477659623，进入群文件下载。 本章部分内容来自《ROS by Example v1 indigo》，请按书中的说明安装例子。 一、ROS by Example 这本书是关于国外关于ROS出版的第一本书，主要针对Electric和Fuerte版本，使用机器人主要是TurtleBot。书中详细讲解了关于机器人的基本仿真、导航、路径规划、图像处理、语音识别等等，而且在google的svn上发布了所有代码，可以通过以下命令下载、编译： svn checkout http://ros-by-example.googlecode.com/svn/trunk/rbx_vol_1 rosmake rbx_vol_1 rospack profile //加入ROS package路径 注意：原来的内容已经无效，更改为针对indigo版本： 检查环境并安装依赖 $ cd ~ $ wget https://raw.githubusercontent.com/pirobot/rbx1/indigo-devel/rbx1-prereq.sh $ sh rbx1-prereq.sh 安装书中例子 $ cd ~/catkin_ws/src/ $ git clone https://github.com/pirobot/rbx1.git $ cd rbx1 $ git checkout indigo-devel $ cd ~/catkin_ws $ catkin_make $ source ~/catkin_ws/devel/setup.bash $ rospack profile 二、rviz简单机器人模拟 1、安装机器人模拟器 rviz是一个显示机器人实体的工具，本身不具有模拟的功能，需要安装一个模拟器arbotix。 svn checkout http://vanadium-ros-pkg.googlecode.com/svn/trunk/arbotix rosmake arbotix 注意：原来内容已经无效，更改为indigo版本： $sudo apt-get install ros-indigo-arbotix-* $rospack profile 2、TurtleBot机器人的模拟 在书中的rbx_vol_1包里已经为我们写好了模拟的代码，我们先进行实验，完成后再仔细研究代码。 机器人模拟运行： 在新终端打开： $ roscore 新终端打开： $ roslaunch rbx1_bringup fake_pi_robot.launch 然后在终端中可以看到，机器人已经开始运行了，打开rviz界面，才能看到机器人实体。 rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz 注意：适合indigo版本原来为sim_fuerte.vcg，更改为sim.rviz 后面的参数是加载了rviz的配置文件sim.rviz。效果如下： 此时的机器人是静止的，需要发布一个消息才能让它动起来。 rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}' 如果要让机器人停下来，需要在中断中按下“Ctrl+c”，然后输入： rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}' 也可以改变发送的topic信息，使机器人走出不同的轨迹。 三、实现分析 按照上面的仿真过程，我们详细分析每一步的代码实现。 1、TurtleBot机器人运行 机器人运行使用的是launch文件，首先打开fake_turtlebot.launch文件。 注意：请比较书中的indigo版本，此launch已经旧了 <launch> <arg name="urdf_file" default="$(find xacro)/xacro.py '$(find turtlebot_description)/urdf/turtlebot.urdf.xacro'" /> <node n…

ROS探索总结-5.创建简单的机器人模型smartcar
type: item
date: 2016-09-23T13:10:00+00:00
description: 创建简单的机器人模型smartcar 修改版：2016-10-13 by ncnynl 前面我们使用的是已有的机器人模型进行仿真，这一节我们将建立一个简单的智能车机器人smartcar，为后面建立复杂机器人打下基础。 urdf相关工具安装（补充） 安装urdf_tutorial，可以使用其中的例子 $ sudo apt-get install ros-indigo-urdf-tutorial 安装liburdfdom-tools，提供对urdf文件的检查 $ sudo apt-get install liburdfdom-tools 一、创建硬件描述包 $ roscreate-pkg smartcar_description 注意：上面方法旧了，indigo版本使用catkin_create_pkg创建包： $ catkin_create_pkg smartcar_description std_msgs rospy roscpp urdf 二、智能车尺寸数据 因为建立的是一个非常简单的机器人，所以我们尽量使用简单的元素：使用长方体代替车模，使用圆柱代替车轮，具体尺寸如下： 三、建立urdf文件 在smartcar_description文件夹下建立urdf文件夹 $mkdir -p urdf ，创建智能车的描述文件smartcar.urdf，描述代码如下： <?xml version="1.0"?> <robot name="smartcar"> <visual> <geometry> <box size="0.25 .16 .05"/> </geometry> <origin rpy="0 0 1.57075" xyz="0 0 0"/> <material name="blue"> <color rgba="0 0 .8 1"/> </material> </visual> <visual> <geometry> <cylinder length=".02" radius="0.025"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> <joint name="right_front_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="right_front_wheel"/> <origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/> <limit effort="100" velocity="100"/> <joint_properties damping="0.0" friction="0.0"/> </joint> <visual> <geometry> <cylinder length=".02" radius="0.025"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> <joint name="right_back_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="right_back_wheel"/> <origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/> <limit effort="100" velocity="100"/> <joint_properties damping="0.0" friction="0.0"/> </joint> <visual> <geometry> <cylinder length=".02" radius="0.025"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> <joint name="left_front_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="left_front_wheel"/> <origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/> <limit effort="100" v…

ROS探索总结-6.使用smartcar进行仿真
type: item
date: 2016-09-23T13:10:00+00:00
description: 使用smartcar进行仿真 之前的博客中，我们使用rviz进行了TurtleBot的仿真，而且使用urdf文件建立了自己的机器人smartcar，本篇博客是将两者进行结合，使用smartcar机器人在rviz中进行仿真。 urdf相关工具安装（补充） 安装urdf_tutorial，可以使用其中的例子 $ sudo apt-get install ros-indigo-urdf-tutorial 安装liburdfdom-tools，提供对urdf文件的检查 $ sudo apt-get install liburdfdom-tools 一、模型完善 之前我们使用的都是urdf文件格式的模型，在很多情况下，ROS对urdf文件的支持并不是很好，使用宏定义的.xacro文件兼容性更好，扩展性也更好。所以我们把之前的urdf文件重新整理编写成.xacro文件。 .xacro文件主要分为三部分： 1、机器人主体smartcar_body.urdf.xacro <?xml version="1.0"?> <robot name="smartcar" xmlns:xacro="http://ros.org/wiki/xacro"> <property name="M_PI" value="3.14159"/> <include filename="$(find smartcar_description)/urdf/gazebo.urdf.xacro"/> <property name="base_x" value="0.33" /> <property name="base_y" value="0.33" /> <xacro:macro name="smartcar_body"> <inertial> <origin xyz="0 0 0.055"/> <mass value="1.0" /> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> <visual> <geometry> <box size="0.25 .16 .05"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0.055"/> <material name="blue"> <color rgba="0 0 .8 1"/> </material> </visual> <collision> <origin rpy="0 0 0" xyz="0 0 0.055"/> <geometry> <box size="0.25 .16 .05" /> </geometry> </collision> <inertial> <origin xyz="0.08 0.08 0.025"/> <mass value="0.1" /> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> <visual> <geometry> <cylinder length=".02" radius="0.025"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> <collision> <origin rpy="0 1.57075 1.57075" xyz="0.08 0.08 0.025"/> <geometry> <cylinder length=".02" radius="0.025"/> </geometry> </collision> <joint name="left_front_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="left_front_wheel"/> <origin rpy="0 1.57075 1.57075" xyz="0.08 0.08 0.025"/> <limit effort="100" velocity="100"/> <joint_properties damping="0.0" friction="0.0"/> </joint> <inertial> <origin xyz="0.08 -0.08 0.025"/> <mass value="0.1" /> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="…

ROS探索总结-7.smartcar源码上传
type: item
date: 2016-09-23T13:12:00+00:00
description: smartcar源码上传 修改版：2016-10-13 by ncnynl 看到前面写的博客还是帮助了很多ROS的学习者，我感到非常荣幸。其实我也是一名ROS的新手，ROS的相关资料少，上手难度大，我现在也在摸索着学习，还希望大家都将自己的学习成果在网上或者ROS群里分享。 我看到有些人在运行我前面写的smartcar程序，为了方便大家的学习，我这两天整理了一下代码，已经上传到csdn上，下载请见： http://download.csdn.net/detail/hcx25909/5487985 或者 http://file.ncnynl.com/ros/smartcar.zip 下载 注意：修改的indigo版本： http://file.ncnynl.com/ros/smartcar_description_indigo_ncnynl.com.tar.gz 下载 注意事项 代码的内容主要是前边用到的机器人smartcar的urdf文件，已经运行使用的launch文件，大家下载后可以直接编译使用，由于代码在我的计算机上编译时带有路径信息，所以大家编译的时候请使用下面的命令先清除再编译： rosmake smartcar_description --pre-clean 注意：indigo版本用catkin编译： $ cd ~/catkin_ws/ $ catkin_make 代码中的urdf文件里室机器人的urdf描述，和上一篇博客中讲的是一样的，launch文件夹中主要有以下文件： 第一个实在gazebo仿真中用到的，需要先运行gazebo，然后再运行。但是貌似有问题，我每次加载到gazebo中的时候似乎物理参数不对，机器人在gazebo里飞来飞去的，至今还没有解决。如果哪位仁兄发现问题了，还请多多指教。 第二个文件是我在绘制模型的时候用到的，主要功能是在rviz中显示机器人模型，文件中的以下代码： <arg name="gui" default="false" /> 如果把false改为true，则会打开一个gui的调试界面，可以通过滑动条旋转车轮，如下图所示。默认是false。 第三个文件是在方针的时候用到的，就是前面博客中使用的，会打开arbotix仿真器。 根目录中还有rviz的配置文件urdf.vcg，只要大家在rviz中修改界面或者参数，推出的时候保存，就会自动修改这个文件了。 config文件夹下的是仿真用到的配置文件。 PS：代码中还有很多问题，请大家多多指教，共同进步。

ROS探索总结-8.键盘控制
type: item
date: 2016-09-23T13:13:00+00:00
description: 键盘控制 如果尝试过前面的例子，有没有感觉每次让机器人移动还要在终端里输入指令，这也太麻烦了，有没有办法通过键盘来控制机器人的移动呢？答案室当然的了。我研究了其他几个机器人键盘控制的代码，还是有所收获的，最后移植到了smartcar上，实验成功。 一、创建控制包 首先，我们为键盘控制单独建立一个包： roscreate-pkg smartcar_teleop rospy geometry_msgs std_msgs roscpp rosmake 如果你已经忘记了怎么建立包，请参考：http://www.ros.org/wiki/ROS/Tutorials/CreatingPackage 二、简单的消息发布 在机器人仿真中，主要控制机器人移动的就是Twist()结构，如果我们编程将这个结构通过程序发布成topic，自然就可以控制机器人了。我们先用简单的python来尝试一下。 之前的模拟中，我们使用的都是在命令行下进行的消息发布，现在我们需要把这些命令转换成python代码，封装到一个单独的节点中去。针对之前的命令行，我们可以很简单的在smartcar_teleop /scripts文件夹下编写如下的控制代码： #!/usr/bin/env python import roslib; roslib.load_manifest('smartcar_teleop') import rospy from geometry_msgs.msg import Twist from std_msgs.msg import String class Teleop: def __init__(self): pub = rospy.Publisher('cmd_vel', Twist) rospy.init_node('smartcar_teleop') rate = rospy.Rate(rospy.get_param('~hz', 1)) self.cmd = None cmd = Twist() cmd.linear.x = 0.2 cmd.linear.y = 0 cmd.linear.z = 0 cmd.angular.z = 0 cmd.angular.z = 0 cmd.angular.z = 0.5 self.cmd = cmd while not rospy.is_shutdown(): str = "hello world %s" % rospy.get_time() rospy.loginfo(str) pub.publish(self.cmd) rate.sleep() if __name__ == '__main__':Teleop() python代码在ROS中是不需要编译的。先运行之前教程中用到的smartcar机器人，在rviz中进行显示，然后新建终端，输入如下命令： rosrun smartcar_teleop teleop.py 也可以建立一个launch文件运行： <launch> <arg name="cmd_topic" default="cmd_vel" /> <node pkg="smartcar_teleop" type="teleop.py" name="smartcar_teleop"> <remap from="cmd_vel" to="$(arg cmd_topic)" /> </node> </launch> 在rviz中看一下机器人是不是动起来了！ 三、加入键盘控制 当然前边的程序不是我们要的，我们需要的键盘控制。 1、移植 因为ROS的代码具有很强的可移植性，所以用键盘控制的代码其实可以直接从其他机器人包中移植过来，在这里我主要参考的是erratic_robot，在这个机器人的代码中有一个erratic_teleop包，可以直接移植过来使用。 首先，我们将其中src文件夹下的keyboard.cpp代码文件直接拷贝到我们smartcar_teleop包的src文件夹下，然后修改CMakeLists.txt文件，将下列代码加入文件底部： rosbuild_add_boost_directories() rosbuild_add_executable(smartcar_keyboard_teleop src/keyboard.cpp) target_link_libraries(smartcar_keyboard_teleop boost_thread) 编译完成后，运行smartcar模型。重新打开一个终端，打开键盘控制节点： 在终端中按下键盘里的“W”、“S”、“D”、“A”以及“Shift”键进行机器人的控制。效果如下图： 2、复用 因为代码是我们直接复制过来的，其中有很多与之前err…

ROS探索总结-9.操作杆控制
type: item
date: 2016-09-23T13:13:00+00:00
description: 操作杆控制 对于移动机器人，键盘的控制往往满足不了我们的需求，以前看好多电影里边都是用一个摇杆来控制机器人的，简直帅爆了，正好我这里有一个操作杆，那就来尝试感受一下。 操作杆（joystick）控制会更加有操作感，ROS中的很多机器人也带有操作杆的相关代码，只需要简单的移植即可。我们使用的是赛钛客（saitek）的一款操作杆，如下图所示： 使用的移植代码是clearpath_husky机器人中的python代码。 参考链接： http://www.ros.org/wiki/joy 一、测试操作杆驱动 首先将操作杆的接口插入电脑，然后在终端中输入： ls /dev/input/ 显示如下： 其中的js0就代表我们的操作杆。然后测试操作杆的操作是否有效，输入: sudo jstest /dev/input/js0 然后会在终端中显示操作杆的各个控制值的即时值，操作操作杆，如果每个按键和操作都有效，说明操作杆是正常的。最后在ROS中的节点里进行测试。打开joy节点： rosrun joy joy_node 再打开一个窗口，输入下面命令，查看数据: rostopic echo joy 操作操作杆，窗口下面的数据就开始刷新。 二、控制代码 从上面的测试中，我们发现在前后左右摇动操作杆时，相应改变的数据是Axes中0号和1号位的数据，也是我们最常用的数据，其他按键对应的位置也可以找到，编程的时候就是利用的这些数据位置，所以一定要找到每个按键的对应编号。 ROS中已经为我们建立了操作杆的数据结构： 我们主要用到的就是axes和buttons数据。最终的代码如下： import roslib; roslib.load_manifest('smartcar_teleop') import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist from std_msgs.msg import String class Teleop: def __init__(self): rospy.init_node('smartcar_teleop_joy') self.turn_scale = rospy.get_param('~turn_scale') self.drive_scale = rospy.get_param('~drive_scale') self.deadman_button = rospy.get_param('~deadman_button', 0) self.cmd = None cmd_pub = rospy.Publisher('cmd_vel', Twist) announce_pub = rospy.Publisher('/smartcar/announce/teleops', String, latch=True) announce_pub.publish(rospy.get_namespace()); rospy.Subscriber("joy", Joy, self.callback) rate = rospy.Rate(rospy.get_param('~hz', 20)) while not rospy.is_shutdown(): rate.sleep() if self.cmd: cmd_pub.publish(self.cmd) def callback(self, data): """ Receive joystick data, formulate Twist message. """ cmd = Twist() cmd.linear.x = data.axes[1] * self.drive_scale cmd.angular.z = data.axes[0] * self.turn_scale if data.buttons[self.deadman_button] == 1: self.cmd = cmd else: self.cmd = None if __name__ == "__main__": Teleop() 三、机器人控制 首先来创建一个launch文件（teleop_joy.launch）: <launch> <arg name="drive_speed" default="1.0" /> <arg name="turn_speed" default="1.0" /> <arg name="joy_dev" default="/dev/input/js0" /> <arg name="cmd_topic" default="cmd_vel" /> <node pkg="joy" type="j…

ROS探索总结-11.机器视觉
type: item
date: 2016-09-23T13:42:00+00:00
description: 机器视觉 机器视觉在计算机时代已经越来越流行，摄像头价格越来越低廉，部分集成深度传感器的混合型传感器也逐渐在研究领域普及，例如微软推出的Kinect，而且与之配套的软件功能十分强大，为开发带来了极大的便利。ROS集成了Kinect的的驱动包OpenNI，而且使用OpenCV库可以进行多种多样的图像处理。 注：本章内容及代码均参考《ROS by Example》书中的第十章。 一、图像显示 我们从最基础的开始，想办法显示Kinect的图像数据。 1、安装驱动包 安装步骤很简单： $sudo apt-get install ros-fuerte-openni-kinect 2、测试 首先运行kinect节点： $roslaunch rbx1_vision openni_node_fuerte.launch 然后我们调用ROS的image_view包来直接显示摄像头的数据库。 image_view包的介绍可以参考：http://www.ros.org/wiki/image_view。 $rosrun image_view image_view image:=/camera/rgb/image_color 我们可以看到弹出了一个独立的图像显示框： 3、分析数据 下图是我们上面测试中的节点图。 我们可以使用如下的命令来查看节点之间发送的图像消息是什么样的： rostopic echo /camera/rgb/image_color 然后就会看到数据刷刷的在显示，有没有感觉看不清楚，我们使用终端的重定向功能将数据全部存储到文件中： rostopic echo /camera/rgb/image_color > test 好了，现在看看文件中是不是已经有数据了，我们来看一下其中的一帧数据： header: seq: 19285 stamp: secs: 1370867560 nsecs: 538447820 frame_id: camera_rgb_optical_frame height: 240 width: 320 encoding: rgb8 is_bigendian: 0 step: 960 data: [223, 225, 225, 220, 225, 225…………….. 从数据中我们可以的出来几个很重要的参数，首先是图像的分辨率：240320，编码的格式是rgb8，也就是说图像应该有240320=76800个像素，而每个像素由八位的R、G、B三个数据组成，因此我们可以预计下面的data中应该有76800*3=230400个八位的数据了。 我们可以验证一下data中到底有多少个数据，这个很简单了，数一下就行了，不过好像有点多，我使用的是linux的“wc”命令。首先我一帧数据复制到单独的文件中，每个数据都是用“，”号隔开的，只要计算“，”的数量就知道数据的数量了。 结果和我们预想的是一样的。知道这个数据格式以后，我们以后就可以直接把其他摄像头的数据装换成这种格式的数据就可以直接在ROS中使用了。 4、rviz显示图像 我们再来点高级的。rviz是我们经常使用的工具，把图像显示在rviz中才更有应用价值。rviz已经为我们提供好了显示图像的接口，使用非常简单。 首先按照上一节的方法运行kinect节点，然后打开rviz： rosrun rviz rviz 然后修改“Fixed Frame”为/camera_rgb_color，修改“Target Frame”为，接着点击add，选择camera类型。添加成功后选择camera菜单下的Iamge Topic选项，选择/camera/rgb/image_color，确定后下面的显示框内就显示图像了。 二、深度显示 使用kinect的一大特色就是可以获得传感器的深度数据，也就是物体距离传感器的距离，传说kinect的可识别范围在60cm到10m之间。 1、显示深度图像 首先也需要运行Kinect的节点： roslaunch openni_launch openni.launch 这一步我使用的是ROS安装openni包中的节点，使用与前面相同的命令运行的节点在后面无法产生深度数据。 然后同样适用iamge_view包就可以简单的显示深度图像了： rosrun image_view disparity_view image:=/camera/depth/disparity 2、rviz中显示深度 首先运行rviz： rosrun rviz rviz 然后修改“Fixed Frame”和“Target Frame”，在add中添加PointCloud2类型，修改“topic”，具体参数如下图所示：

ROS探索总结-12.坐标系统
type: item
date: 2016-09-23T13:43:00+00:00
description: 坐标系统 在机器人的控制中，坐标系统是非常重要的，在ROS使用tf软件库进行坐标转换。 相关链接：http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一、tf简介 我们通过一个小小的实例来介绍tf的作用。 1、安装turtle包 $ rosdep install turtle_tf rviz $ rosmake turtle_tf rviz 2、运行demo 运行简单的demo： $ roslaunch turtle_tf turtle_tf_demo.launch 然后就会看到两只小乌龟了。 该例程中带有turtlesim仿真，可以在终端激活的情况下进行键盘控制。 可以发现，第二只乌龟会跟随你移动的乌龟进行移动。 3、demo分析 接下来我们就来看一看到底ROS做了什么事情。 这个例程使用tf建立了三个参考系：a world frame, a turtle1 frame, and a turtle2 frame。然后使用tf broadcaster发布乌龟的参考系，并且使用tf listener计算乌龟参考系之间的差异，使得第二只乌龟跟随第一只乌龟。 我们可以使用tf工具来具体研究。 $ rosrun tf view_frames 然后会看到一些提示，并且生成了一个frames.pdf文件。 该文件描述了参考系之间的联系。三个节点分别是三个参考系，而/world是其他两个乌龟参考系的父参考系。还包含一些调试需要的发送频率、最近时间等信息。 tf还提供了一个tf_echo工具来查看两个广播参考系之间的关系。我们可以看一下第二只得乌龟坐标是怎么根据第一只乌龟得出来的。 $ rosrun tf tf_echo turtle1 turtle2 控制一只乌龟，在终端中会看到第二只乌龟的坐标转换关系。 我们也可以通过rviz的图形界面更加形象的看到这三者之间的关系。 $ rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.vcg 移动乌龟，可以看到在rviz中的坐标会跟随变化。其中左下角的是/world，其他两个是乌龟的参考系。 下面我们就来详细分析这个实例。 二、Writing a tf broadcaster 1、创建包 $ roscd tutorials $ roscreate-pkg learning_tf tf roscpp rospy turtlesim $ rosmake learning_tf 2、broadcast transforms 我们首先看一下如何把参考系发布到tf。 代码文件：/nodes/turtle_tf_broadcaster.py #!/usr/bin/env python import roslib roslib.load_manifest('learning_tf') import rospy import tf import turtlesim.msg def handle_turtle_pose(msg, turtlename): br = tf.TransformBroadcaster() br.sendTransform((msg.x, msg.y, 0), tf.transformations.quaternion_from_euler(0, 0, msg.theta), rospy.Time.now(), turtlename, "world") #发布乌龟的平移和翻转 if __name__ == '__main__': rospy.init_node('turtle_tf_broadcaster') turtlename = rospy.get_param('~turtle') #获取海龟的名字（turtle1，turtle2） rospy.Subscriber('/%s/pose' % turtlename, turtlesim.msg.Pose, handle_turtle_pose, turtlename) #订阅 topic "turtleX/pose" rospy.spin() 创建launch文件start_demo.launch： <launch> <node pkg="turtlesim" type="turtlesim_node" name="sim"/> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/> <node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf…

ROS探索总结-14.move_base（路径规划）
type: item
date: 2016-09-23T13:45:00+00:00
description: move_base（路径规划） 在上一篇的博客中，我们一起学习了ROS定位于导航的总体框架，这一篇我们主要研究其中最重要的move_base包。 在总体框架图中可以看到，move_base提供了ROS导航的配置、运行、交互接口，它主要包括两个部分： （1） 全局路径规划（global planner）：根据给定的目标位置进行总体路径的规划； （2） 本地实时规划（local planner）：根据附近的障碍物进行躲避路线规划。 一、数据结构 ROS中定义了MoveBaseActionGoal数据结构来存储导航的目标位置数据，其中最重要的就是位置坐标（position）和方向（orientation）。 rosmsg show MoveBaseActionGoal [move_base_msgs/MoveBaseActionGoal]: std_msgs/Header header uint32 seq time stamp string frame_id actionlib_msgs/GoalID goal_id time stamp string id move_base_msgs/MoveBaseGoal goal geometry_msgs/PoseStamped target_pose std_msgs/Header header uint32 seq time stamp string frame_id 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 二、配置文件 move_base使用前需要配置一些参数：运行成本、机器人半径、到达目标位置的距离，机器人移动的速度，这些参数都在rbx1_nav包的以下几个配置文件中： ? base_local_planner_params.yaml ? costmap_common_params.yaml ? global_costmap_params.yaml ? local_costmap_params.yaml 三、全局路径规划（global planner） 在ROS的导航中，首先会通过全局路径规划，计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。 navfn通过Dijkstra最优路径的算法，计算costmap上的最小花费路径，作为机器人的全局路线。将来在算法上应该还会加入A*算法。 具体见： http://www.ros.org/wiki/navfn?distro=fuerte 注意：indigo版本是： http://wiki.ros.org/navfn?distro=indigo 四、本地实时规划（local planner） 本地的实时规划是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度（dx，dy，dtheta velocities）。 base_local_planner这个包通过地图数据，通过算法搜索到达目标的多条路经，利用一些评价标准（是否会撞击障碍物，所需要的时间等等）选取最优的路径，并且计算所需要的实时速度和角度。 其中，Trajectory Rollout 和Dynamic Window approaches算法的主要思路如下： （1） 采样机器人当前的状态（dx,dy,dtheta）； （2） 针对每个采样的速度，计算机器人以该速度行驶一段时间后的状态，得出一条行驶的路线。 （3） 利用一些评价标准为多条路线打分。 （4） 根据打分，选择最优路径。 （5） 重复上面过程。 具体参见： http://www.ros.org/wiki/base_local_planner?distro=groovy 注意：indigo版本是： http://www.ros.org/wiki/base_local_planner?distro=indigo 五、ArbotiX仿真——手动设定目标 在这一步，我们暂时使用空白地图（blank_map.pgm），就在空地上进行无障碍仿真。 首先运行ArbotiX节点，并且加载机器人的URDF文件。 roslaunch rbx1_bringup fake_turtlebot.launch 然后运行move_base和加载空白地图的launch文件（fake_move_base_blank_map.l…