ROS学习笔记(二)

一、ROS的节点
1.前期准备:安装虚拟包

$sudo apt-get install ros-kinetic-tutorials

2.ROS概念(英文原版)

Nodes(节点): A node is an executable that uses ROS to communicate with other nodes.
Messages(消息): ROS data type used when subscribing or publishing to a topic.
Topics(话题): Nodes can publish messages to a topic as well as subscribe to a topic to receive messages.
Master: Name service for ROS (i.e. helps nodes find each other)
rosout: ROS equivalent of stdout/stderr
roscore: Master + rosout + parameter server (parameter server will be introduced later)
如果roscore没有初始化并发送有关缺少权限的消息,则可能是?/ .ros文件夹由root拥有,以递归方式更改该文件夹的所有权:
~/.bashrc 添加环境变量

$ rosnode list //查看当前正在跑的ROS节点
$ rosnode info /rosout //查看当前的系统ROS消息(订阅者,发布者)

使用rosrun启动节点

$ rosrun turtlesim turtlesim_node //启动节点 小乌龟窗口
$ rosnode list
/rosout
/turtlesim

修改节点名字

$rosrun turtlesim turtlesim_node __name:=my_turtle //关闭上一个节点,运行当前命令修改节点名字
$ rosnode list  
/my_turtle
/rosout
$ rosnode ping my_turtle //测试是否正常
二、理解ROS的话题
1.小海龟仿真
$ roscore           //开启ROS
$ rosrun turtlesim turtlesim_node  // 开启虚拟仿真节点
$ rosrun turtlesim turtle_teleop_key //开启键盘箭头控制小海龟
2.ROS话题

rqt_graph创建了一个动态图表,显示系统中发生了什么。rqt_graph是rqt包的一部分。

$ sudo apt-get install ros-<distro>-rqt  //安装ROS的话跳过这两句直接运行
$ sudo apt-get install ros-<distro>-rqt-common-plugins
$ rosrun rqt_graph rqt_graph
2.1 话题列表

话题参数列表

$ rostopic -h 
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

查看主题消息

$ rostopic echo topic 
$ rostopic list -h
Usage: rostopic list [/topic]

Options:
-h, --help show this help message and exit
-b BAGFILE, --bag=BAGFILE
list topics in .bag file
-v, --verbose list full details about each topic
-p list only publishers
-s list only subscribers

查看正在运行的话题

$ rostopic list -v  
Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 2 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] ics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber
3.ROS的消息
3.1 正在使用的消息类型

查看消息的详细情况

$ rostopic type /turtle1/command_velocity
$rosmsg show turtlesim/Velocity  

发布消息 ,格式为:rostopic pub [topic] [msg_type] [args]

$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8  //例子
$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8 //以1hz频率发送

查看数据发布的频率

$rostopic hz [topic] ostopic hz

查看节点图

$rqt_graph  

查看坐标图

$ rosrun rqt_plot rqt_plot
3.2 ROS服务

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

rosparam使得我们能够存储并操作ROS参数服务器(Parameter Server)上的数据。
参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。
rosparam使用YAML标记语言的语法。
一般而言,YAML的表述很简单:
1是整型
1.0是浮点型
one是字符串
true是布尔
[1,2,3]是整型列表
{a:b,c:d}是字典
rosparam有很多指令可以用来操作参数,如下所示:
使用方法:
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名

3.3ROS中参数

列出参数名

$rosparam list   
/background_b
/background_g
/background_r
/roslaunch/uris/aqy:51932
/run_id

修改背景颜色的红色通道:

$ rosparam set background_r 150 
$ rosservice call clear   //生效

获取背景的绿色通道的值

 $ rosparam get background_g 

显示参数服务器上的所有内容

 $ rosparam get   
    background_b: 255
    background_g: 86
    background_r: 150
    rosdistro: 'kinetic
    roslaunch:
    uris: {host_ubuntu__37149: 'http://ubuntu:37149/'}
    rosversion: '1.12.13'
    run_id: 30be30a0-9e26-11e8-9edf-000c290a5f97

存储信息

$ rosparam dump params.yaml  //保存信息
$ rosparam load params.yaml copy  //加载信息
$ rosparam get copy/background_b  //导入信息
3.4使用rqt_console和rqt_logger_level

rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息
rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)
查看日志

$ rosrun rqt_console rqt_console  

查看日志等级

$ rosrun rqt_logger_level rqt_logger_level 

Fatal 日志等级,设置后能看见以上的
Error
Warn
Info
Debug

launch文件内容

<launch>

<node name="talker"pkg="rospy_tutorials" type="talker" >

</node>?

</launch>

其中pkg=“rospy_tutorials”,这是自己要启动的节点所在的包;type=“talker”,这是自己写的节点.cpp程序通过编译生产的可执行文件的名字,你最初编译.cpp程序的时候要在CMakeLists.txt添加cpp程序编译的设置,这个可执行文件的名字在CMakeLists.txt中就可以找到;name=“talker”,这是节点的名字。
其他标签的含义

</node> 启动一个节点.
<param> 设置参数服务器上的参数
<remap> 声明一个名称的映射,允许你通过名称映射参数到ROS 节点(通过更结构化的方式而不是直接设置节点参数属性来启动的节点)。
<machine> 声明启动要使用的机器.
<rosparam> 使用rosparam 文件设置启动要用的ROS 参数
<include> 包含roslaunch 文件.
<env> 制定启动节点的环境变量
<test> 启动一个测试节点see rostest).
<arg> 声明参数
<group> 共享一个命名空间或映射的封闭的元素组。

编写一个海龟跟随另外一个海龟的启动文件

 <launch>
    <group ns="turtlesim1">
    
          <nodepkg="turtlesim" name="sim"type="turtlesim_node"/>
    
    </group>
    
    <group ns="turtlesim2">
    
          <node pkg="turtlesim"name="sim" type="turtlesim_node"/>
    
    </group>
    
            <groupns="turtlesim3">
    
          <nodepkg="turtlesim" name="sim"type="turtlesim_node"/>
    
    </group>     
    
                 <node pkg="turtlesim" name="turtle_mimic"type="mimic">
    
                  <remap from="input"to="turtlesim1/turtle1"/>
    
                  <remap from="output"to="turtlesim2/turtle1"/>
    
                  </node>
    
                  <node pkg="turtlesim" name="turtle_mimic1"type="mimic">
    
                  <remap from="input" to="turtlesim1/turtle1"/>
    
                  <remap from="output"to="turtlesim3/turtle1"/>
    
                 </node>   
    
    </launch>

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

3.5 创建msg文件
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

或者直接编辑Num.msg写更多的变量:

string first_name
string last_name
uint8 age
uint32 score

确保msg文件被转换成为C++,Python和其他语言的源代码,确保package.XML包含:

<build_depend>message_generation</build_depend> 在构建的时候,我们只需要"message_generation"。
<run_depend>message_runtime</run_depend>  在运行的时候,我们只需要"message_runtime"。

在CMakeLists.txt里用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。

find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
确保设置依赖
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
去掉add_meggage_files注释符号#,用你的.msg文件替代Message*.msg,就像下边这样:
add_message_files(
  FILES
  Num.msg
)

例子:************自己创建编写的功能包中CMakeLists.txt里必须拥有以下几个

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
message_generation   #自己写的功能包,一定要添加,不然会报错。
)
add_message_files(
   FILES
#   Message1.msg
#   Message2.msg
Num.msg
 )
generate_messages(
  DEPENDENCIES
  std_msgs
)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
CATKIN_DEPENDS message_runtime
)

XML文件中***************

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>       

其他版本最后一句可能是

 <run_depend>message_runtime</run_depend> 

$ rosmsg show beginner_tutorials/Num 查看定义的消息

创建srv

##创建msg时添加过就不用再次添加
    find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)  
    ##添加自己的服务
    add_service_files(
      FILES
    #   Service1.srv
    #   Service2.srv
    AddTwoInts.srv
    )

查看ROS是否能识别

$ rossrv show beginner_tutorials/AddTwoInts 

不指定包来查看

$ rossrv show AddTwoInts 
3.7 package.xml可以说是为了让ROS识别自己写的包,CMakeList相当于让编译器编译自己写的源文件实验如下:

在foobar下创建package.xml文件,并添加以下内容:

<package>
  <name>foobar</name>
  <version>1.2.4</version>
  <description>
  This package provides foo capability.
  </description>
  <maintainer email="foobar@foo.bar.willowgarage.com">PR-foobar</maintainer>
  <license>BSD</license>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>

  <run_depend>roscpp</run_depend>
  <run_depend>std_msgs</run_depend>
</package>

完成后,就可以找到路径

$ rospack find foobar

然后创建CMakeList文件,这样 catkin_make才能够利用 CMake 强大的跨平台特性来编译所创建的package

cmake_minimum_required(VERSION 2.8.3)
project(foobar)
find_package(catkin REQUIRED roscpp std_msgs)
catkin_package()

依赖项并没有被系统默认安装,因此,ROS提供了一个工具rosdep来下载并安装所需系统依赖项

$ roscd turtlesim
$ rosdep install turtlesim
3.6录制与回放

录制

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

查看

$ rosbag info <your bagfile>

回放

$ rosbag play <your bagfile>
$ rosbag play -r 2 <your bagfile> 带频率回放
$ rosbag record -O subset /turtle1/command_velocity /turtle1/pose 指定回放

定位错误

$ roscd
$ roswtf

roscreate-pkg节省精力避免错误,但package只不过就是一个文件夹外加一个XML文件

$ mkdir -p src/foobar
$ cd src/foobar
三、ROS命令总结:

rospack = ros+pack(age) : 提供ROS package相关的信息
rosstack = ros+stack : 提供stacks 相关的信息
roscd = ros+cd : changes directory to a ROS package or stack
rosls = ros+ls : lists files in a ROS package
roscp = ros+cp : copies files from/to a ROS package
rosmsg = ros+msg : provides information related to ROS message definitions
rossrv = ros+srv : provides information related to ROS service definitions
rosmake = ros+make : makes (compiles) a ROS package

练习自己编写talker/listener

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值