ROS学习笔记(二)- ROS驱动机器人实例

2023-05-16

利用周末玩了一下先锋机器人(Pioneer3, P3AT),前后装了两次ROS,以及一大堆操作细节,打算整理记录一下方便以后解决问题用,同时通过实际操作,对上一篇学习笔记罗列出来的指令有了更深的理解,也把这里面的思考逻辑整理出来。

安装ROS

安装ROS的过程还是跟随wiki走http://wiki.ros.org/indigo/Installation/Ubuntu
这里要补充说明的是要根据Ubuntu的版本选择正确ROS版本,我用的是Ubuntu 14.04,选择ROS版本是indigo。 如果选择的ROS版本不支持相应Ubuntu系统(比如Ubuntu 14.04装kinetic),会报类似找不到源的错误。
按照上面wiki走完一遍之后,就建立工作空间和初始化,这步对于后续所有程序都有必要(对于只有一个工作空间),所以把其列在安装里,同时把依次的操作列出来:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

两点:
1.注意操作对应的路径,如在~/catkin_ws/下catkin_make和source操作
2.上面最后一句是为了每次打开一个终端时都自动执行这个命令,否则需要时需要手动执行
至此安装和环境配置完成。

下载ROSARIA和测试

ROSARIA包含机器人底层驱动的接口,可以在ROS里面驱动先锋机器人,具体的过程见http://wiki.ros.org/ROSARIA/Tutorials/How%20to%20use%20ROSARIA,因为一部分过程与上面配置ROS环境的内容重合,这里只列出接下来需要的必要操作:

cd ~/catkin_ws/src
git clone https://github.com/amor-ros-pkg/rosaria.git
cd ~/catkin_ws
rosdep update
rosdep install rosaria
catkin_make

到这里ROSARIA应该已经可以使用了。

假设到这里都没有问题了,下面就开始测试了,找到一个比较好的测试程序:https://github.com/pengtang/rosaria_client,是依赖于ROSARIA的另一个包,里面的readme也有详细的过程,按照里面步骤走没有问题。

测试驱动机器人

这里假设已经安装好MobileSim和ssh远程,因为都是师兄弄好的,这里也没有再找过程。另外,下载好rosaria_client到工作空间用于测试。

1.仿真机器人

Alt+t 打开一个新终端。

因为roscore是每次运行ROS前都需要进行的操作,但是在运行过程中占用一个终端窗口又不需要操作,所有这里用一下Ubuntu后台运行的小技巧

roscore &

这样就可以把程序一直放在后台运行而不占用窗口。同样的,后面一些长时间不运行不需要关闭的节点,可以通过“命令+空格+&”的方式放在后台运行,节点可以通过rosnode kill <节点>关闭。

运行机器人仿真:

MobileSim

Shift+Alt+t 打开终端的一个新标签,直接用roslaunch运行多个节点

roslaunch rosaria_client rosaria_client_launcher.launch 

如果运行没问题,则进入到一个界面,根据提示可以运行相应节点操作机器人,仿真完成。如果不想用launch,也可以参照https://github.com/pengtang/rosaria_client步骤2提到的另一种方式进行。

2.实际驱动先锋3

实际驱动机器人的过程跟仿真类似,只是里面端口的参数默认设置成了仿真机器人的端口,在实际驱动时需要重新设置一下。

ssh pioneer3-onboard@192.168.1.105
roscore
rosrun rosaria RosAria _port:=/dev/ttyS0
rosrun rosaria_client interface

如果仍想用launch命令,可以改一下.launch文件

cd ~/catkin_ws/src/rosaria_client/launch
vim rosaria_client_launcher.launch

可以看到

<launch>
        <node pkg = "rosaria" type = "RosAria" name = "RosAria">
                <param name="port" value="/dev/ttyUSB0" type="string"/>
        </node>

        <node pkg="rosaria_client" type="interface" name="RosAria_interface" output="screen"/>

</launch>

把/dev/ttyUSB0改成/dev/ttyS0就可以了,或者改完以后另存一个.launch文件。

这就是简单的对ROS驱动先锋机器人的测试,往后会持续探索更多功能实现,另外也还有另外一些测试实例,可以作为参考http://blog.csdn.net/david_han008/article/details/53966532

对ROS指令的理解

rosnode

ROS的核心操作对象是节点,一个节点即一个可执行程序,因而要实现功能时,先了解有哪些节点。 运行一个节点的指令是

rosrun [package_name] [node_name]

这个就是运行节点时的核心操作,如果不知道有哪些节点,可以在输完包名称后,按两次Tab键,列出包下面所有可运行的节点,即所有可执行的程序,这是理解程序包的第一步,也是运行的第一步。一般在运行节点以后,后面的命令才可用。

这里用MobileSim仿真的例子来说明,假设已运行roscore, MobileSim。 用Shift+Alt+t打开新窗口,然后运行

rosrun rosaria RosAria

为了查询节点的可用的服务、话题等功能,运行

rosnode info RosAria

可以看到

Node [/RosAria]
Publications: 
 * /RosAria/sonar_pointcloud2 [sensor_msgs/PointCloud2]
 * /RosAria/pose [nav_msgs/Odometry]
 * /RosAria/parameter_descriptions [dynamic_reconfigure/ConfigDescription]
 * /RosAria/motors_state [std_msgs/Bool]
 * /rosout [rosgraph_msgs/Log]
 * /tf [tf2_msgs/TFMessage]
 * /RosAria/parameter_updates [dynamic_reconfigure/Config]
 * /RosAria/battery_state_of_charge [std_msgs/Float32]
 * /RosAria/bumper_state [rosaria/BumperState]
 * /RosAria/battery_voltage [std_msgs/Float64]
 * /RosAria/battery_recharge_state [std_msgs/Int8]
 * /RosAria/sonar [sensor_msgs/PointCloud]

Subscriptions: 
 * /RosAria/cmd_vel [unknown type]

Services: 
 * /RosAria/set_parameters
 * /RosAria/disable_motors
 * /RosAria/get_loggers
 * /RosAria/set_logger_level
 * /RosAria/enable_motors


contacting node http://pioneerclient-Lenovo-G40-70m:50648/ ...
Pid: 4192
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound
    * transport: TCPROS

这样就列出了RosAria节点的话题和服务。

rostopic

假设想让仿真机器人以一定线速度向前走,这时,可以从http://wiki.ros.org/ROSARIA找对应的API接口,这里用到话题/RosAria/cmd_vel,这个名称的话题在ROS里面经常是改变速度的功能,在乌龟仿真中也有提到。当然,还可以直接查询,利用rostopic。如果这里忘记了rostopic的用法,这里运行

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 type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

进一步想到,可以用rostopic list列出所有活动的话题,得到

rostopic list

/RosAria/battery_recharge_state
/RosAria/battery_state_of_charge
/RosAria/battery_voltage
/RosAria/bumper_state
/RosAria/cmd_vel
/RosAria/motors_state
/RosAria/parameter_descriptions
/RosAria/parameter_updates
/RosAria/pose
/RosAria/sonar
/RosAria/sonar_pointcloud2
/rosout
/rosout_agg
/tf

然后可以通过rostopic info 查询这些话题,这里已经知道是/RosAria/cmd_vel,所以运行得到

rostopic info /RosAria/cmd_vel 
Type: geometry_msgs/Twist

Publishers: None

Subscribers: 
 * /RosAria (http://pioneerclient-Lenovo-G40-70m:50648/)

顺便在这里提非常有实用的一点,就是善用Tab补全,比如在上面输完rostopic info 后,按下两次Tab键,自然列出所有操作的对象,这里是所有活动话题:

rostopic info /

/RosAria/battery_recharge_state   /RosAria/parameter_updates
/RosAria/battery_state_of_charge  /RosAria/pose
/RosAria/battery_voltage          /RosAria/sonar
/RosAria/bumper_state             /RosAria/sonar_pointcloud2
/RosAria/cmd_vel                  /rosout
/RosAria/motors_state             /rosout_agg
/RosAria/parameter_descriptions   /tf

相反,如果输入的指令不对,按Tab补全的时候会无效,可以查看哪里有问题。
这对于实际操作来说非常方便,在所有地方都会用到,需慢慢习惯使用。

接着上面列出/RosAria/cmd_vel的信息,可以看到话题的消息(msg)类型是geometry_msgs/Twist。为了知道这个消息类型的含义,一方面可以通过wiki的相关跳转找到,比如找到cml_vel的条目,括号里的类型有跳转链接http://docs.ros.org/api/geometry_msgs/html/msg/Twist.html,如果仍不知道vector3的含义,可以再次跳转http://docs.ros.org/api/geometry_msgs/html/msg/Vector3.html,结合这两条就知道geometry_msgs/Twist实际就是两个float类型的向量。

如果不想这么麻烦地查找网页,有更加简便的方法,就是使用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

变量的显示一目了然,同时看到第一个向量是线速度,第二个向量是角速度。知道了消息类型,就可以往/RosAria/cmd_vel发布消息,假设在这里忘记了发布消息的格式,继续用-h,这里运行

rostopic pub -h

可以看到

Usage: rostopic pub /topic type [args...]

所以在这里运行

rostopic pub /RosAria/cmd_vel geometry_msgs/Twist '[10.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'

就可以看到机器人向前行进了一小段,这是由于只往话题发布了一次消息。
至此,对于话题的使用根据这个思路基本上可以复现,其它的功能用-h帮助进行,如想按一定频率连续发布消息,继续-h(就是上面的操作),后面的那一段是

Options:
  -h, --help            show this help message and exit
  -v                    print verbose output
  -r RATE, --rate=RATE  publishing rate (hz).  For -f and stdin input, this
                        defaults to 10.  Otherwise it is not set.
  -1, --once            publish one message and exit
  -f FILE, --file=FILE  read args from YAML file (Bagy)
  -l, --latch           enable latching for -f, -r and piped input.  This
                        latches the first message.
  -s, --substitute-keywords
                        When publishing with a rate, performs keyword ('now'
                        or 'auto') substitution for each message

看到上面的-r RATE的格式,所以这里运行

rostopic pub /RosAria/cmd_vel geometry_msgs/Twist  -r 1 '[10.0,0.0,0.0]' '[0.0,0.0,0.0]'

以1Hz的频率发布,即每秒发布一次,可以看到机器人一直向前走。

rosservice

用类似的思路来看看rosservice的用法,首先运行

rosservice -h

Commands:
        rosservice args print service arguments
        rosservice call call the service with the provided args
        rosservice find find services by service type
        rosservice info print information about service
        rosservice list list active services
        rosservice type print service type
        rosservice uri  print service ROSRPC uri

看看rosservice有哪些用法,然后运行

rosservice list

/RosAria/disable_motors
/RosAria/enable_motors
/RosAria/get_loggers
/RosAria/set_logger_level
/RosAria/set_parameters
/rosout/get_loggers
/rosout/set_logger_level

看看有哪些可用的服务。要调用服务要用rosservice call

rosservice call -h
Usage: rosservice call /service [args...]

假设现在要调用/RosAria/enable_motors,用rosservice args查询需要的参数

rosservice args /RosAria/enable_motors

可以看到上面的结果为空,所以最后

rosservice call /RosAria/enable_motors

直接调用即可,不过这个例子在这里看不到明显现象。

roslaunch

roslaunch的用法就简单得多,它的功能是同时运行多个节点,主要由.launch文件实现,而.launch文件也很好理解,再贴一次上面驱动机器人实验时的.launch文件

<launch>
        <node pkg = "rosaria" type = "RosAria" name = "RosAria">
                <param name="port" value="/dev/ttyUSB0" type="string"/>
        </node>

        <node pkg="rosaria_client" type="interface" name="RosAria_interface" output="screen"/>

</launch>

更加详细的解释可以参照wiki

总结

由于ROS的概念、操作较多,这里整理了遗忘重拾的思路,方便对操作未熟练以及太久遗忘的情况,可以通过指令来找回一些基本操作,实际上上面的举例跟乌龟仿真的实验非常相似。

一些遇见的问题

记录一下遇到的问题和解决办法,在安装ROS时报错:
E: Sub-process /usr/bin/dpkg returned an error code
这是因为Ubuntu自身的问题,在安装过程中由于未知原因系统出现问题打断了安装,导致重新装出现问题。解决办法见http://yanue.net/post-123.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习笔记(二)- ROS驱动机器人实例 的相关文章

  • JS实现浏览器打印、打印预览

    目前正在做浏览器端采用JS方式实现打印这么一个功能 xff0c JS打印实现的方法很多 xff0c 但是兼容各个浏览器实现打印预览的功能有些棘手 xff0c 现将实现的内容及遇到的问题记录下来 xff0c 希望有大牛看到所提的问题后可以给予
  • STM32流水灯

    这个是根据51的基础上改的 一看就懂 直接在main c编辑就行 而不用去弄什么固件库 寄存器 这个是8个灯 然后设置A0 A7口为Output 推挽输出 就行 直接在user的main c中写就好 USER CODE BEGIN Head
  • PX4Ubuntu16.04环境搭建

    一 在虚拟机上安装一个新的ubuntu16 04系统 二 打开PX4的GITHUB主页 https github com PX4 Firmware 1 按照教程 这些脚本已经在干净的Ubuntu LTS 16 04和Ubuntu LTS 1
  • ucosII 信号量使用总结(举例讲解)

    概述 信号量用于 xff1a 1 控制共享资源的使用权 xff08 满足互斥条件 xff09 2 标志某时间的发生 3 使2个任务的行为同步 OSSemCreate 赋初值 OSSemCreate INT16U cnt xff0c cnt为
  • 用supervisor管理进程报错 “exit status 1 not expected”

    查看supervisor的日志发现报错 xff1a tail f var log supervisor supervisord log exited cyberwing domain numbercard exit status 1 not
  • Linux下core文件产生的一些注意问题

    前面转载了一篇文章关于core文件的产生和调试使用的设置 xff0c 但在使用有一些需要注意的问题 xff0c 如 在什么情况 才会正确地产生core文件 列出一些常见问题 xff1a 一 xff0c 如何使用core文件 1 使用core
  • windows10+ubuntu16.04双系统安装教程--UEFI安装方法

    本人github其他资料地址 xff1a https github com Bubble water deeplearning 一 ubuntu 1 1 ubuntu 系统镜像链接 1 2 刻录ubuntu 系统镜像 1 3 安装教程 往下
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • C++语言HTTP协议解析器

    httpParser 项目地址 xff1a https github com yuesong feng httpParser C 43 43 版本的 HTTP 协议解析器 xff0c 可自动识别 request 与 response 请求
  • Docker push 命令

    https www jianshu com p 1c8b96cf1f13 Docker hub注册用户 到官网注册账号 xff1a https hub docker com 在本地Linux登录docker xff1a docker 64
  • docker 配置国内镜像地址

    https www cnblogs com cocoajin p 15513348 html 为docker配置国内镜像地址 xff0c 用于在pull镜像下载加速 1 创建配置文件daemon json 在目录 etc docker da
  • Dockerfile的使用

    dockerfile中的指令 构建镜像 docker build t 仓库地址 仓库名称 镜像名称 标签 在dockerfile目录下构建 文件名为Dockerfile FORM span class token comment 指定基础镜
  • ROS小车记录系列(二)IMU采集、过滤,与odom数据融合,发布新的odom话题

    xff08 二 xff09 IMU采集 过滤 xff0c 利用EKF将IMU与odom融合 xff0c 发布新的odom话题 A ROS采集节点B imu tools过滤imu数据C 使用 robot pose ekf 对imu和odom进
  • java开发——时间类型和时间格式转换

    项目开发过程中 xff0c 有时候需要将时间的形式进行变换 xff0c 时间的输入和输出不一致的转换 xff0c 本文用于记录常用到的方法 首先对sdf format a sdf parse a 两个类型进行区分 sdf format a
  • Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • Linux(centos 7) 环境安装MySQL5.7

    mysql安装包 链接 xff1a 百度网盘 请输入提取码 提取码 xff1a b8w4 环境准备 安装好的centos 7系统 root 用户登录Linux 在根目录下创建 soft目录 上传mysql安装包到 soft目录 xff0c
  • Linux桌面基础:X Window System——Xorg

    一 前言 Unix Like 操作系统不是只能进行服务器的架设而已 xff0c 在美编 排版 制图 多媒体应用上也是有其需要的 这些需求都需要用到图形接口 xff08 Graphical User Interface GUI xff09 的
  • 位姿估计之PnP算法

    最近实验室学习安排是了解Pnp问题解法 xff0c 于是就在网上找了各种文章学习 xff0c 在此进行总结 xff0c 给我卷 xff01 xff01 xff01 1 什么是PnP问题 xff1f PnP 全称Perspective n P
  • HardFault_Handler异常(死机)的处理

    在系统开发的时候 xff0c 出现了HardFault Handler硬件异常 xff0c 也就是死机 xff0c 尤其是对于调用了os的一系统 xff0c 程序量大 xff0c 检测堆栈溢出 xff0c 以及数组溢出等 xff0c 找了半
  • 我推荐的一些C\C++书籍

    转载 xff1a http blog jobbole com 61308 本文由 伯乐在线 周昌鸿 翻译自 bert hubert 欢迎加入 技术翻译小组 转载请参见文章末尾处的要求 人们常常问我有什么C 43 43 和编程的书籍推荐 xf

随机推荐