ROS编程

一、创建ROS软件包

1、创建一个空白的catkin工作空间

1、下面我们开始创建和构建一个catkin工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
catkin_make命令在catkin工作空间中是一个非常方便的工具。在你的工作空间中第一次运行它时,它会在src目录下创建一个CMakeLists.txt的链接

2、接下来首先source一下新生成的setup.*sh文件:
source devel/setup.bash

3、要保证工作区被安装脚本正确覆盖,需确定ROS_PACKAGE_PATH环境变量包含你当前的工作空间目录:
$ echo $ROS_PACKAGE_PATH
/home/<username>/catkin_ws/src:/opt/ros/<distro>/share

2、创建catkin软件包

$ cd ~/catkin_ws/src

#现在使用catkin_create_pkg命令创建一个名为beginner_tutorials的新软件包,这个软件包依赖于std_msgs、roscpp和rospy:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
#这将会创建一个名为beginner_tutorials的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经部分填写了你在执行catkin_create_pkg命令时提供的信息。

#构建一个catkin工作区并生效配置文件
$ cd ~/catkin_ws
$ catkin_make
$ . ~/catkin_ws/devel/setup.bash

 3、依赖关系

1、一级依赖
#查看软件包依赖关系
#使用rospack命令工具来查看这些一级依赖包
$ rospack depends1 beginner_tutorials
    std_msgs
    rospy
    roscpp
#rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包,这些依赖关系存储在package.xml文件中
$ roscd beginner_tutorials
$ cat package.xml
    <package>
    ...
      <buildtool_depend>catkin</buildtool_depend>
      <build_depend>roscpp</build_depend>
      <build_depend>rospy</build_depend>
      <build_depend>std_msgs</build_depend>
    ...
    </package>

2、间接依赖
#在很多情况下,一个依赖包还会有它自己的依赖关系,比如,rospy就有其它依赖包。
$ rospack depends1 rospy
    genpy
    roscpp
    rosgraph
    rosgraph_msgs
    roslib
    std_msgs
#使用rospack可以递归检测出所有嵌套的依赖包
$ rospack depends beginner_tutorials
    cpp_common
    rostime
    roscpp_traits
    roscpp_serialization
    catkin
    genmsg
    genpy
    message_runtime
    gencpp
    geneus
    gennodejs
    genlisp
    message_generation
    rosbuild
    rosconsole
    std_msgs
    rosgraph_msgs
    xmlrpcpp
    roscpp
rosgraph
ros_environment
rospack
roslib
rospy

  4、自定义软件包

  • 自定义package.xml

描述标签
<description>The beginner_tutorials package</description>

维护者标签
#它能够让其他人联系到软件包的相关人员
 <!-- One maintainer tag required, multiple allowed, one person per tag --> 
 <!-- Example:  -->
 <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
 <maintainer email="user@todo.todo">user</maintainer>
##<maintainer email="you@yourdomain.tld">Your Name</maintainer>

许可证标签
#选择一种许可证并将它填写到这里。一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。我们使用BSD许可证,因为其他核心ROS组件已经在使用它:
<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>TODO</license>
## <license>BSD</license>

依赖项标签
#描述了软件包的依赖关系,这些依赖项分为build_depend、buildtool_depend、run_depend、test_depend
#除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。在本例中,因为在编译和运行时都需要用到所有指定的依赖包,因此还要将每一个依赖包分别添加到run_depend标签中:
  <buildtool_depend>catkin</buildtool_depend>
  
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

最终文件

   1 <?xml version="1.0"?>
   2 <package format="2">
   3   <name>beginner_tutorials</name>
   4   <version>0.1.0</version>
   5   <description>The beginner_tutorials package</description>
   6 
   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>
   8   <license>BSD</license>
   9   <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  10   <author email="you@yourdomain.tld">Jane Doe</author>
  11 
  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>
  21 
  22 </package>
  • 自定义CMakeLists.txt

  5、编译软件包

# 在catkin工作空间下
$ catkin_make
    build
    devel
    src
build 目录是构建空间的默认位置,同时cmake和make也是在这里被调用来配置和构建你的软件包。
devel目录是开发空间的默认位置, 在安装软件包之前,这里可以存放可执行文件和库。

二、ROS基础概念

1、ROS节点

rosnode命令

rosnode info    print information about node
rosnode kill    kill a running node
rosnode list    list active nodes
rosnode machine list nodes running on a particular machine or list machines
rosnode ping    test connectivity to node
rosnode cleanup purge registration information of unreachable nodes

ROS客户端库可以让用不同编程语言编写的节点进行相互通信:

  • rospy = Python客户端库
  • roscpp = C++客户端库

roscore是你在运行所有ROS程序前首先要运行的命令。

rosrun可以让你用包名直接运行软件包内的节点(而不需要知道包的路径)。

$ rosrun [package_name] [node_name]

2、ROS话题

  • 使用rqt_graph

turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来相互通信的。turtle_teleop_key在话题上发布键盘按下的消息,turtlesim则订阅该话题以接收消息。让我们使用rqt_graph来显示当前运行的节点和话题。

rqt_graph用动态的图显示了系统中正在发生的事情。

$ rosrun rqt_graph rqt_graph

  •  使用rostopic

rostopic命令工具能让你获取ROS话题的信息。

$ rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
        rostopic bw     display bandwidth used by topic
        rostopic delay  display delay of topic from timestamp in header
        rostopic echo   print messages to screen
        rostopic find   find topics by type
        rostopic hz     display publishing rate of topic    
        rostopic info   print information about active topic
        rostopic list   list active topics
        rostopic pub    publish data to topic
        rostopic type   print topic or field type

 rostopic echo可以显示在某个话题上发布的数据。

rostopic echo [topic]
$ rostopic echo /turtle1/cmd_vel

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

rostopic pub [topic] [msg_type] [args]
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8
以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度移动。

这条命令将消息发布到指定的话题:
rostopic pub

这一选项会让rostopic只发布一条消息,然后退出:
 -1 

这是要发布到的话题的名称:
/turtle1/command_velocity

这是发布到话题时要使用的消息的类型:
turtlesim/Velocity

这一选项(两个破折号)用来告诉选项解析器,表明之后的参数都不是选项。如果参数前有破折号(-)比如负数,那么这是必需的。
--

如前所述,一个turtlesim/Velocity消息有两个浮点型元素:linear和angular。在本例中,2.0是linear的值,而1.8则是angular的值。这些参数实际上使用的是YAML语法,在YAML命令行文档中有描述。
2.0 1.8 

数据发布的速率

turtlesim_node发布/turtle/pose得有多快:

$ rostopic hz /turtle1/pose
  •  使用rqt_plot

$ rosrun rqt_plot rqt_plot

这会弹出一个新窗口,可以在左上角的文本框里面添加任何想要绘制的话题。在里面输入/turtle1/pose/x后,之前不能按下的加号按钮将会变亮。按一下该按钮,并对/turtle1/pose/y重复相同的过程。现在你会在图中看到turtle的x-y位置。

 3、ROS服务和参数

服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)

rosservice list         输出活跃服务的信息
rosservice call         用给定的参数调用服务
rosservice type         输出服务的类型
rosservice find         按服务的类型查找服务
rosservice uri          输出服务的ROSRPC uri
rosparam set            设置参数
rosparam get            获取参数
rosparam load           从文件中加载参数
rosparam dump           向文件中转储参数
rosparam delete         删除参数
rosparam list           列出参数名
  •  rosparam set和rosparam get
现在我们修改背景颜色的红色通道值:

$ rosparam set /turtlesim/background_r 150
上述指令修改了参数的值,现在我们需要调用clear服务使得参数的修改能生效:

$ rosservice call /clear
然后我们来查看参数服务器上其他参数的值。获取背景的绿色通道的值:

$ rosparam get /turtlesim/background_g 
86
  •  rosparam dump和rosparam load
rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]
在这里,我们将所有的参数写入params.yaml文件:

$ rosparam dump params.yaml
你甚至可以将yaml文件重载入新的命名空间,例如copy_turtle:

$ rosparam load params.yaml copy_turtle
$ rosparam get /copy_turtle/turtlesim/background_b
255

 三、调试与启动

1、rqt_console和roslaunch

rqt_console连接到了ROS的日志框架,以显示节点的输出信息。rqt_logger_level允许我们在节点运行时改变输出信息的详细级别,包括Debug、Info、Warn和Error`。

$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level

2、launch文件

$ mkdir launch $ cd launch
存放launch文件的目录不一定非要命名为launch,事实上都不用非得放在目录中,roslaunch命令会自动查找经过的包并检测可用的启动文件。然而,这种推荐的标准做法被认为是“最佳实践” 
现在一起创建一个名为turtlemimic.launch的launch文件并复制粘贴以下内容进去
  #首先用launch标签开头,以表明这是一个launch文件。
   1 <launch>
  #此处我们创建了两个分组,并以命名空间(namespace)标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个分组中都有相同的名为sim的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。
   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>
#在这里我们启动模仿节点,话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就可以让turtlesim2模仿turtlesim1了。
  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>
这一行使得launch文件的XML标签闭合。
roslaunch beginner_tutorials turtlemimic.launch
rostopic pub /turtlesim1/turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8

3、创建ROS消息和服务

简介

  • msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。

  • srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。

msg文件存放在软件包的msg目录下,srv文件则存放在srv目录下。

 下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息的类型:

  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

 srv文件和msg文件一样,只是它们包含两个部分:请求和响应。这两部分用一条---线隔开。下面是一个srv文件的示例:

int64 A
int64 B
---
int64 Sum

简介 使用msg

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桦树无泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值