机器人操作系统ROS典型功能实现方法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器人操作系统ROS典型功能实现方法详解
机器人操作系统R O S典
型功能实现方法详解Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】
机器人操作系统ROS: 典型功能实现方法详解
李宝全ROS体系
版本:
Hydro 2013-09-04
Groovy 2012-12-31
Fuerte 2012-04-23
Electric
Diamondback
ROS是一种分布式的处理框架。
文件系统:在硬盘上查看的ROS源代码的组织形式
包 Package:
含有或
比如下文中的turtlebot_teleop,turtlebot_bringup。
堆:Stack
包的集合
含有
编译方法:
catkin:Groovy及以后版本
rosbuild:用于Fuerte及以前版本
常用命令: rostopic list;列出系统中的所有T opic
rosdep:安装依赖包,例如 rosdep install rosaria
安装时,需要先建一个工作空间,然后把gitgub网站上相应的包下载到src文件夹下,再执行该语句。
具体见“ROSARIA配置与运行”一节。
环境变量设置:export
例如:
export ROS_HOSTNAME=marvin
export ROS_MASTER_URI=
Bulks给的一些有用的命令
rosnode info /rosaria_teleop_key_1
rosrun rqt_robot_steering rqt_robot_steering
rosrun rqt_gui rqt_gui
rostopic help
rosnode help
rosnode info /RosAria
rosnode info /rosaria_teleop_key_1
rosnode list
echo $ROS_HOSTNAME
ROS安装
安装教程:
安装keys
安装
使Debian包为最新:sudo apt-get update
Full安装:sudo apt-get install ros-hydro-desktop-full
会出现一个界面,利用Tab选择Yes即可
成功则提示:ldconfig deferred processing now taking place 找到可以使用的包:
apt-cache search ros-hydro
初始化rosdep
sudo rosdep init
rosdep update
环境设置
echo "source /opt/ros/hydro/" >> ~/.bashrc
source ~/.bashrc
得到rosintall
sudo apt-get install python-rosinstall
TurtleBot 配置与运行
介绍TurtleBot的主页面(安装&运行):
TurtleBot包(Package)的安装过程
安装(/// ):按照Debs Installation按照方法来安装:
1.首先安装:> sudo apt-get install ros-hydro-turtlebot ros-hydro-turtlebot-apps ros-hydro-
turtlebot-viz ros-hydro-turtlebot-simulator ros-hydro-kobuki-ftdi
2.之后加入sourse的bash中:> . /opt/ros/hydro/. 说明:
a)在终端中输入这一行后很快就结束.
b)效果是在.bashrc(Home中的隐藏文件)的最后一行加入了"source /opt/ros/hydro/",
c)效果等效于命令> echo "source /opt/ros/hydro/" >> ~/.bashrc. 这样的话就不用每次启
动都输入命令“source /opt/ros/hydro/”了.
d)这个好像在安装ROS时已经执行过了,不需要再执行一次吧
3.之后加入kobuki的udev规则:> rosrun kobuki_ftdi create_udev_rules
安装完之后还需要加入网络时间控制(/// ), 否则与kokuki无法通讯.
1.首先安装chrony:sudo apt-get install chrony
问题:我重装系统后再安装turtlebot后,连接不上kokuki,但能正常连接Kinect。
在命令
行中,提示到bad callback,因此说明有很多件没有安装成功。
需要将其卸载重装,可以网上搜索Uninstall turtlebot来卸载并重装。
运行:
a.首先打开机器人核心服务程序:打开一个终端:键入: roscore
2.应用视觉传感器kinect并启动rviz界面:
a.New Terminal: > roslaunch turtlebot_bringup ;
3.SLAM:与之前的两项无关. 需要重新开始, 否则就报错了.
a.New Terminal:开启ROS服务: roscore
b.New Terminal:启动kobuki:roslaunch turtlebot_bringup
c.New Terminal:运行gmapping Demo:roslaunch turtlebot_navigation
d.启动RVIZ的navigation:New Terminal:roslaunch turtlebot_rviz_launchers
e.保存建图的结果:rosrun map_server map_saver -f /tmp/my_map
f.说明:该例程只用到kobuki, 没有用到Kinect.
4.退出:ctrl+c
ROS基础的学习
ROS Tutorials:
Installing and Configuring Your ROS Environment
创建:
$ mkdir -p ~/catkin_ws/src .
package_n/
-- file for package_n
-- Package manifest for package_n
Navigating the ROS Filesystem
1.查找某一包(package):使用命令(例如)$ rospack find roscpp. 则会返回路径:
/opt/ros/hydro/share/roscpp
2.利用命令$ roscd roscpp, 则直接进入/opt/ros/hydro/share/roscpp文件夹.
1.$ pwd $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp:创建包
a.beginner_tutorials为产生的包的名称,
b.std_msgs, roscpp, rospy为依赖项(dependencies)
Building a ROS Package
1.上接 cd ~/catkin_ws/ : 首先返回工作空间文件夹.
2.$ ls src: 查看src文件夹中的内容,
a)结果为beginner_tutorials .
b)链接一直存在
c)命令ls为列出当前文件夹下的东西
$ catkin_make. a ROS msg and srv
产生一个消息:
1.创建一个消息
a)cd ~/catkin_ws/src/beginner_tutorials首先进入文件夹.
b)再创建一个文件夹$ mkdir msg.
c)$ echo "int64 num" > msg/: 创建一文件, 并写入一行话int64 num, 当然还可以多加入
几行.
2.对(beginner_tutorials中的)添加下面两行:
a)message_generation
b)message_runtime
3.对(beginner_tutorials中的)做如下修改 :
a)在原有的find_package(xxx)中加入“message_generation”
b)在catkin_package()中添加CATKIN_DEPENDS message_runtime
c)取消add_message_files()的注释, 并修改为add_message_files(FILES
d)取消generate_messages(DEPENDENCIES std_msgs)的注释
使用rosmsg
$ rosmsg show beginner_tutorials/Num. 应该输出int64 num 但但提示找不到该消息
使用查找命令$ rosmsg show Num, 应该输出[beginner_tutorials/Num]:int64 num. 但还是找不到
创建一个srv
1.创建一个srv
$ roscd beginner_tutorials应该输出int64 a int64 b --- int64 sum. 但提示找不到该消息
使用查找命令$ rossrv show AddTwoInts, 也只能查找到[rospy_tutorials/AddTwoInts]中的, 找不到[beginner_tutorials/AddTwoInts]中的.
与srv共同的下一步
在中, 取消generate_messages(DEPENDENCIES std_msgs)的注释(创建msg阶段已经完成)
在catkin_ws工作空间下输入命令: $ catkin_make
结果是生成了针对不同语言的头文件: msg的C++头文件在~/catkin_ws/devel/include/beginner_tutorials/. Python脚本在~/catkin_ws/devel/lib/dist-packages/beginner_tutorials/msg. 列表处理语言文件在~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/. 对于.srv, 生成的结果也类似. 生成成功!
上接,不需要经过生成msg与srv的过程
进入包cd ~/catkin_ws/src/beginner_tutorials
1.1创建Publisher Node:src/ 文件(在该包的src文件夹下)
2.1创建Subscriber Node:src/ 文件(在该包的src文件夹下)
3.1Building your nodes 生成可执行文件
a)在文件中(包的目录下面的)最后面加入(已经在之前msg&srv中生成并处理了,
若没经过上面的msg&srv阶段的处理, 也能正常编译生成)
b)add_executable(talker src该过程使用了. 生成的结果为在:devel/lib/beginner_tutorials
下有talker与listener节点(可执行文件).
并有提示:[100%] Built target talker;[100%] Built target listener
1.打开ros服务:roscore
2.运行talker
a.另开一个terminal,进入$ cd ~/catkin_ws,
b.再执行命令$ source ./devel/ . 该命令等效于source ~/catkin_ws(工作空间
名)/devel/。
该命令很快即执行完毕
c.$ rosrun beginner_tutorials(包的名称)talker : 运行Publisher. (不需要在工作空间目
录下) 之后会看到如下类似消息:
3.运行listener
a.进入$ cd ~/catkin_ws,
b.再执行命令$ source ./devel/
c.$ rosrun beginner_tutorials(包的名称)
因为需要加入头文件#include "beginner_tutorials/"
1.写一个服务器节点: 进入文件夹cd ~/catkin_ws/src/beginner_tutorials, 编写src/
2.写一个客户端节点: 进入文件夹cd ~/catkin_ws/src/beginner_tutorials编写src/
3.Build节点
a)在~/catkin_ws/src/beginner_tutorials/中加入如下几行: devel/
b)
2.运行客户端
a)还需要再进入$ cd ~/catkin_ws, 再执行命令$ source ./devel/
b)运行add_two_ints_server :输入$ rosrun beginner_tutorials add_two_ints_client 1 3. 之
后会看到如下类似消息:. 在客户端terminal中可以看到信息k response: [4]
进一步的服务器客户端例程:
P3-AT/DX
ROSARIA配置与运行
网站主页
How to use ROSARIA:
创建ROS工作空间
之前若没有加入启动命令. /opt/ros/hydro/的话, 则加入.
为了创建一个关于ROSARIA的工作空间, 将学习ROS基础阶段的catkin_ws文件夹重命名为catkin_ws_Base, 再新建一个工作空间catkin_ws:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace首先进入src文件夹, 之后运行命令git clone
包中包含文件
在安装ARIA后再下载该包应该也可以
安装ARIA以及Build ROSARIA
1.source ~/catkin_ws/devel/
a)
b)或者把这项添加到.bashrc文件中再执行.bashrc文件:{echo "source
~/catkin_ws/devel/" >> ~/.bashrc -> source ~/.bashrc}
2.得到包之后, 编译它们:
i.rosdep update They have been ignored, or old ones used instead.解决方法:sudo
rm /var/lib/apt/lists/* -vf删除相应文件
1.catkin_make若不在第一步运行该命令,则会报错[rospack] Error: stack/package rosaria
not found
2.运行启动该节点的命令: rosrun rosaria RosAria
a)不需要到catkin_ws文件夹下.
b)命令rosrun 允许直接运行一个包里面的节点(可执行程序): rosrun [package_name]
[node_name].
c)节点的位置为\catkin_ws\devel\lib\rosaria\RosAria
3.(从运行下面4可知不需要这一步)设置网络地址
4.配置好USB转串口后就可以连接了, 连接成功时输出的提示信息为(退出连接的话, 直
接Ctrl+C就可以了.):
Could not connect to simulator, connecting to robot through serial port /dev/ttyUSB0.
Syncing 0
Syncing 1
Syncing 2
Connected to robot.
Name: RoboticsWorld_4129
Type: Pioneer
Subtype: p3at-sh
ArConfig: Config version:
Loaded robot parameters from
ArRobotConnector: Connecting to MTX batteries (if neccesary)...
ArRobotConnector: Connecting to MTX sonar (if neccesary)...
om robot EEPROM: 32550
说明:
1.一问题的解决:在运行后面连接Android时, 再回头运行此命令, 则就去src/rosaria找该
可执行文件了, 因此从路径上就错了, 不知是那一步影响了该命令的执行. 不过用中的catkin_make命令重新编译一下就又能正常连接了.
2.若USB转串口没有配置好, 则会出现下方的错误提示, 配置方法请见下方的USB转串口
配置.
ArSerialConnection::open: Could not open serial port '/dev/ttyUSB0' | ErrorFromOSNum: 2 ErrorFromOSString: No
such file or directory
Could not connect, because open on the device connection failed.
Failed to connect to robot.
d...
Topics and Commands
a)获得姿态:rostopic echo /RosAria/pose cho 应该是请求输出的命令
b)运行结果:
2.线速度控制量的设置(s):
rostopic pub -1 /RosAria/cmd_vel geometry_msgs/Twist '{linear: {x: , y: , z: }, angular: {x: , y: , z: }}'
a)/RosAria/cmd_vel 指话题名字Topic,不能是/cmd_vel 或者cmd_vel
b)geometry_msgs/Twist 为数据类型 Message
c)'{linear: {x: , y: , z: }, angular: {x: , y: , z: }}' 合成一个消息
d)运行结果:机器人做相应运动并提升publishing and latching message for seconds
3.角速度控制量的设置(s):
rostopic pub -1 /RosAria/cmd_vel geometry_msgs/Twist '{linear: {x: , y: , z: }, angular: {x: , y: , z: }}'
4.也可以把2,3合成起来.
5.其他的 sonar, bumpers, acceleration parameters如何用更多ROS API请见:ROSARIA键盘控制:
1. mkdir -p ~/RosAriaKeyboard/src
2. 创建包catkin_create_pkg RosAriaKeyboard std_msgs rospy roscpp
编写程序:
3. 编写文件
在文件夹下加入如下几行命令(Bluks给我的程序是用rosbuild编
译方法。
需要做相应借鉴
并修改)
1.
find_package(PkgConfig REQUIRED)新建工程mkdir -p ~/RosAriaCode/src
2.创建包:catkin_create_pkg RosAriaCode std_msgs rospy roscpp
3.处理CMakeList
add_executable(rosaria_teleop_code src/
target_link_libraries(rosaria_teleop_code ${catkin_LIBRARIES}) add_dependencies(rosaria_teleop_code
RosAriaCode_generate_messages_cpp)
4. catkin_make一下。
5. 执行:
source devel/
rosrun wmrcontrol rosaria_teleop_code
Android遥控
Android Teleoperate Pioneer 3at Robot. 见网站:
/ /Connecting to a ROS Master
进入之前下载的ROSARIA包的文件夹中cd ~/catkin_ws/src/rosaria
网页上是不是写错了没有ROSARIA. 只能自己写命令git clone , 结果还可以, 结果是在src 文件夹中得到了ROSARIA文件夹. rosaria 与ROSARIA文件夹一样大小, 是不是就是一样的
Step2
使用命令:Path_from_Home/ROSARIA$ rosmake
但是在rosaria中使用rosmake 就可以, 结果为Built 52 packages with 0 failures., 但在ROSARIA下就报错. 网站上是不是写错了Step3
进入文件夹, 网站上写的命令$ roscd ROSARIA, 但进入不了, 只能
手动进入rosaria了, 好像roscd也不能使用.
创建一个文件:命令:gedit & 把网站上的代码粘贴进去再保存.
Step4
编辑rosaria文件夹下的CMakeList. txt文件. 在最后一行添加
rosbuild_add_executable(android_teleop
在rosaria下输入命令:rosmake. 不起作用呢提示错误信息:
[ rosmake ] rosmake starting...
[ rosmake ] No package or stack specified. And current directory 'catkin_ws' is not a package name or stack name.
[ rosmake ] Packages requested are: []
[ rosmake ] Expanded args [] to:
[ rosmake ] ERROR: No arguments could be parsed into valid package or stack names.
从pubulisher节点中学习如何编译并运行Node
TurtleBot的键盘控制:
控制命令以T erminal端键入方式:
TurtleBot与p3dx应该很像,那么能不能在p3dx的terminal命令的基础上修改得到呢,大胆尝试后,竟然对了!TurtleBot端的命令为:(当然需要先启动机器人)
rostopic pub -1 cmd_vel_mux/input/teleop geometry_msgs/Twist '{linear: {x: , y: , z: }, angular: {x: , y: , z: }}' 原因是,观察到中含有如下一句话:
那么很有可能T opic的名称改为cmd_vel_mux/input/teleop。
输入上述命令之后发现机器人没有动,但我听到机器人里有动静,因此我就把速度量调大,结果机器人就动了。
这才意识到,这种TurtleBot机器人不像RosAria那样输入命令后就一直动,而是执行完命令立刻停止,因此速度量小的话机器人基本上不动,会让人误认为命令是错的。
当然也有些偶然因素,若是多个/少个/,去哪知道呢,是吧。
中以及把turtlebot_teleop_keyboard/cmd_vel映射到
cmd_vel_mux/input/teleop上了,因此下方的指令不起作用.
rostopic pub -1 turtlebot_teleop_keyboard/cmd_vel geometry_msgs/Twist '{linear: {x: , y: , z: }, angular: {x: , y: , z: }}' 以程序方式控制
与RosAria相似
配置USB转串口
说明: 用于连接先锋机器人
1.串口编号方式: 串口COM1对应于ttyS0, COM2对应于ttyS1. 若是使用USB转串口, 则
COM1对于ttyUSB0. Aria即默认使用ttyUSB0
2.默认情况下Ubuntu中已经安装了PL2303的驱动. 插入USB接口后,在dev/下会生成
名为ttyUSB0的文件. 若使用命令lsmod|grepusbserial, 则显示usbserial 42594 1 pl2303.
不过等配置完minicom后又提示“lsmod|grepusbserial无此命令”了呢
串口的调试:
1.串口调试工具minicom的安装:sudo apt-get install minicom 一个命令就可以自动下载
安装
2.串口配置:
a)输入sudo minicom -s (要有root权限,否则提示Cannot write to /usr/etc/)命令,
进入将串口配置项, 将下面两项配置为
i. A. Serial Device: dev/ttyUSB0
ii. F. Hardware Flow Control:No
iii.之后选择保存为默认配置: Save setup as dfl.
3.若出现Cannot open /dev/ttyUSB0: Permission denied提示字样, 则需要将用户名加入到
dialout组别中:sudo gpasswd --add listname dialout, 重启电
脑就可以与COM1通信了.
查看组别:groups listname。
这步需要做。
4.参考: :
的制作
RosAria中有如下一行:
#include<>用以转换sensor_msgs/Image至cv::Mat
该部分的功能是:从相应T opic中获得sensor_msgs::Image图像信息,并将其转化为cv::Mat的形式,并显示出来。
当然,该部分首先需要图像源来发布一个图像Topic,例如下面的①Kinect,②内置USB 摄像头,③外接USB摄像头
1.首先创建工作空间 mkdir -p ~/catkin_ws_cvbridge/src (无需初始化等操作)
2.进入src文件夹,并创建一个包cvbridge, 及其依赖项(注意):
catkin_create_pkg cvbridge sensor_msgs cv_bridge roscpp std_msgs image_transport
该命令也生成了与文件; 也生成了src下的的快捷方式
3.编写节点:
关于Topic, 有:
/camera/rgb/image_color : 这个是采集kinect的图像, 并且图像已经自动左右翻转过来了。
/camera/image_raw : 这是原有例程中的, 但是找不到图像
写"/camera/rgb/image_color"时, 里面加了个空格. 生成时通过, 但运行时会报错:
[terminate called after throwing an instance of 'ros::InvalidNameException'
what(): Character [ ] is not valid as the first character in Graph Resource Name [ /camera/rgb/image_color]. Valid characters are a-z, A-Z, / and in some cases ~.
4.处理
在该文件中加入:
add_executable(image_converter src/
target_link_libraries(image_converter ${catkin_LIBRARIES})
add_dependencies(image_converter
cvbridge_generate_messages_cpp)
5.处理:
需要加入(include) image_transport,cv_bridge与opencv2三项. 由于在创建包时包含了相关依赖项, 因此image_transport与cv_bridge已经提前自动加入了. 在中虽然没有加入opencv2, 可能在加入cv_bridge时, 其已经加入了opencv2, 因此不加入opencv2也能正常在图像上做操作(比如画个圆圈).
总之, 不对作任何改动即可直接catkin_make.
若需加入(include), 则加入的格式为:
opencv2
opencv2
6.catkin_make:
生成image_converter节点;
也生成了src下的CMakeListtxt的链接
7.运行该节点:
a)source ~/catkin_ws_cvbridge/devel/
b)rosrun cvbridge image_converter
Kinect端获取图像
图像Topic的发布:
首先要初始化Kinect:
1首先启动roscore;若忘记启动roscore,则会报错:act master at [localhost:11311]. Retrying...启动roscore后, 显示
2初始化kinect: roslaunch turtlebot_bringup . 也可以启动rviz: roslaunch
turtlebot_rviz_launchers , 在运行此节点过程中, rviz不用关。
a)初始化kinect的过程就等于是发布图像Topic的过程。
对于内置USB摄像头而言,需要运行下载的包usb_cam来产生图像(具体
见下一节内置USB摄像头图像获取)
初始化后,后就会产生"/camera/rgb/image_color"等图像T opic。
接下来就要从该T opic中接受图像数据并显示出来了,请见下方。
图像的接收与显示:
运行cv_bridge包:注意将中的Topic名称改为"/camera/rgb/image_color" 然后按照”图像传递cv_bridge”一节操作即可。
为了避免混乱,新建一工作空间mkdir -p ~/ImageDisplayKinect/src
然后把CvBridge中的包cvbridge复制到src下,对CMakeList 做相应修改。
再catkin_make一下
运行该节点:
source ~/catkin_ws_cvbridge/devel/
rosrun cvbridge image_converter
内置USB 摄像头图像获取
需要用到usb_cam包:
对于笔记本内置USB摄像头的图像获取, 要比Kinect的复杂, 原因是在图像T opic的发布阶段需要做操作。
在图像接收并显示的阶段就相似了。
图像Topic的发布:
作用: 将USB摄像头(内置/外置)的图像发布到一个Topic上, 消息类型为
sensor_msgs::Image.
1.创建usb_cam工作空间
之前若没有加入启动命令. /opt/ros/hydro/的话, 则加入.
mkdir -p ~/catkin_ws_usbcam/src
cd ~/catkin_ws_usbcam/src
2.catkin_init_workspace首先进入src文件夹, 之后运行命令git clone
成功则提示
remote: Reusing existing pack: 683, done.
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done
remote: Total 688 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (688/688), KiB | 143 KiB/s, done.
Resolving deltas: 100% (244/244), done.
包usb_cam含有文件:
1../include/usb_cam/,
2../src/,
3../nodes/,
4与文件。
3.关于usb_cam包中的, 有如下说明
a)内置USB摄像头的设备名称为video0. 关于设备名称的语句为("video_device",
video_device_name_, std::string("/dev/video0")); 该节点默认采集内置USB摄像头的
图像, 因此不用改了.
b)查看设备名称用 /dev
c)关于压缩格式的语句: ("pixel_format", pixel_format_name_, std::string("mjpeg")); ROS
usb_cam网站上提示: 许多网络摄像头连接进笔记本时, 不支持mjpeg压缩, 此处要
改成yuyv或uyvy。
但我的电脑都可以(下面的使用USB外接摄像头也都可以)
d)唯一需要修改的地方是: 在发布话题名称前加'/'. 否则cv_birdge/中的语句
image_sub_ = ("/image_raw", 1, &ImageConverter::imageCb, this);无法运行回调函
数。
应该不是. Talker与listener也没有加后来又测试,发现不加
'/'就不显示图
像。
4.不需要对& 做什么,直接catkin_make一下. 从该包中也可以学习到如何在有多个.h
与.cpp的情况下编译节点.
成功则提示:
Scanning dependencies of target usb_cam
[ 50%] Building CXX object usb_cam/CMakeFiles/src/ CXX shared library
/home/listname/catkin_ws_usbcam/devel/lib/
[ 50%] Built target usb_camScanning dependencies of target usb_cam_node
[100%] Building CXX object usb_cam/CMakeFiles/nodes/ CXX executable
/home/listname/catkin_ws_usbcam/devel/lib/usb_cam/usb_ cam_node
[100%] Built target usb_cam_node
结果是产生了节点 devel/lib/usb_cam/usb_cam_node
在该生成过程中, 文件只是作为源文件,不需要生成节点.
5.执行该节点:
$ source ~/catkin_ws_usbcam/devel/
$ rosrun usb_cam usb_cam_node
执行结果为
head_camera
若要将发布的图像显示出来,请见下方.
图像的接收与显示: 在原有catkin_ws_cvbridge工作空间上进行改动:
1.编写接收图像节点的源代码:
a)复制为。
b)注意将subscribe中的话题名称"/camera/rgb/image_color"
改为usb_cam_node发布的"
/image_raw". 可以参照openTLD中的launch文件,编写launch 文件
c)其它的不需要改动
2.生成节点image_converter_usbcam:
a)对加入如下几句命令,不需要改动
add_executable(image_converter_usbcam src/
target_link_libraries(image_converter_usbcam
${catkin_LIBRARIES})
add_dependencies(image_converter_usbcam
cvbridge_generate_messages_cpp)
b)$ catkin_make
3.执行该节点:
source ~/catkin_ws_cvbridge/devel/
rosrun cvbridge image_converter_usbcam
以后若想随时运行, 操作方法:
1.进入工作空间UsbCam,运行rosrun usb_cam usb_cam_node
2.进入工作空间CvBridge,运行rosrun cvbridge image_converter_usbcam
外接USB摄像头图像获取
图像T opic的发布: 与内置USB摄像头的图像发布相似:利用包usb_cam及其节点
usb_cam_node.
1.源文件: 对于usb_cam包中的唯一一处作修改: 由于外接USB摄像头的设备名为video1,
因此将设备名的语句修改为("video_device", video_device_name_,
std::string("/dev/video1"));
2.生成与执行该节点
~/catkin_ws_usbcam$ catkin_make
source ~/catkin_ws_usbcam/devel/
~/catkin_ws_usbcam$ rosrun usb_cam usb_cam_node
3.
图像Topic的发布: 单独建一个工作空间(上方步骤的重复),为了避免混乱:
作用: 将外置USB摄像头的图像发布到一个Topic上, 消息类型为sensor_msgs::Image.
1.创建UsbCamExternal工作空间
2.下载usb_cam包:进入src文件夹,运行git clone t
3.../nodes/:
a。
外置USB摄像头的设备名称为video1. 关于设备名称的语句该为("video_device",
video_device_name_, std::string("/dev/video1"));
b。
发布话题名称改为image_sub_ = ("/image_usbcam", 1, &ImageConverter::imageCb, this);
4.catkin_make
5.执行该节点:
$ source ~/UsbCamExternal/devel/
$ rosrun usb_cam usb_cam_node
出现如下error,但运行cvbridge后也能正常显示图像
[mjpeg @ 0xe43b60] error count: 64
[mjpeg @ 0xe43b60] error y=31 x=3
图像的接收与显示: 与内置USB摄像头的图像显示严格一致.
在CvBridge工作空间下,执行该节点: (不用再catkin_make了,因为与获得内置USB摄像头图像的节点一样)
1.source ~/catkin_ws_cvbridge/devel/
2.rosrun cvbridge image_converter_usbcam
KinectSkeleton
Openni_tracker
openni_tracker是一个单列的包, 之前在openni_kinect中, 现在openni_kinect已经被ROS抛弃了.
1.创建工作空间: mkdir -p ~/OpenniTracker/src
2.进入src文件夹,下载包:git clone
成功则提示
Cloning into 'openni_tracker'...
remote: Reusing existing pack: 67, done.
remote: Total 67 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (67/67), done.
3.生成: 使用命令: catkin_make, 也生成了链接文件
a)但提示失败:提示缺少Nite_INCLUDEDIR和Nite_LIBRARY. 因此需要安装NiTE
了. 安装过程见下方.
b)安装的以后,不对CMakeList文件做任何修改,再运行catkin_make能生成。
4.执行该节点
初始化kinect: roslaunch turtlebot_bringup 都没有反应,只能用了(Bluts给的),运行sudo ./就立马安装完毕了(就是将.h,.cpp,lib文件复制到相应程序文件夹中了),就对应上了opencv_tracker -> 中的
find_path(Nite_INCLUDEDIR NAMES HINTS/usr/include/nite /usr/local/include/nite)
find_library(Nite_LIBRARY NAMES XnVNite_1_3_1, HINTS /usr/lib /usr/local/lib
PATH_SUFFIXES lib)
不过注意文件NAMES -> XnVNite_1_3_1等效于
在RViz中显示坐标系与点云:
需要做修改(Bluts):
1.中string frame_id("openni_depth_frame")改为string frame_id("camera_depth_frame"); 结
果显示:
2.在RViz的界面中做如下设置:
a)Fixed Frame选择 camera_link , 这个是摄像机的基坐标系.
b)TF:无
c)PointCloud2: Topic选择/camera/depth_registerd/points
3.笔记: 有次运行,点云发暗,再运行一次就正常了。
查看坐标系关系:
1.若命令是: rosrun tf
显示如下结果:
tf tf2_geometry_msgs tf2_py tf_conversions
tf2 tf2_kdl tf2_ros
tf2_bullet tf2_msgs tf2_tools
2.输出坐标系关系的命令: rosrun tf view_frames
结果是在Home文件夹下产生了:
Listening to /tf for seconds
Done Listening
Detected dot version generated
TF Listener(综合实现人体跟踪)
待实现的一环是: 以程序形式获取TF数据. 因此就可利用人体的空间位置来给P3AT发控制量.
tf2_ros/:
从cpp代码中, 可知消息类型为
publisher_ = ("/tf", 100);
那么就可以根据该T opic接收了. 重点参考了hal中的程序.
tfTutorialsWriting a tf listener (C++)
创建包: catkin_create_pkg TfListener std_msgs rospy roscpp tf。
比”ROSARIA程序控制”一节多了tf.
1. 复制RosAriaCode中的(改名为TfListenerAria)到TfListener 中来运行,catkin_make后没有问题。
可以运行。
rosrun TfListener TfListenerAria
2. 中加入:
add_executable(TfListenerAria src/
target_link_libraries(TfListenerAria ${catkin_LIBRARIES})
add_dependencies(TfListenerAria
TfListener_generate_messages_cpp)
2. 加入头文件#include ,也能运行
嗯,这也间接说明lookupTransform在运行,
bringup Kinect后,提示
看来需要把“head”改为“head_1(2,3…)”, 不知程序从哪里加入了后缀”_1”.
需要运行openni_tracker:rosrun openni_tracker openni_tracker, 运行后则有:
1. depth camera的扫描红线出现了。
2. rviz中,出现了人体TF的信息,否则TF下无任何信息
在哪里吧中的"camera_depth_frame","head"等, 改成了"head_1"的坐标系名称
将中的"camera_depth_frame"改成"openni_depth_frame"后,还得要把"head"改成"head_1"等,否则也提示没有找到"head"坐标系, 而且rviz里也不会出现"openni_depth_frame"
对于TfListenerAria节点,当Lost User X时,仍能收到Tf的信息,为什么
读出”head_1”坐标系信息, 有:
说明
x: 越近kinect越小(即深度信息),
y:在kinect前,往右为正,往左为负
z:越下蹲,越负
总体步骤:
1.marvin上启动机器人:
rosrun rosaria RosAria
(通过原先的ROSARIA程序控制方式来测试: rosrun
RosAriaCode rosaria_teleop_code) 2.KinectSkeleton识别人体:bringup Kinect: roslaunch turtlebot_bringup (要打开电源啊,要插上USB线啊)
cd OpenniTracker/
rosrun openni_tracker openni_tracker
3.TfListener:根据人体的空间坐标给机器人发送命令
cd TfListener/
rosrun TfListener TfListenerAria
4.若是通过网络传信息的话,需要在hal上启动RosAria:
roscd ROSARIA
串口线插到下面的串口,上面的口应该是/dev/ttyS1
rosrun ROSARIA RosAria (再运行步骤2与3)
(通过原先的ROSARIA程序控制方式来测试: rosrun RosAriaCode rosaria_teleop_code. 但要把发布的消息由"/RosAria/cmd_vel"改为"cmd_vel")
说明: 通过网络控制时的Debug: 在hal上的RosAria, 虽然Topic 是”cmd_vel”, 但其定义ROS::NodeHandle时带了”~”, 因此真正的Topic为”/RosAria/cmd_vel”. 因此中的Topic也要为”/RosAria/cmd_vel”, 那为什么中的”cmd_vel”可以正常连接呢该过程::
rosnode info /RosAria
------------------------------------------------------------------------------ Node [/RosAria]
Publications:
* /rosout [rosgraph_msgs/Log]
* /tf [tf/tfMessage]
* /RosAria/bumper_state [ROSARIA/BumperState]
* /RosAria/sonar [sensor_msgs/PointCloud]
* /RosAria/odom [nav_msgs/Odometry]
Subscriptions:
* /RosAria/cmd_vel [unknown type] 该包更新之后,可以用catkin了
1.运行安装命令:sudo apt-get install ros-hydro-pocketsphinx
有错误提示
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing
去该网页上找了,发现只有这一新的版本, 看来得需要先更新源,但运行sudo apt-get update 时报错:
The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key 。
HashSummismatch
解决办法是:
sudo apt-get clean
cd /var/lib/apt
sudo mv lists 成功则提示:ldconfig deferred processing now taking place
运行命令$ roslaunch pocketsphinx 创建包:catkin_create_pkg VoiceBridgePKG std_msgs rospy roscpp
2. 中加入
add_executable(VoiceBridgeNode src/
target_link_libraries(VoiceBridgeNode ${catkin_LIBRARIES}) add_dependencies(VoiceBridgeNode
VoiceBridgePKG_generate_messages_cpp)
3. 运行
rosrun VoiceBridgePKG VoiceBridgeNode
语言发布
sound_play包的说明:
How to Configure and Use Speakers with sound_play:
安装与测试:
1.先建立一个工作空间, 并编译:
mkdir -p ~/SoundPlay/src
cd ~/ SoundPlay /src
catkin_init_workspace
cd ~/ SoundPlay
catkin_make
a)否则直接运行$ rosdep install sound_play会有错误提示找不到资源 sound_play:
ERROR: Rosdep cannot find all required resources to answer your query
Missing resource sound_play
ROS path [0]=/opt/ros/hydro/share/ros
ROS path [1]=/opt/ros/hydro/share
ROS path [2]=/opt/ros/hydro/stacks
2.进入src文件夹,下载源包命令: git clone 。
成功则提示 100% done
a)在该网站上提供了源Source: git (branch: hydro-devel),那么说明应该像安装
ROSARIA一样进行安装.
3.安装该包:
a)source ~/catkin_ws_soundplay/devel/
b)$ rosdep install sound_play
有错误提示
试一下更新源, 但提示错误:
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing
ERROR: the following rosdeps failed to install
apt: command [sudo apt-get install ros-hydro-audio-common-msgs] failed
测试运行rosdep update更新:(在src文件夹下),结果是updated cache in
/home/listname/.ros/rosdep/. 再运行rosdep install sound_play 还是不行
错误提示The following packages have unmet dependencies: E: Unable to correct problems, you have held broken packages.
ERROR: the following rosdeps failed to install
apt: command [sudo apt-get install ] failed
重装系统后,再运行上面步骤,就可以了(需要上面建包的步骤)成功则提示: All required rosdeps installed successfully
c)$ rosmake sound_play ; 刚开始不行, 之后某段时间,再运行该句话,就可以了。
成
功则提示:Built 27 packages with 0 failures.
4.(不需进行如下的步骤, 因为默认声卡就1个) 列出声卡设备: cat /proc/asound/cards
结果是: 0 [PCH ]: HDA-Intel - HDA Intel PCH; HDA Intel PCH at 0xd3610000 irq 46
a)asoundconf set-default-card [device #]' >> ~/.asoundrc 成功则发声并提示:Saying:
hello world; Voice: voice_kal_diphone
利用程序来控制发声:
1.文件名修改: 在~/SoundPlay/src/audio_common/sound_play/test下,有文件,之前利用
命令catkin_make生成时,由于它与python下的一文件重名了(在外面的CMakeList。
txt文件中加入add_executable等后,报错,发现的),因此无法生成节点。
解决方法是: 将改名为后,再进行catkin_make就生成了testcpp节点了。
a)也可以改为.
2.运行:rosrun sound_play (需要先source devel/一下)
3.再运行rosrun sound_play testcpp, 之后就发出了中的语言了
综合: 捕获String并发声
1. 在SoundPlay的的基础上进行修改。
并参照“识别结果的接收与显示”一节的。
所得文件为。
2. 修改”旁边的“:
add_executable(RespondVoice
target_link_libraries(RespondVoice ${catkin_LIBRARIES})
add_dependencies(RespondVoice sound_play_gencpp)
3.运行:
a)运行声音捕捉/识别(包含发送String)$ roslaunch pocketsphinx
b) source devel/
rosrun sound_play
c)再运行source devel/
rosrun sound_play
Debug:
在main中加入下面语句就可以:,
sound_play::SoundClient sc2;因此网络通讯/控制变为十分简单.
安装sshd(需要这步吗, 直接下一步应该也行)
首先运行ssh marvin, 有提示错误:ssh: Could not resolve hostname hal: Name or service not known
解决方法:先修改/etc/hosts文件:进入该文件夹:google; 每行也可以是两部份,即主机IP地址和主机名;比如
再运行ssh marvin,又有错误提示ssh: connect to host marvin port 22: Connection refused 检查是否有ssh:service ssh status, 若没有, 则安装ssh server:sudo apt-get install openssh-server. 成功则提示:ssh start/running, process 5058
安装后,运行 ps -e | grep ssh,查看是否有sshd进程,成功则提示
1524 00:00:00 ssh-agent
5058 00:00:00 sshd
再运行ssh marvin 就有:
ECDSA key fingerprint is 4b:19:3d:92:03:12:ad:53:79:88:07:96:9e:e1:27:99.
Are you sure you want to continue connecting (yes/no) yes listname@marvin's password:
Permission denied, please try again.
listname@marvin's password:
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
再ping marvin一下:成功,则显示:
ping marvin:
关闭防火墙:sudo ufw disable 不需要关
两台主机的设置
1.hal机器(P3AT上):主
a)编辑.bashrc : gedit .bashrc,在.bashrc文件中,添加/修改:
export ROS_HOSTNAME=hal
export ROS_MASTER_URI=
b) 编辑/etc/hosts: gedit /etc/hosts, 在hosts文件中添加:
视具体情况而定
2.marvin机器(我的电脑):从
a)在.bashrc文件中,添加/修改:sudo gedit .bashrc
export ROS_HOSTNAME=marvin
b)编辑/etc/hosts: sudo gedit /etc/hosts, 在hosts文件中添加:
3.然后ping hal或者ping marvin命令就能运行了。
在hal上运行roscore就可以,marvin上无需再运行roscore;
由于设置了master为hal:11311, 因此若在marvin上运行roscore,则在hal上提示Unable to connunicate with master!
测试talker-listener例程:
在hal上运行rosrun rospy_tutorials
在marvin上运行rosrun rospy_tutorials
反过来也可以:
在marvin上运行rosrun rospy_tutorials
在hal上运行rosrun rospy_tutorials
测试P3AT的控制: (相当于网络通讯控制了)
目标: 让”marvin”将先锋机器人的控制命令通过Wifi发送给”hal”, 然后”hal”再把此命令发送给先锋机器人
对于hal已有的RosAria,其运动控制的Topic是“cmd_vel”, 因此要把marvin上的Topic也设置为”cmd_vel”,见包NetworkRosAria。
(再一次证明了,没有'/'也可以发布消息)
1.在hal上运行RosAria:
roscd ROSARIA
串口线插到下面的串口,上面的口应该是/dev/ttyS1
rosrun ROSARIA RosAria
2.在marvin上运行NetworkRosAria即可。
总结:只要两机器上的Topic相同,就可以通讯了,不是很复杂。
说明:当marvin进行单机运行时,需要把之前的设置改回去:gedit .bashrc; sudo gedit
/etc/hosts 。
再重启roscore所在的T erminal。
ROS_OpenTLD
程序的编译:
源程序:
先建个文件夹/ros_ws/src, 再直接catkin_make一下。
source devel/ (rosmake做准备),复制rosopentld文件夹到src下,还需要再catkin_make一下吗
需要修改之处:
两个launch文件中把”image_topic”默认的值”im_acq“改为图像发布的话
题:”/image_usbcam” 见
再依次把三个文件夹rosmake(在工作空间路径下):rosmake opentld;rosmake tld_msgs; rosmake tld_tracker;
操作方法:source devel/ 后,先运行~: roslaunch tld_tracker ,再运行~: roslaunch tld_tracker 。
F5是刷新图像。
再在图像上的待跟踪目标上画矩形框,再按回车键就OK了。
ROS学习材料
并运行编译helloworld(包括qt安装)
ROS使用笔记本自带USB摄像头运行pi_face_tracker,进行人脸识别
ROS Tutorials
古月居博客。