ros 编译 节点 话题 服务 参数

编译ROS程序包(使用catkin_make)

  • 按照之前的创建一个ROS程序包教程,你应该已经创建好了一个catkin 工作空间 和一个名为beginner_tutorials的catkin 程序包。
  • 现在切换到catkin workspace 并查看src文件夹:
$ cd ~/catkin_ws/
$ ls src
  • 效果:
beginner_tutorials/  CMakeLists.txt@  
  • 你可以看到一个名为beginner_tutorials的文件夹,这就是你在之前的 catkin_create_pkg教程里创建的。
  • 现在我们可以使用catkin_make来编译它了:
$ catkin_make
  • 你可以看到很多cmake和make输出的信息:
Base path: /home/user/catkin_ws
Source space: /home/user/catkin_ws/src
Build space: /home/user/catkin_ws/build
Devel space: /home/user/catkin_ws/devel
Install space: /home/user/catkin_ws/install
####
#### Running command: "cmake /home/user/catkin_ws/src
-DCATKIN_DEVEL_PREFIX=/home/user/catkin_ws/devel
-DCMAKE_INSTALL_PREFIX=/home/user/catkin_ws/install" in "/home/user/catkin_ws/build"
####
-- The C compiler identification is GNU 4.2.1
-- The CXX compiler identification is Clang 4.0.0
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Using CATKIN_DEVEL_PREFIX: /tmp/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/groovy
-- This workspace overlays: /opt/ros/groovy
-- Found PythonInterp: /usr/bin/python (found version "2.7.1") 
-- Found PY_em: /usr/lib/python2.7/dist-packages/em.pyc
-- Found gtest: gtests will be built
-- catkin 0.5.51
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing packages in topological order:
-- ~~  - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/catkin_ws/build
####
#### Running command: "make -j4" in "/home/user/catkin_ws/build"
####
  • catkin_make首先输出它所使用到的每个空间所在的路径。
  • 需要注意的是由于这些空间存在默认配置的原因,有几个文件夹已经在catkin工作空间自动生成了,使用ls查看:
$ ls 
  • 效果:
build
devel
src
  • build目录是build space的默认所在位置,同时cmake和make也是在这里被调用来配置并编译你的程序包。
  • devel目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方。

 

 

ROS入门教程-理解ROS节点

  • 本教程主要介绍 ROS 图(graph)概念 并讨论roscore、rosnode和 rosrun 命令行工具的使用。
  • 在本教程中我们将使用到一个轻量级的模拟器,请使用以下命令来安装:
sudo apt-get install ros-kinetic-ros-tutorials

roscore

  • roscore是你在运行所有ROS程序前首先要运行的命令。
  • 请运行:
$ roscore
  • 然后你会看到类似下面的输出信息:
... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-

machine_name-13039.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://machine_name:33919/
ros_comm version 1.4.7

SUMMARY
========

PARAMETERS
 * /rosversion
 * /rosdistro

NODES

auto-starting new master
process[master]: started with pid [13054]
ROS_MASTER_URI=http://machine_name:11311/

setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf
process[rosout-1]: started with pid [13067]
started core service [/rosout]

使用rosnode(获取节点信息的ROS工具)

  • 打开一个新的终端, 可以使用 rosnode 像运行roscore一样看看在 运行什么...
  • 注意: 当打开一个新的终端时,你的运行环境会复位,同时你的~/.bashrc文件会复原。
  • rosnode显示当前运行的ROS节点信息。
  • rosnode list指令列出活跃的节点:
$ rosnode list
  • 你会看到:
/rosout
  • 这表示当前只有一个节点在运行: rosout。因为这个节点用于收集和记录节点调试输出信息,所以它总是在运行的。
  • rosnode info命令返回的是关于一个特定节点的信息。
$ rosnode info /rosout
  • 例如,事实上由它发布/rosout_agg
------------------------------------------------------------------------
Node [/rosout]
Publications:
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions:
 * /rosout [unknown type]

Services:
 * /rosout/set_logger_level
 * /rosout/get_loggers

contacting node http://machine_name:54614/ ...
  • 现在,让我们看看更多的节点。为此,我们将使用rosrun弹出另一个节点。

使用 rosrun(运行节点工具)

  • rosrun允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)。$ rosrun [package_name] [node_name]
  • 现在我们可以运行turtlesim包中的 turtlesim_node。然后, 在一个 新的终端:
$ rosrun turtlesim turtlesim_node
  • 你会看到 turtlesim 窗口:turtlesim.png (小海龟)
  • 在一个 新的终端:

$ rosnode list
  • 你会看见类似于:
/rosout
/turtlesim
  • 关闭 turtlesim 窗口停止运行节点
  • 现在让我们重新运行它,但是这一次使用Remapping Argument改变节点名称:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
  • 现在,我们退回使用rosnodelist:
$ rosnode list
  • 你会看见类似于:
/rosout
/my_turtle
  • 使用另外一个rosnode指令,ping来测试:

$ rosnode ping my_turtle
  • 效果:
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://aqy:42235/     time=1.152992ms
xmlrpc reply from http://aqy:42235/     time=1.120090ms
xmlrpc reply from http://aqy:42235/     time=1.700878ms
xmlrpc reply from http://aqy:42235/     time=1.127958ms

 

 

 

理解ROS话题

roscore

  • 首先确保roscore已经运行, 打开一个新的终端:
$ roscore

turtlesim

  • 在本教程中我们也会使用到turtlesim,请在一个新的终端中运行:
$ rosrun turtlesim turtlesim_node

通过键盘远程控制turtle

  • 我们也需要通过键盘来控制turtle的运动,请在一个新的终端中运行:
$ rosrun turtlesim turtle_teleop_key
  • 效果:
[ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
  • 现在你可以使用键盘上的方向键来控制turtle运动了。(如果不能控制,请选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获)

 

turtle_key.png

 

  • 现在你可以控制turtle运动了,下面我们一起来看看这背后发生的事。

ROS Topics

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

使用 rqt_graph

  • rqt_graph能够创建一个显示当前系统运行情况的动态图形。rqt_graph是rqt程序包中的一部分。
  • 如果你没有安装,请通过以下命令来安装:
$ sudo apt-get install ros-kinetic-rqt
$ sudo apt-get install ros-kinetic-rqt-common-plugins
  • 在一个新终端中运行:
$ rosrun rqt_graph rqt_graph
  • 你会看到类似下图所示的图形:

rqt_graph_turtle_key.png

  • 如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会高亮显示。
  • 正如你所看到的turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来互相通信。

rqt_graph_turtle_key2.png

rostopic介绍

  • rostopic命令工具能让你获取有关ROS话题的信息。你可以使用帮助选项查看rostopic的命令:
$ 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
  • 接下来我们将使用其中的一些子命令来查看turtlesim。

使用 rostopic echo

  • rostopicecho可以显示在某个话题上发布的数据。用法:rostopic echo [topic]
  • 让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocit话题(非hydro版)上发布的数据。
$ rostopic echo /turtle1/cmd_vel
  • 你可能看不到任何东西因为现在还没有数据发布到该话题上。

  • 接下来我们通过按下方向键使turtle_teleop_key节点发布数据。

  • 记住如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。

  • 现在当你按下向上方向键时应该会看到下面的信息:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---
  • 现在让我们再看一下rqt_graph(你可能需要刷新一下ROS graph)。

  • 正如你所看到的rostopic echo(红色显示部分)现在也订阅了turtle1/command_velocity话题。

rqt_graph_echo.png

使用 rostopic list

  • rostopic list能够列出所有当前订阅和发布的话题。
  • 在rostopic list中使用verbose选项:这会显示出有关所发布和订阅的话题及其类型的详细信息。
$ 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

ROS Messages

  • 使用 rostopic type (查看发布在某个话题上的消息类型
  • 用法:rostopic type [topic]
$ rostopic type /turtle1/cmd_vel
  • 你应该会看到:
geometry_msgs/Twist

我们可以使用rosmsg命令来查看消息的详细情况

$ rosmsg show geometry_msgs/Twist
  • 显示:
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z
  • 现在我们已经知道了turtlesim节点所期望的消息类型,接下来我们就可以给turtle发布命令了。
rostopic type /turtle1/cmd_vel | rosmsg show  //其实命令还可以这样用

使用 rostopic pub

  • rostopicpub可以把数据发布到当前某个正在广播的话题上。用法:rostopic pub [topic] [msg_type] [args]
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
  • 以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度开始移动。
  • -1 (单个破折号)这个参数选项使rostopic发布一条消息后马上退出。
  • -- (双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项。这在参数里面包含有破折号-(比如负号)时是必须要添加的。

turtle(rostopicpub).png

  • 你可能已经注意到turtle已经停止移动了。这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。

  • 我们可以使用rostopic pub -r命令来发布一个稳定的命令流

 

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
  • 这条命令以1Hz的频率发布速度命令到速度话题上。

turtle(rostopicpub)2.png

  • 我们也可以看一下rqt_graph中的情形
  • 可以看到rostopic发布器节点(红色)正在与rostopic echo节点(绿色)进行通信:

rqt_graph_pub.png

使用 rostopic hz

  • rostopic hz命令可以用来查看数据发布的频率。用法:rostopic hz [topic]
  • 我们看一下turtlesim_node发布/turtle/pose时有多快:
$ 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。
  • 我们也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次的信息:
rostopic type /turtle1/cmd_vel | rosmsg show

使用 rqt_plot

  • rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。

  • 这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。

  • 首先,在一个新终端中运行rqt_plot命令:

$ rosrun rqt_plot rqt_plot
  • 这会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。
  • 在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。
  • 按一下该按钮,并对/turtle1/pose/y重复相同的过程。
  • 现在你会在图形中看到turtle的x-y位置坐标图。

rqt_plot.png

  • 按下减号按钮会显示一组菜单让你隐藏图形中指定的话题。
  • 现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta,你会看到如下图所示的图形:

rqt_plot2.png

  • 本部分教程到此为止,请使用Ctrl-C退出rostopic命令,但要保持turtlesim继续运行。

 

 

 

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

理解ROS服务和参数

  • 本教程假设从前一教程启动的turtlesim_node仍在运行,现在我们来看看turtlesim提供了什么服务:

ROS Services

 

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

使用rosservice

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

rosservice list

$ rosservice list
  • 显示结果:
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
  • 命令显示turtlesim节点提供了9个服务:
重置(reset)
清除(clear)
再生(spawn)
终止(kill)
turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
turtlesim/get_loggers
turtlesim/set_logger_level
  • 另外两个rosout节点提供的服务:
/rosout/get_loggers
/rosout/set_logger_level

​​​​rosservice type  命令更进一步查看clear服务:使用方法:rosservice type [service]

$ rosservice type clear
  • 显示:
std_srvs/Empty
  • 服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)。

rosservice call    调用带参数的服务 使用方法: rosservice call [service] [args]

  • 因为服务类型是空,所以进行无参数调用:
$ rosservice call clear
  • 正如我们所期待的,服务清除了turtlesim_node的背景上的轨迹。

turtlesim.png

  • 通过查看再生(spawn)服务的信息,我们来了解带参数的服务:
$ rosservice type spawn | rossrv show
  • 显示结果:
float32 x
float32 y
float32 theta
string name              // 上部分是发请求的参数
---
string name             // 下部分是响应返回的值
  • 这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。
  • 名字参数是可选的,这里我们不设具体的名字,让turtlesim自动创建一个。
  • 执行命令:
$ rosservice call spawn 2 2 0.2 ""
  • 服务返回了新产生的乌龟的名字: name: turtle2   现在我们的乌龟看起来应该是像这样的:

turtle(service).png

 

Using rosparam

  • 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           列出参数名

rosparam list    查看现在参数服务器上都有哪些参数:

$ rosparam list
  • 我们可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色:
/background_b
/background_g
/background_r
/roslaunch/uris/aqy:51932
/run_id

rosparam setrosparam get        

  • 改变参数值使用 rosparam set [param_name] 获取参数值使用 rosparam get [param_name]
  • 现在我们修改背景颜色的红色通道:
$ rosparam set background_r 150 
  • 上述指令修改了参数的值,现在我们调用清除服务使得修改后的参数生效:
$ rosservice call clear

turtle(param).png

  • 现在我们来查看参数服务器上的参数值——获取背景的绿色通道的值:
$ rosparam get background_g 
86
  • 我们可以使用rosparam get来显示参数服务器上的所有内容:
$ rosparam get /
  • 显示内容:
background_b: 255
background_g: 86
background_r: 150
roslaunch:
  uris: {'aqy:51932': 'http://aqy:51932/'}
run_id: e07ea71e-98df-11de-8875-001b21201aa8
  • 你可能希望存储这些信息以备今后重新读取。 rosparam dump [file_name]    rosparam load [file_name] [namespace]
  • 现在我们将所有的参数写入params.yaml文件:
$ rosparam dump params.yaml
  • 你甚至可以将yaml文件重载入新的命名空间,比如说copy空间:
$ rosparam load params.yaml copy
$ rosparam get copy/background_b
  • 显示:
255

 

 

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

 rqt_console 和 roslaunch

  • 本教程介绍如何使用rqt_console和rqt_logger_level进行调试,以及如何使用roslaunch同时运行多个节点。

预先安装rqt和turtlesim程序包

  • 本教程会用到rq和turtlesim这两个程序包,如果你没有安装,请先安装:
$ sudo apt-get install ros-kinetic-rqt ros-kinetic-rqt-common-plugins ros-kinetic-turtlesim

使用rqt_console和rqt_logger_level

  • rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息
  • rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)
  • logger levels包括 DEBUG、WARN、INFO和ERROR
  • 现在让我们来看一下turtlesim在rqt_console中的输出信息,同时在rqt_logger_level中修改日志等级。
  • 在启动turtlesim之前先在另外两个新终端中运行rqt_console和rqt_logger_level:
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level

你会看到弹出两个窗口:
UsingRqtconsoleRoslaunchaction=AttachFile&do=get&target=rqt_console(start).png

UsingRqtconsoleRoslaunchaction=AttachFile&do=get&target=rqt_logger_level.png

  • 现在让我们在一个新终端中启动turtlesim:
$ rosrun turtlesim turtlesim_node

· 因为默认日志等级是INFO,所以你会看到turtlesim启动后输出的所有信息,如下图所示:

UsingRqtconsoleRoslaunchaction=AttachFile&do=get&target=rqt_console(turtlesimstart).png

  • 现在让我们刷新一下rqt_logger_level窗口并选择/turtlesim将日志等级修改为WARN,如下图所示:

UsingRqtconsoleRoslaunchaction=AttachFile&do=get&target=rqt_logger_level(error).png

  • 现在我们让turtle动起来并观察rqt_console中的输出:

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

UsingRqtconsoleRoslaunchaction=AttachFile&do=get&target=rqt_console(turtlesimerror).png

日志等级说明

  • 日志等级按以下优先顺序排列:
Fatal
Error
Warn
Info
Debug
  • Fatal是最高优先级,Debug是最低优先级。

  • 通过设置日志等级你可以获取该等级及其以上优先等级的所有日志消息。

  • 比如,将日志等级设为Warn时,你会得到Warn、Error和Fatal这三个等级的所有日志消息。

  • 现在让我们按Ctrl-C退出turtlesim节点

使用roslaunch

  • 接下来我们将使用roslaunch来启动多个turtlesim节点和一个模仿节点以让一个turtlesim节点来模仿另一个turtlesim节点。

  • roslaunch可以用来启动定义在launch文件中的多个节点。用法: $ roslaunch [package] [filename.launch]
  • 先切换到beginner_tutorials程序包目录下:
$ roscd beginner_tutorials
  • 如果roscd执行失败了,记得设置你当前终端下的ROS_PACKAGE_PATH环境变量
$ export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH
$ roscd beginner_tutorials
  • 然后创建一个launch文件夹:
$ mkdir launch
$ cd launch

Launch 文件

  • 现在我们来创建一个名为turtlemimic.launch的launch文件并复制粘贴以下内容到该文件里面:
  • 新建文件,输入:

gedit turtlemimic.launch

复制的文件内容:

   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>

Launch 文件解析

  • 现在我们开始逐句解析launch xml文件。
  • 在这里我们以launch标签开头以表明这是一个launch文件。
<launch>
  • 在这里我们创建了两个节点分组并以'命名空间(namespace)'标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为'sim'。
  • 这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。
  • (上面的代码表示我们启动了两个乌龟节点,他们的名字都是sim,但是他们在不同的命名空间中,所以不会有相同名字的冲突。)
   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。
  • 下面的这些代码中我们启动了mimic节点,同时把这个节点的input和output话题重命名为turtlesim1和turtlesim2。)
  11   <node pkg="turtlesim" name="mimic" type="mimic">
  12     <remap from="input" to="turtlesim1/turtle1"/>
  13     <remap from="output" to="turtlesim2/turtle1"/>
  14   </node>

roslaunching

  • 现在让我们通过roslaunch命令来启动launch文件:
$ roslaunch beginner_tutorials turtlemimic.launch
  • 这时就能看到两只小乌龟,但是这时用rosnode list查询,能看到新增三个节点/mimic,/turtlesim1/sim,/turtlesim2/sim.
  • 现在将会有两个turtlesims被启动,然后我们在一个新终端中使用rostopic命令发送速度设定消息:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]
  • 你会看到两个turtlesims会同时开始移动,虽然发布命令只是给turtlesim1发送了速度设定消息。

  • 我们也可以通过rqt_graph来更好的理解在launch文件中所做的事情。
$ rqt_graph

 

 

ROS入门教程-1.1.9 使用rosed编辑ROS中的文件

ROS入门教程-使用rosed编辑ROS中的文件

使用 rosed 

  • 利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。
  • 使用方法:$ rosed [package_name] [filename]
  • 例子:   这个实例展示了如何编辑roscpp package里的Logger.msg文件。
$ rosed roscpp Logger.msg

使用Tab键补全文件名

  • 使用这个方法,在不知道准确文件名的情况下,你也可以看到并选择你所要编辑的文件。
  • 使用方法:   
$ rosed [package_name] <tab>

编辑器

  • rosed默认的编辑器是vim。
  • 如果想要将其他的编辑器设置成默认的,你需要修改你的 ~/.bashrc 文件,增加如下语句:
export EDITOR='emacs -nw'
  • 这将emacs设置成为默认编辑器。
  • 注意: .bashrc文件的改变,只会在新的终端才有效。已经打开的终端不受环境变量的影响。
  • 打开一个新的终端,看看那是否定义了EDITOR:
$ echo $EDITOR
  • 显示:
emacs -nw


 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建ROS C++节点的步骤如下: 1. 安装ROS:如果你还没有安装ROS,可以参考ROS官方文档进行安装。 2. 创建ROS工作空间:在终端中输入以下命令,创建一个ROS工作空间。 ``` $ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/ $ catkin_make ``` 3. 创建ROS包:在工作空间的src目录下,使用catkin_create_pkg命令创建一个ROS包。 ``` $ cd ~/catkin_ws/src $ catkin_create_pkg my_package roscpp std_msgs ``` 这里创建了一个名为my_package的ROS包,依赖于roscpp和std_msgs。 4. 创建节点:在my_package包下,创建一个名为my_node.cpp的文件,作为节点的源文件。 ``` $ cd ~/catkin_ws/src/my_package $ touch my_node.cpp ``` 在my_node.cpp中,可以使用roscpp库提供的API编写节点代码。以下是一个简单的示例: ``` #include <ros/ros.h> #include <std_msgs/String.h> void messageCallback(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, "my_node"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("my_topic", 10, messageCallback); ros::spin(); return 0; } ``` 在这个示例中,我们订阅了一个名为my_topic的话题,并在回调函数中打印出接收到的消息。 5. 编译节点:在终端中输入以下命令,编译my_package包。 ``` $ cd ~/catkin_ws/ $ catkin_make ``` 如果编译成功,应该能够在devel/lib/my_package目录下找到生成的可执行文件my_node。 6. 运行节点:在终端中输入以下命令,启动my_node节点。 ``` $ source devel/setup.bash $ rosrun my_package my_node ``` 如果一切正常,节点应该已经开始运行,并在终端中输出接收到的消息。 以上就是创建ROS C++节点的基本步骤。当然,实际的开发可能涉及到更多的细节和复杂性,需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值