利用周末玩了一下先锋机器人(Pioneer3, P3AT),前后装了两次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包含机器人底层驱动的接口,可以在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到工作空间用于测试。
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提到的另一种方式进行。
实际驱动机器人的过程跟仿真类似,只是里面端口的参数默认设置成了仿真机器人的端口,在实际驱动时需要重新设置一下。
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
可以看到
"rosaria" type = "RosAria" name = "RosAria">
"port" value="/dev/ttyUSB0" type="string"/>
"rosaria_client" type="interface" name="RosAria_interface" output="screen"/>
把/dev/ttyUSB0改成/dev/ttyS0就可以了,或者改完以后另存一个.launch文件。
这就是简单的对ROS驱动先锋机器人的测试,往后会持续探索更多功能实现,另外也还有另外一些测试实例,可以作为参考http://blog.csdn.net/david_han008/article/details/53966532
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节点的话题和服务。
假设想让仿真机器人以一定线速度向前走,这时,可以从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 -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 -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的用法就简单得多,它的功能是同时运行多个节点,主要由.launch文件实现,而.launch文件也很好理解,再贴一次上面驱动机器人实验时的.launch文件
"rosaria" type = "RosAria" name = "RosAria">
"port" value="/dev/ttyUSB0" type="string"/>
"rosaria_client" type="interface" name="RosAria_interface" output="screen"/>
更加详细的解释可以参照wiki
由于ROS的概念、操作较多,这里整理了遗忘重拾的思路,方便对操作未熟练以及太久遗忘的情况,可以通过指令来找回一些基本操作,实际上上面的举例跟乌龟仿真的实验非常相似。
记录一下遇到的问题和解决办法,在安装ROS时报错:
E: Sub-process /usr/bin/dpkg returned an error code
这是因为Ubuntu自身的问题,在安装过程中由于未知原因系统出现问题打断了安装,导致重新装出现问题。解决办法见http://yanue.net/post-123.html