ROS学习笔记(一)ROS基础入门 — 参考创客制造

2016年12月8日 Thur
我是看的这土豆网的教程
http://www.tudou.com/listplay/nZHW3aBlxmw/XIovKWZJF2o.html
ROS是依赖于某种空间组合的概念,而这种概念是通过配置脚本环境来说实现的。
检查ROS_ROOT和ROS_PACKAGE_PATH的方法:

ROS中文论坛网址:
http://www.cnros.org/forum.php?mod=viewthread&tid=1&extra=page%3D10

SLAMcn:
http://www.slamcn.org/index.php/%E9%A6%96%E9%A1%B5

简直是福音,ROS是支持先锋机器人的,意味我可以用很多人已经开发的好的包,会降低我的开发成本,那么基本上可以说,用先锋机器人来代替turtlbot了
在这里放一下链接地址


打算跟着创客智造的学习走:
http://www.ncnynl.com/archives/201608/498.html

ROS 一些最基本也是最重要的概念
1.Packages: Package是ROS系统中最底层最基本的组织,里面存放各种文件:库、工具、可执行文件等.
2.Manifest: 一个package描述xml文件,定义package之间的依赖关系.
3.Stacks: package的集合,比package这个概念高一级别
4.Stack Manifest: 作用类似package manifest文件,但是它是针对stack的.
在文件系统中很容易识别package和stack:
1.package是一个包含 manifest.xml 文件的目录.
2.stack是一个包含 stack.xml 文件的目录.

ROS学习笔记(一)ROS基础入门 — 参考创客制造_第1张图片
2.3 文件系统工具
ROS中大量代码分散在众多的packages和stacks之中. 命令工具ls 和 cd已不能满足检索要求。因此ROS提供了一套自己的命令工具来完成与这些命令相似的工作.
2.3.1 使用rospack和rosstack
rospack 和 rosstack 命令都包含于 rospack package中. 两个命令用于获取packages 和stacks的信息. 教程中我们只提及命令的find的参数,作用是返回相应package或者stack的目录路径. 用法:
这里写图片描述
roscd用于快速进入同的目录
这里写图片描述
roscd log用于切换到ROS存储知识文件的目录
使用rosls 用于列出指定的package和stack中的文件和目录

一个catkin程序包由什么组成?
1、package.xml 文件
2、包含一个catkin版本的CMakeLists.txt文件
3、每个目录下只能有一个程序包,也就是说同一个目录下面不能嵌套多个程序的包

my_package/
    CMakeLists.txt
    package.xml

我如果想建一个catkin程序的包的时候
他的总体的框架:

workspace_folder/
    src/
        CMakeLists.txt
        package.xml
        package01/
            CMakeLists.txt
            package.xml
        package02/
            CMakeLists.txt
            package.xml
        package03/
            CMakeLists.txt
            package.xml

在home的目录下按ctrl + h 然后找到对应的 .bashrc
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第2张图片

现在使用catkin_create_pkg命令来创建一个名为’beginner_tutorials’的新程序包,这个程序包依赖于std_msgs、roscpp和rospy
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第3张图片
这将会创建一个名为beginner_tutorials的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经自动包含了部分你在执行catkin_create_pkg命令时提供的信息。
catkin_create_pkg命令会要求你输入package_name,如果有需要你还可以在后面添加一些需要依赖的其它程序包,这里的depend就是他的依赖项
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第4张图片
程序包之间的依赖关系
一级依赖
可以用rospack 可以查看一级依赖的关系
但是我在做的时候回有这个问题
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第5张图片
定义自己的package.xml
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第6张图片
描述标签:

<description>The beginner_tutorials packagedescription>

维护者标签

   7    
   8   
   9   
  10   <maintainer email="[email protected]">usermaintainer>

这是package.xml中要求填写的一个重要标签,因为它能够让其他人联系到程序包的相关人员。至少需要填写一个维护者名称,但如果有需要的话你可以添加多个。除了在标签里面填写维护者的名称外,还应该在标签的email属性中填写邮箱地址

许可标签

 12   
  13   
  14   
  15   <license>TODOlicense>

你应该选择一种许可协议并将它填写到这里。一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。

依赖项标签
接下来的标签用来描述程序包的各种依赖项,这些依赖项分为build_depend、buildtool_depend、run_depend、test_depend。

使用catkin_make进行编译
如果直接在刚刚建立的目录下面进行编译的话,就会出现如下错误:
这里写图片描述
那么该如何解决呢?
首先你应该退到RosWorSpace的工作目录下,然后输入 source /opt/ros/indigo/setup.bash
然后在catkin_make
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第7张图片


图概念概述
node : 就是一个可执行程序
topic :topic 是一个话题,节点发布消息到话题上面
message:在一个消息,消息是ROS的一个数据类型。用于订阅和发布一个话题
rosout :相当于 stdout
master:节点服务器,用于帮助找到彼此的节点

客户端
ROS的客户端运行不同的编程的语言之间的节点相互通信
rospy就是Python客户端
roscpp就是cpp客户端
rosjava 就是java客户端
rosjs 就是javascripts客户端
rosnode list 能够列出所有活跃的节点
rostpolic list 所有节点运行的话题
roservice list 所有节点的运行服务
rosparam list 所有节点的参数
rosbag info .bag
rosrun rqt_bag rqt_bag
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第8张图片

可视化节点检测

然后现在让我们跑小乌龟。

sudo apt-get install ros-indigo-ros-tutorials
roscore
rosrun turtlesim turtlesim_node

ROS学习笔记(一)ROS基础入门 — 参考创客制造_第9张图片
小海龟登场

如果想要给小海龟换名字的话:
这里写图片描述
这里写图片描述
注意两点:1、记得加冒号 2、__是两个

可以用rosnode cleanup来清除节点
rosnode ping <你的节点的名字>

打开一个新终端
rosrun turtlesim turtle_teleop_key
然后就可以用箭头移动小乌龟了
只有把这个终端窗口点击成主窗口,才能按上下键移动
常用的命令;
rosmsg show visualization_msgs/Marker
rosmsg list
rostopic list


这个下面主要是从小菜鸟上校的博客中学习到的
ROS的文件系统中有两个最基本的概念:Package 和 Manifest 也就是包和清单
package 是组织ROS代码中最基本的系统,每一个package包括一些库文件,可执行呢文件,脚本以及其他一些文件。
manifest文件是对package的下个相关信息一个描述
rospack用来获取一个包的相关信息
这里写图片描述
roscd 可以通过这个命令直接切换到相应文件下的目录下
这里写图片描述
用pwd来显示当前位置
rosls能够直接让你利用包的名字,去列举 包中的所有文件

创建属于自己的工作空间

ROS学习笔记(一)ROS基础入门 — 参考创客制造_第10张图片

mkdir -p ~/TestRos/src
cd TestRos/src
catkin_init_workspace
cd ..
catkin_make

之后看到这幅图片说明编译成功了;
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第11张图片
然后在命令窗口输入:ls
这里写图片描述
出现了build 和 devel 说明已经配置成功了。
然后你可以进到devel文件夹当中,你会发现一个.bash文件
接着输入

source devel/setup.bash

来配置你的文件夹
为了确保你的工作空间已经完全处理好了
输入echo $ROS_PACKAGE_PATH
输出以下:/home/davidhan/TestRos/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks
说明一个配置好了


一个catkin包主要有以下几个部分组成
1、必须包括一个package.xml文件
2、必须包括一个cmakelist.txt文件
3、在每个文件夹下面只能有一个包,并且包不能嵌套
比较推荐的包的格式:

    workspace_folder/        -- WORKSPACE  
      src/                   -- SOURCE SPACE  
        CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin  
        package_1/  
          CMakeLists.txt     -- CMakeLists.txt file for package_1  
          package.xml        -- Package manifest for package_1  
        ...  
        package_n/  
          CMakeLists.txt     -- CMakeLists.txt file for package_n  
          package.xml        -- Package manifest for package_n  

ROS入门教程 理解话题

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rosrun rqt_graph rqt_graph

如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会高亮显示。正如你所看到的,turtlesim_node和turtle_teleop_key节点正通过一个名为 /turtle1/command_velocity的话题来互相通信。
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第12张图片

 rostopic echo /turtle1/cmd_vel

你可能看不到任何东西因为现在还没有数据发布到该话题上。接下来我们通过按下方向键使turtle_teleop_key节点发布数据。记住如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。
现在当你按下向上方向键时应该会看到下面的信息:

linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0

使用 rostopic list 能够列出所有当前订阅和发布的话题
使用 rostopic type 用来查看所发布话题的消息类型。

rostopic type /turtle1/cmd_vel

你应该会看到:geometry_msgs/Twist
使用rosmsg命令来查看消息的详细情况

rosmsg show geometry_msgs/Twist

使用 rostopic pub 可以把数据发布到当前某个正在广播的话题上。

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

他的格式:

rostopic pub [topic] [msg_type] [args]

-1 使rostopic发布一条消息后马上退出
/turtle1/command_velocity 这是消息所发布到的话题名称
turtlesim/Velocity 这是所发布消息的类型。

-- (比如负号)时是必须要添加的。

正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。
在本例中,2.0是linear的值,1.8是angular的值。这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。
你可能已经注意到turtle已经停止移动了。这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。我们可以使用rostopicpub-r命令来发布一个稳定的命令

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

ROS学习笔记(一)ROS基础入门 — 参考创客制造_第13张图片
使用 rostopic hz 用来查看数据发布的频率

rostopic hz /turtle1/pose

你会看到:

subscribed to [/turtle1/pose]
average rate: 59.354
        min: 0.005s max: 0.027s std dev: 0.00284s window: 58
average rate: 59.459
        min: 0.005s max: 0.027s std dev: 0.00271s window: 118
average rate: 59.539
        min: 0.004s max: 0.030s std dev: 0.00339s window: 177
average rate: 59.492
        min: 0.004s max: 0.030s std dev: 0.00380s window: 237
average rate: 59.463
        min: 0.004s max: 0.030s std dev: 0.00380s window: 290

现在我们可以知道了turtlesim正以大约60Hz的频率发布数据给turtle
使用 rqt_plot 可以实时显示一个发布到某个话题上的数据变化图形

ROS入门教程-1.1.7 理解ROS服务和参数

ROS Services服务是节点之间的通讯的另一种方式,服务允许节点发送一个请求,并且获得一个响应(response)
使用rosservice 可以轻松的使用 ROS 客户端/服务器框架提供的服务。rosservice提供了很多可以在topic上使用的命令,如下所示:

rosservice list         输出可用服务的信息
rosservice call         调用带参数的服务
rosservice type         输出服务类型
rosservice find         依据类型寻找服务find services by service type
rosservice uri          输出服务的ROSRPC uri

简单来说rosservice也是一种信息发布的机制

rosservice call spawn 2 2 0.2  ""

这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。名字参数是可选的,这里我们不设具体的名字,让turtlesim自动创建一个
rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。

rosparam set            设置参数
rosparam get            获取参数
rosparam load           从文件读取参数
rosparam dump           向文件中写入参数
rosparam delete         删除参数
rosparam list           列出参数名

rosparam set background_r 150 可以修改背景颜色
rosservice call clear 执行这条命令后生效
rosparam get background_g 用来获取背景的绿色通道的值
使用rosparam get/来显示参数服务器上的所有内容

ROS入门教程-1.1.8 使用 rqt_console 和 roslaunch

使用rqt_console和rqt_logger_level
rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。

rosrun rqt_console rqt_console
rosrun rqt_logger_level rqt_logger_level

会弹出两个窗口
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第14张图片

使用roslaunch来启动多个turtlesim节点和一个模仿节点以让一个turtlesim节点来模仿另一个turtlesim节点。
roslaunch可以用来启动定义在launch文件中的多个节点。

 roslaunch [package] [filename.launch]

ROS学习笔记(一)ROS基础入门 — 参考创客制造_第15张图片
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第16张图片

   1 <launch>
   2 
   3   <group ns="turtlesim1">//这是说明这个的命名空间
   4     <node pkg="turtlesim" name="sim" type="turtlesim_node"/>//
   5   group>
   6 
   7   <group ns="turtlesim2">
   8     <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
   9   group>
  10 
  11   <node pkg="turtlesim" name="mimic" type="mimic">
  12     <remap from="input" to="turtlesim1/turtle1"/>
  13     <remap from="output" to="turtlesim2/turtle1"/>
  14   node>
  15 
  16 launch>

创建了两个节点分组并以’命名空间(namespace)’标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为’sim’。这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。在这里我们启动模仿节点,并将所有话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就会使turtlesim2模仿turtlesim1。

roslaunch beginner_tutorials turtlemimic.launch
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

使用 rosed 是 rosbash 的一部分。利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。
使用方法:

rosed [package_name] [filename]

ROS入门教程-1.1.10 创建ROS消息和ROS服务

消息msg文件就是一个描述ROS所使用消息类型的简单文本,他们会被用来生成不同语言的源代码。
服务srv,一个srv文件描述一项服务,这个服务包含两个部分:请求和响应
msg文件存放在package的msg目录下,srv文件则是存放在srv目录下。
msg文件实际上就是每个声明一个数据类型和变量名
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第17张图片
使用 srv
创建一个srv
在刚刚那个package中创建一个服务:
mkdir srv
roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能。 使用方法:

roscp [package_name] [file_to_copy_path] [copy_path]

使用 rossrv
以上就是创建一个服务所需的所有步骤。下面通过rosmsgshow命令,检查ROS是否能够识该服务。 使用方法:

rossrv show type>

ROS入门教程-1.1.11 编写简单的消息发布器和订阅器 (C++) catkin方式

节点(Node)” 是ROS中指代连接到ROS网络的可执行文件的术语

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{

  ros::init(argc, argv, "talker");//初始化ROS
  ros::NodeHandle n;//为这个进程的节点创建的一个句柄
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//告诉master我们将要在chatter topic上发布一个std_msgs/String的消息。这样master就会告诉所有订阅了chatter topic的节点,将要有数据发布。第二个参数是发布序列的大小。
  ros::Rate loop_rate(10);//ros::Rate对象可以允许你指定自循环的频率。它会追踪记录自上一次调用Rate::sleep()后时间的流逝,并休眠直到一个频率周期的时间。
在这个例子中,我们让它以10hz的频率运行。
  int count = 0;
  while (ros::ok())//ros::ok()返回false,如果下列条件之一发生:
1、SIGINT接收到(Ctrl-C)
2、被另一同名节点踢出ROS网络
3、ros::shutdown()被程序的另一部分调用
4、所有的ros::NodeHandles都已经被销毁
  {
    std_msgs::String msg;

    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

    ROS_INFO("%s", msg.data.c_str());
    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();//这条语句是调用ros::Rate对象来休眠一段时间以使得发布频率为10hz。
    ++count;
  }


  return 0;
//对上边的内容进行一下总结:
1、初始化ROS系统
2、在ROS网络内广播我们将要在chatter topic上发布std_msgs/String消息
3、以每秒10次的频率在chatter上发布消息
}
#include "ros/ros.h"
#include "std_msgs/String.h"

//这是一个回调函数,当消息到达chatter topic的时候就会被调用。消息是以 boost shared_ptr指针的形式传输,这就意味着你可以存储它而又不需要复制数据
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{

  ros::init(argc, argv, "listener");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);//告诉master我们要订阅chatter topic上的消息。当有消息到达topic时,ROS就会调用chatterCallback()函数。第二个参数是队列大小,以防我们处理消息的速度不够快,在缓存了1000个消息后,再有新的消息到来就将开始丢弃先前接收的消息。
  ros::spin();//ros::spin()进入自循环,可以尽可能快的调用消息回调函数。

  return 0;
}
//对上边的内容进行一下总结:
初始化ROS系统
订阅chatter topic
进入自循环,等待消息的到达
当消息到达,调用chatterCallback()函数
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)

## Declare ROS messages and services
add_message_files(FILES Num.msg)
add_service_files(FILES AddTwoInts.srv)

## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)

## Declare a catkin package
catkin_package()

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

ROS入门教程-1.1.12 写一个简单的消息发布器和订阅器 (Python) catkin方式

ROS入门教程-1.1.13 测试消息发布器和订阅器

启动发布器

rosrun beginner_tutorials talker      (C++)
rosrun beginner_tutorials talker.py   (Python) 

启动订阅器

$ rosrun beginner_tutorials listener     (C++)
$ rosrun beginner_tutorials listener.py  (Python) 

ROS入门教程-1.1.14 编写简单的Service和Client (C++) CATKIN方式

编写service节点、

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"

bool add(beginner_tutorials::AddTwoInts::Request  &req,
         beginner_tutorials::AddTwoInts::Response &res)
{
  res.sum = req.a + req.b;
  ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  return true;
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_server");
  ros::NodeHandle n;

  ros::ServiceServer service = n.advertiseService("add_two_ints", add);
  ROS_INFO("Ready to add two ints.");
  ros::spin();

  return 0;
}

编写client节点

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include 

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_client");
  if (argc != 3)
  {
    ROS_INFO("usage: add_two_ints_client X Y");
    return 1;
  }

  ros::NodeHandle n;
  ros::ServiceClient client = n.serviceClient("add_two_ints");
  beginner_tutorials::AddTwoInts srv;
  srv.request.a = atoll(argv[1]);
  srv.request.b = atoll(argv[2]);
  if (client.call(srv))
  {
    ROS_INFO("Sum: %ld", (long int)srv.response.sum);
  }
  else
  {
    ROS_ERROR("Failed to call service add_two_ints");
    return 1;
  }

  return 0;
}

编写节点

add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)

add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

ROS入门教程-1.1.16 测试简单的Service和Client

运行Service

$ rosrun beginner_tutorials add_two_ints_server     (C++)
$ rosrun beginner_tutorials add_two_ints_server.py  (Python)

运行Client

$ rosrun beginner_tutorials add_two_ints_client 1 3     (C++)
$ rosrun beginner_tutorials add_two_ints_client.py 1 3  (Python)

ROS入门教程-1.1.17 录制与回放数据

录制所有发布的话题
首先让我们来检查看当前系统中发布的所有话题。要完成此操作请打开一个新终端并执行:

rostopic list -v

这应该会生成以下输出:

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
 * /rosout [roslib/Log] 2 publishers
 * /rosout_agg [roslib/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
 * /rosout [roslib/Log] 1 subscriber

上面所发布话题部分列出的话题消息是唯一可以被录制保存到文件中的的话题消息,因为只有消息已经发布了才可以被录制。/turtle1/command_velocity话题是teleop_turtle节点所发布的命令消息并作为turtlesim节点的输入。而/turtle1/color_sensor和/turtle1/pose是turtlesim节点发布出来的话题消息。
现在我们开始录制。打开一个新的终端窗口,在终端中执行以下命令:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a

在这里我们先建立一个用于录制的临时目录,然后在该目录下运行rosbag record命令,并附加-a选项,该选项表示将当前发布的所有话题数据都录制保存到一个bag文件中。
然后回到turtle_teleop节点所在的终端窗口并控制turtle随处移动10秒钟左右。
在运行rosbag record命令的窗口中按Ctrl-C退出该命令。现在检查看~/bagfiles目录中的内容,你应该会看到一个以年份、日期和时间命名并以.bag作为后缀的文件。这个就是bag文件,它包含rosbag record运行期间所有节点发布的话题。

检查并回放bag文件
现在我们已经使用rosbag record命令录制了一个bag文件,接下来我们可以使用rosbag info检查看它的内容,使用rosbag play命令回放出来。

rosbag info <your bagfile>

你应该会看到如下类似信息:

bag: 2009-12-04-15-02-56.bag
version: 1.2
start_time: 1259967777871383000
end_time: 1259967797238692999
length: 19367309999
topics:
  - name: /rosout
    count: 2
    datatype: roslib/Log
    md5sum: acffd30cd6b6de30f120938c17c593fb
  - name: /turtle1/color_sensor
    count: 1122
    datatype: turtlesim/Color
    md5sum: 353891e354491c51aabe32df673fb446
  - name: /turtle1/command_velocity
    count: 23
    datatype: turtlesim/Velocity
    md5sum: 9d5c2dcd348ac8f76ce2a4307bd63a13
  - name: /turtle1/pose
    count: 1121
    datatype: turtlesim/Pose
    md5sum: 863b248d5016ca62ea2e895ae5265cf9

下一步是回放bag文件以再现系统运行过程。首先在turtle_teleop_key节点运行时所在的终端窗口中按Ctrl+C退出该节点。让turtlesim节点继续运行。在终端中bag文件所在目录下运行以下命令:

录制数据子集
当运行一个复杂的系统时,比如PR2软件系统,会有几百个话题被发布,有些话题会发布大量数据(比如包含摄像头图像流的话题)。在这种系统中,要想把所有话题都录制保存到硬盘上的单个bag文件中是不切实际的。rosbag record命令支持只录制某些特别指定的话题到单个bag文件中,这样就允许用户只录制他们感兴趣的话题。

ROS入门教程-1.1.18 roswtf入门

在你开始本教程之前请确保roscore没在运行。
roswtf会对一些系统中看起来异常但可能是正常的运行情况发出警告。也会对确实有问题的情况报告错误。

ROS入门教程-1.2.1 手动创建ROS package catkin方式

package.xml 文件使得像rospack这类工具能够检测出我们所创建的package的依赖项.

ROS入门教程-1.2.2 管理系统依赖项

rosdep安装系统依赖项.

rosdep install turtlesim

ROS入门教程-1.2.3 Roslaunch在大型项目中的使用技巧


扩展:
用ros来测试自己的摄像头
sudo apt-get install cheese
cheese
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第18张图片


Kobuki仿真
主要是想一用rviz
http://www.ncnynl.com/archives/201611/1113.html
参考这里的博客
sudo apt-get install ros-indigo-kobuki-soft
roslaunch kobuki_softnode full.launch
rosrun rviz rviz
设置 fixed frame ‘/odom’
增加 RobotModel
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第19张图片

ROS安装Ardunio

sudo apt-get install arduino
http://www.ncnynl.com/archives/201610/918.html

Ros安装pycharm
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第20张图片
ROS学习笔记(一)ROS基础入门 — 参考创客制造_第21张图片
配置pycharm
设置快捷键,使从快捷方式启动PyCharm的同时加载ROS环境变量

gedit ~/.local/share/applications/jetbrains-pycharm.desktop   #如果选择安装为当前用户可用

在打开的文档编辑器中输入一下内容

[Desktop Entry]
Version=1.0
Type=Application
Name=PyCharm 
Icon=/home/ubu/tools/pycharm-professional-2016.2.3/bin/pycharm.png
Exec= bash -i -c "/home/ubu/tools/pycharm-professional-2016.2.3/bin/pycharm.sh" %f
Comment=The Drive to Develop
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm

保存退出
找到pycharm保存就可以了
这个是个有用的东西。安装过程
http://blog.csdn.net/werm520/article/details/41249113


然后这个地方想把创客制造的部分关于C++感触写在这个这个地方。
目前我做到的的地方就是想编写一个简单的action来搞
初始化列表

     class A  
    {  
    public:  
       A(int i):a(i), b(i), c(i){}  

    private:  
       int a;  
       const int b;  
       int &c;  
    };  

后记:
然后今天我在其看了一边,还是有很多新的收获
rostopic 这个明亮

rostopic bw     display bandwidth used by topic
rostopic echo   print messages to screen
rostopic hz     display publishing rate of topic
rostopic list   print information about active topics
rostopic pub    publish data to topic
rostopic type   print topic type

rosnode ping nodename 可以看看这个里面到底有没有数据
不管怎么样,应该先打开控制台,然后在进行后面的东西,如果不是这样的话,那么可能显示不出来节点的信息。

原来直接用tab建可以现实话题的输出,根本没有自己原来想象的那么难。
然后这个框架可以记住,表示的

 rostopic pub  turtle1/cmd_vel geometry_msgswist -r 1 "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.3" 

其实就是在数据类型的后面,添加-r和1 然后就可以持续的发送数据
如果是在pub后面添加-1的话,只能吧一个数据发布3秒
我们通过rosdep install [package]来下载这个包相关的依赖项
然后这个地方写的两台ROS之间的通信
http://www.ncnynl.com/archives/201608/523.html

你可能感兴趣的:(【ROS探索】,先锋机器人ROS探索)