机器人操作系统ROS_典型功能实现方法详解
更新时间:2024-06-20 09:12:01 阅读量: 综合文库 文档下载
- 机器人控制系统有哪些推荐度:
- 相关推荐
机器人操作系统ROS: 典型功能实现方法详解
李宝全
ROS体系 ....................................................................................................................... 2 ROS安装 ....................................................................................................................... 3 TurtleBot 配置与运行 ................................................................................................... 3 ROS基础的学习 ........................................................................................................... 4 P3-AT/DX ...................................................................................................................... 8
ROSARIA配置与运行 ............................................................................................................. 8 ROSARIA键盘控制: .............................................................................................................. 10 ROSARIA程序控制方式: .................................................................................................... 11 Android遥控 ............................................................................................................................. 11 TurtleBot的键盘控制: ................................................................................................ 12 配置USB转串口 ........................................................................................................ 12 CmakeList.txt的制作 .................................................................................................. 13 图像的发布与接收...................................................................................................... 13
图像的接收,处理与显示 ...................................................................................................... 13 Kinect端获取图像 .................................................................................................................. 14 内置USB 摄像头图像获取 .................................................................................................... 15 外接USB摄像头图像获取 .................................................................................................... 17 KinectSkeleton ............................................................................................................. 17 TF Listener(综合实现人体跟踪) ................................................................................ 19 Voice ............................................................................................................................ 22
语言识别pocketsphinx ........................................................................................................... 22 识别结果的接收与显示 .......................................................................................................... 23 语言发布 .................................................................................................................................. 23 综合: 捕获String并发声 ........................................................................................................ 25 两主机通讯ROS_Network ......................................................................................... 25 ROS_OpenTLD ........................................................................................................... 27 ROS学习材料 ............................................................................................................. 27
1
ROS体系
版本:
Hydro 2013-09-04 Groovy 2012-12-31 Fuerte 2012-04-23 Electric
Diamondback
ROS是一种分布式的处理框架。
文件系统: 在硬盘上查看的ROS源代码的组织形式 包 Package:
含有manifest.xml 或package.xml?
比如下文中的turtlebot_teleop,turtlebot_bringup。 堆:Stack 包的集合
含有stack.xml
编译方法:
catkin:Groovy及以后版本
rosbuild:用于Fuerte及以前版本
常用命令: rostopic list;列出系统中的所有Topic
rosdep: 安装依赖包, 例如 rosdep install rosaria
安装时, 需要先建一个工作空间,然后把gitgub网站上相应的包下载到src文件夹下,再执行该语句。具体见 “ROSARIA配置与运行”一节。
环境变量设置:export 例如:
export ROS_HOSTNAME=marvin
export ROS_MASTER_URI=http://hal:11311
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
2
ROS安装
安装教程:http://wiki.ros.org/hydro/Installation/Ubuntu
sudo sh -c 'echo \latest.list' 1.3 安装keys
wget http://packages.ros.org/ros.key -O - | sudo apt-key add - 1.4 安装
使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
1.5初始化rosdep sudo rosdep init rosdep update 1.6环境设置
echo \source ~/.bashrc 1.7得到rosintall
sudo apt-get install python-rosinstall
TurtleBot 配置与运行
介绍TurtleBot的主页面(安装&运行): http://wiki.ros.org/Robots/TurtleBot
TurtleBot包(Package)的安装过程
安装(turtlebot/Tutorials/hydro/Installation ):按照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/setup.bash. 说明:
a) 在终端中输入这一行后很快就结束.
b) 效果是在.bashrc(Home中的隐藏文件)的最后一行加入了\
/opt/ros/hydro/setup.bash\
c) 效果等效于命令> echo \这样的话就不
用每次启动都输入命令“source /opt/ros/hydro/setup.bash”了. d) 这个好像在安装ROS时已经执行过了,不需要再执行一次吧? 3. 之后加入kobuki的udev规则:> rosrun kobuki_ftdi create_udev_rules
安装完之后还需要加入网络时间控制(turtlebot/Tutorials/hydro/Post-Installation Setup ), 否则与kokuki无法通讯.
1.首先安装chrony:sudo apt-get install chrony 2.再进行syncNTP:sudo ntpdate ntp.ubuntu.com
问题: 我重装系统后再安装turtlebot后,连接不上kokuki,但能正常连接Kinect。在命令
3
行中,提示到bad callback, 因此说明有很多件没有安装成功。需要将其卸载重装,可以网上搜索Uninstall turtlebot来卸载并重装。
运行:
1. 首先打开机器人核心服务程序:打开一个终端:键入: roscore //
2. 系统的检测:New Terminal:输入命令 roslaunch turtlebot_dashboard
turtlebot_dashboard.launch 之后就会弹出kobukiDashboard-rqt 3. kobuki的运动控制:
a. New Terminal: TurtleBot Bringup > roslaunch turtlebot_bringup minimal.launch 用于
初始化机器人?
b. New Terminal:Teleoperation/ Keyboard Teleop : roslaunch turtlebot_teleop
keyboard_teleop.launch 开启键盘控制这一节点, 用于键盘控制机器人的运动.
4. 应用视觉传感器kinect并启动rviz界面: 3D Visualisation
a. New Terminal: > roslaunch turtlebot_bringup 3dsensor.launch; //将3Dsensor加入到系
统中, 初始化kinect传感器//kinect最好插到USB2.0上
b. 启动rviz的view_robot :New Terminal: roslaunch turtlebot_rviz_launchers
view_robot.launch // rviz中也整合了上一步的kobuki的运动控制 c. 这个也可以在p3at上的kinect上运行.
5. SLAM: 与之前的两项无关. 需要重新开始, 否则就报错了.
a. New Terminal: 开启ROS服务: roscore
b. New Terminal: 启动kobuki:roslaunch turtlebot_bringup minimal.launch
c. New Terminal: 运行gmapping Demo:roslaunch turtlebot_navigation
gmapping_demo.launch
d. 启动RVIZ的navigation:New Terminal: roslaunch turtlebot_rviz_launchers
view_navigation.launch
e. 保存建图的结果:rosrun map_server map_saver -f /tmp/my_map f. 说明: 该例程只用到kobuki, 没有用到Kinect. 6. 退出:ctrl+c
ROS基础的学习
ROS Tutorials:http://wiki.ros.org/ROS/Tutorials
1.1.1 Installing and Configuring Your ROS Environment 创建catkin workspace:
1. $ mkdir -p ~/catkin_ws/src //产生工作空间Workspace文件夹, 并产生源空间src文件夹 2. $ cd ~/catkin_ws/src
3. $ catkin_init_workspace //
a. 初始化工作空间//
b. 在src中仅生成一指向/opt/ros/hydro/share/catkin/cmake/toplevel.cmake的
CMakeLists.txt的链接,即CMakeLists.txt的内容与toplevel.cmake的内容一样
4. $ cd ~/catkin_ws/ //回到工作空间中 5. $ catkin_make //build工程??
a. 要在工作空间目录下输入该命令 b. //会产生build,devel文件夹
6. $ source devel/setup.bash //在当前bash环境下读取并执行devel/setup.bash 中的命令
工作空间的结构(包含包的):
workspace_folder/ -- WORKSPACE src/ -- SOURCE SPACE
CMakeLists.txt //怎么没有这个呢 -- 'Toplevel' CMake file, provided by catkin package_1/
4
CMakeLists.txt -- CMakeLists.txt file for package_1 package.xml -- Package manifest for package_1 ...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n package.xml -- Package manifest for package_n
1.1.2 Navigating the ROS Filesystem
1. 查找某一包(package): 使用命令(例如)$ rospack find roscpp. 则会返回路径:
/opt/ros/hydro/share/roscpp
2. 利用命令$ roscd roscpp, 则直接进入/opt/ros/hydro/share/roscpp文件夹. 3. $ pwd //报告当前位置
1.1.3 Creating a ROS Package
上接1.1.1
1. $ cd ~/catkin_ws/src: 首先进入src文件夹.
2. $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp:创建包
a. beginner_tutorials为产生的包的名称,
b. std_msgs, roscpp, rospy为依赖项(dependencies)
1.1.4 Building a ROS Package 上接1.1.3
1. $ cd ~/catkin_ws/ : 首先返回工作空间文件夹. 2. $ ls src: 查看src文件夹中的内容,
a) 结果为beginner_tutorials CMakeLists.txt. b) 链接CMakeLists.txt一直存在
c) 命令ls为列出当前文件夹下的东西 3. $ catkin_make. //build
a) 需要在工作空间目录下运行该命令
b) 若在src文件夹下运行该命令,会有错误提示The specified base path
\contains a CMakeLists.txt but \must be invoked in the root of workspace.
1.1.10 Creating a ROS msg and srv 2.1产生一个消息: 1. 创建一个消息
a) cd ~/catkin_ws/src/beginner_tutorials首先进入文件夹. b) 再创建一个文件夹$ mkdir msg.
c) $ echo \创建一文件Num.msg, 并写入一行话int64 num,
当然还可以多加入几行.
2. 对(beginner_tutorials中的)package.xml添加下面两行:
a)
3. 对(beginner_tutorials中的)CMakeList.txt做如下修改 :
a) 在原有的find_package(xxx)中加入“message_generation”
b) 在catkin_package()中添加CATKIN_DEPENDS message_runtime
c) 取消add_message_files()的注释, 并修改为add_message_files(FILES Num.msg) d) 取消generate_messages(DEPENDENCIES std_msgs)的注释
2.2使用rosmsg
5
$ rosmsg show beginner_tutorials/Num. 应该输出int64 num 但但提示找不到该消息??????
使用查找命令$ rosmsg show Num, 应该输出[beginner_tutorials/Num]:int64 num. 但还是找不到???????????????????
3.1创建一个srv 1. 创建一个srv
a) $ roscd beginner_tutorials//输入这行命令后, 提升找不到 beginner_tutorials文件夹呢.
//只能手动进入该文件夹了 b) $ mkdir srv //创建一个srv文件夹
c) $ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv把ROS系统文件中的
rospy_tutorials包复制文件到srv文件夹下
2. 对beginner_tutorials中的CMakeList.txt做如下修改:
a) 在原有的find_package(xxx)中加入“message_generation”(在创建msg过程中已
添加)
b) 取消add_serivce_files( )的注释, 并修改为add_serivce_files(FILES AddtwoInts.srv)
3.2使用rossrv:
使用命令:$ rossrv show beginner_tutorials/AddTwoInts. 应该输出int64 a int64 b --- int64 sum. 但提示找不到该消息??????
使用查找命令 $ rossrv show AddTwoInts, 也只能查找到[rospy_tutorials/AddTwoInts]中的, 找不到[beginner_tutorials/AddTwoInts]中的. ???????????
4.msg与srv共同的下一步
在CMakeList.txt中, 取消generate_messages(DEPENDENCIES std_msgs)的注释(创建msg阶段已经完成)
在catkin_ws工作空间下输入命令: $ catkin_make
结果是生成了针对不同语言的头文件: msg的C++头文件在 ~/catkin_ws/devel/include/beginner_tutorials/. Python脚本在 ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg. 列表处理语言文件在 ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/. 对于.srv, 生成的结果也类似. 生成成功!
1.1.11 cc Writing a Simple Publisher and Subscriber (C++) 上接1.1.4,不需要经过生成msg与srv的过程 1.0 进入包cd ~/catkin_ws/src/beginner_tutorials
1.1 创建Publisher Node:src/listener.cpp 文件(在该包的src文件夹下) 2.1 创建Subscriber Node:src/talker.cpp 文件(在该包的src文件夹下) 3.1 Building your nodes 生成可执行文件
a) 在CMakeLists.txt文件中(包的目录下面的)最后面加入(CMakeLists.txt已经在之前msg&srv中生成并处理了, 若没经过上面的msg&srv阶段的处理, 也能正常编译生成)
add_executable(talker src/talker.cpp)//生成可执行文件 target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)//包的名错了也没关系
//若是在catkin_ws_wmr的工作空间下, 该行命令可以改为add_dependencies(talker wmrcontrol_generate_messages_cpp)
add_executable(listener src/listener.cpp)//对于listener文件 target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
6
//若是在catkin_ws_wmr的工作空间下, 该行命令可以改为add_dependencies(listener wmrcontrol_generate_messages_cpp)
b) 在工作空间目录下, 输入命令$ catkin_make. 该过程使用了CMakeList.txt. 生成的结果为在:devel/lib/beginner_tutorials下有talker与listener节点(可执行文件). 并有提示:[100%] Built target talker;[100%] Built target listener
1.1.13 cc Examining the Simple Publisher and Subscriber
1. 打开ros服务:roscore 2. 运行talker
a. 另开一个terminal,进入$ cd ~/catkin_ws,
b. 再执行命令$ source ./devel/setup.bash . 该命令等效于 source ~/catkin_ws(工作空间
名)/devel/setup.bash?。该命令很快即执行完毕
c. $ rosrun beginner_tutorials(包的名称) talker : 运行Publisher. (不需要在工作空间目
录下) 之后会看到如下类似消息: [INFO] [WallTime: 1314931831.774057] hello world 1314931831.77.
3. 运行listener
a. 进入$ cd ~/catkin_ws,
b. 再执行命令$ source ./devel/setup.bash
c. $ rosrun beginner_tutorials(包的名称) listener : 运行Subscriber. (不需要在工作空间
目录下) 之后会看到如下类似消息:[INFO] [WallTime: 1314931969.258941] /listener_17657_1314931968795I heard hello world 1314931969.26
1.1.14 cc Writing a Simple Service and Client (C++)
需要在1.1.10 Creating a ROS msg and srv的基础上来编写, 因为需要加入头文件#include \
1. 写一个服务器节点: 进入文件夹cd ~/catkin_ws/src/beginner_tutorials, 编写
src/add_two_ints_server.cpp
2. 写一个客户端节点: 进入文件夹cd ~/catkin_ws/src/beginner_tutorials编写
src/add_two_ints_client.cpp 3. Build节点
a) 在~/catkin_ws/src/beginner_tutorials/CMakeLists.txt中加入如下几行: //把之前生成talker与listener的相关部分注释掉
add_executable(add_two_ints_server src/add_two_ints_server.cpp)//编译成可执行文件 target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})//添加动态链接库 add_dependencies(add_two_ints_server beginner_tutorials_gencpp)//包的名+gencpp? add_executable(add_two_ints_client src/add_two_ints_client.cpp)//client target_link_libraries(add_two_ints_client ${catkin_LIBRARIES}) add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
b) 再进行: cd ~/catkin_ws -> catkin_make : 结果是在devel/lib/beginner_tutorials下生成了两个可执行文件
1.1.16 cc Examining the Simple Service and Client 1. 打开ros服务:roscore 2. 运行服务器端:
a) 还需要再进入$ cd ~/catkin_ws, 再执行命令$ source ./devel/setup.bash
b) 运行add_two_ints_server :输入$ rosrun beginner_tutorials add_two_ints_server. 之后
会看到如下类似消息:[ INFO] [1394710514.388776396]: Ready to add two ints
3. 运行客户端
a) 还需要再进入$ cd ~/catkin_ws, 再执行命令$ source ./devel/setup.bash
b) 运行add_two_ints_server :输入$ rosrun beginner_tutorials add_two_ints_client 1 3. 之
后会看到如下类似消息:[ INFO] [1394710671.682839350]: Sum: 4. 在客户端terminal中可以看到信息[ INFO] [1394710671.682255841]: request: x=1, y=3;[ INFO]
7
[1394710671.682339580]: sending back response: [4]
进一步的服务器客户端例程:https://github.com/fairlight1337/ros_service_examples/
1.1.17 Recording and playing back data ??????????
http://wiki.ros.org/ROS/Tutorials/Recording and playing back data
P3-AT/DX
ROSARIA配置与运行
网站主页 http://wiki.ros.org/ROSARIA
How to use ROSARIA:
http://wiki.ros.org/ROSARIA/Tutorials/How to use ROSARIA
1.2创建ROS工作空间
之前若没有加入启动命令. /opt/ros/hydro/setup.bash的话, 则加入.
为了创建一个关于ROSARIA的工作空间, 将学习ROS基础阶段的catkin_ws文件夹重命名为catkin_ws_Base, 再新建一个工作空间catkin_ws: mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src
catkin_init_workspace// cd ~/catkin_ws
catkin_make//build //这后几步是需要做的,因为在1。4中要运行devel/setup。dash
1.3下载ROSARIA到该工作空间中. 首先进入src文件夹, 之后运行命令git clone https://github.com/amor-ros-pkg/rosaria.git //这次使用github网站就没有问题, 结果是在src文件夹下得到了rosaria包. 包中包含RosAria.cpp文件
在安装ARIA后再下载该包应该也可以??
1.4 安装ARIA以及Build ROSARIA 1. source ~/catkin_ws/devel/setup.bash
a) //在当前bash环境下执行文件~/catkin_ws/devel/setup.bash中的命令.
b) 或者把这项添加到.bashrc文件中再执行.bashrc文件:{echo \
~/catkin_ws/devel/setup.bash\
2. 得到包之后, 编译它们:
a) rosdep update//更新
b) rosdep install rosaria//运行完提示ARIA has been installed in /usr/local/Aria,
installation successful, 再等会,就有 All required rosdeps installed successfully i. 这个应该与1.3中的rosaria包没有关系, 应该是从ROS网站上安装rosaria ii. 看看是不是安装在了/usr/local/Aria中?? iii. 重装系统后再次安装时,出现问题:apt: command [sudo apt-get install
checkinstall] failed。 运行sudo apt-get update时出现问题Some index files failed to download. They have been ignored, or old ones used instead. 解决方法:sudo rm /var/lib/apt/lists/* -vf 删除相应文件
c) catkin_make//与上次的catkin_make显示出不同的结果;//该命令要在该工作空间中//
8
i. 对于包来讲, 名称不区分大小写, 比如当有两个包rosaria与ROSARIA时, 会有如下提示:Multiple packages found with the same name \rosaria- ROSARIA” ii. 当在catkin_ws文件夹下使用命令catkin_make时, 会用到文件src/rosaria/CMakeList.txt iii. 是这一步在devel/lib下生成了rosaria可执行文件??
关于CMakeList.txt文件(不用改): add_executable(RosAria RosAria.cpp)
add_dependencies(RosAria rosaria_gencfg) add_dependencies(RosAria rosaria_gencpp)
target_link_libraries(RosAria ${catkin_LIBRARIES} ${Boost_LIBRARIES} Aria pthread dl rt) set_target_properties(RosAria PROPERTIES COMPILE_FLAGS \
generate_messages( DEPENDENCIES geometry_msgs std_msgs)//要包括geometry_msgs
1.5 运行roscore: 运行roscore
1.6 运行RosAria节点
1. source ~/RosAria/devel/setup.bash. 若不在第一步运行该命令,则会报错[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可知不需要这一步)设置网络地址export ROS_IP=172.22.243.177. 4. 配置好USB转串口后就可以连接了, 连接成功时输出的提示信息为(退出连接的话, 直
接Ctrl+C就可以了.):
[ INFO] [1394765069.684460124]: RosAria: using port: [/dev/ttyUSB0]
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: 2.0
Loaded robot parameters from p3at-sh.p
ArRobotConnector: Connecting to MTX batteries (if neccesary)... ArRobotConnector: Connecting to MTX sonar (if neccesary)...
[ INFO] [1394765070.477106453]: Setting TicksMM from robot EEPROM: 138 [ INFO] [1394765070.480042783]: Setting DriftFactor from robot EEPROM: 0 [ INFO] [1394765070.483254729]: Setting RevCount from robot EEPROM: 32550 [ INFO] [1394765070.526489547]: RosAria: publishing new recharge state 0. [ INFO] [1394765070.526596408]: RosAria: publishing new motors state 0. [ INFO] [1394765072.184292718]: RosAria: publishing new motors state 1.
说明:
1. 一问题的解决:在运行后面连接Android时, 再回头运行此命令, 则就去src/rosaria找该
可执行文件了, 因此从路径上就错了, 不知是那一步影响了该命令的执行. 不过用1.4中的catkin_make命令重新编译一下就又能正常连接了.
2. 若USB转串口没有配置好, 则会出现下方的错误提示, 配置方法请见下方的USB转串口
配置.
[ INFO] [1394760211.482514856]: RosAria: using port: [/dev/ttyUSB0] //这说明使用的COM编号为ttyUSB0
Could not connect to simulator, connecting to robot through serial port /dev/ttyUSB0.
ArSerialConnection::open: Could not open serial port '/dev/ttyUSB0' | ErrorFromOSNum: 2 ErrorFromOSString:
9
No such file or directory
Could not connect, because open on the device connection failed. Failed to connect to robot.
[ERROR] [1394760211.511075792]: RosAria: ARIA could not connect to robot! (Check ~port parameter is correct, and permissions on port device.)
[FATAL] [1394760211.511173101]: RosAria: ROS node setup failed...
1.9 Topics and Commands
1. 获得姿态: rostopic echo /RosAria/pose // 可以在另一terminal的根命令
a) /RosAria/pose为Topic名称 b) .echo 应该是请求输出的命令 c) 运行结果:
2. 线速度控制量的设置(0.1m/s):
rostopic pub -1 /RosAria/cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}'
a) /RosAria/cmd_vel 指话题名字 Topic, 不能是/cmd_vel 或者cmd_vel b) geometry_msgs/Twist 为数据类型 Message
c) '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}' 合成一个消息
d) 运行结果:机器人做相应运动并提升publishing and latching message for 3.0 seconds 。以及[ INFO] [1395025704.461141760]: new speed: [100.00,-0.30](1395025704.461)
3. 角速度控制量的设置(0.1rad/s?):
rostopic pub -1 /RosAria/cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.1}}' 4. 也可以把2,3合成起来.
5. 其他的? sonar, bumpers, acceleration parameters?如何用?更多ROS API请见:
http://wiki.ros.org/ROSARIA
ROSARIA键盘控制:
1. mkdir -p ~/RosAriaKeyboard/src
2. 创建包catkin_create_pkg RosAriaKeyboard std_msgs rospy roscpp
编写程序:
3. 编写rosaria_teleop_key.cpp文件
在CMakeList.txt文件夹下加入如下几行命令(Bluks给我的程序是用rosbuild编译方法。需要做相应借鉴并修改) 1.
find_package(PkgConfig REQUIRED)//若无此 ncurses相关编译命令, 会报错 initscr未定义 pkg_check_modules ( ncurses++ REQUIRED ncurses++)//ncurses相关
add_executable(rosaria_teleop_key src/rosaria_teleop_key.cpp) target_link_libraries(rosaria_teleop_key ${catkin_LIBRARIES})
target_link_libraries(rosaria_teleop_key ${ncurses++_LIBRARIES})//ncurses相关 add_dependencies(rosaria_teleop_key wmrcontrol_generate_messages_cpp)
3. 运行命令catkin_make: 结果是在devel/lib/wmrcontrol下生成了一个rosaria_teleop_key的
可执行文件
10
4. 执行该节点
a). 进入工作空间文件夹 cd ~/catkin_ws_wmr b). 执行命令 $ source devel/setup.bash
c). 运行节点:$rosrun RosAriaKeyboard rosaria_teleop_key
。需要进入工作空间文件夹, 因为在前一步要执行 $ source devel/setup.bash
ROSARIA程序控制方式:
与键盘控制大致相同, 执行节点时注意运行下面的命令 $
为避免混乱,
1. 新建工程mkdir -p ~/RosAriaCode/src
2. 创建包: catkin_create_pkg RosAriaCode std_msgs rospy roscpp 3. 处理CMakeList
add_executable(rosaria_teleop_code src/rosaria_teleop_code.cpp) target_link_libraries(rosaria_teleop_code ${catkin_LIBRARIES})
add_dependencies(rosaria_teleop_code RosAriaCode_generate_messages_cpp) 4. catkin_make一下。 5. 执行:
source devel/setup.bash
rosrun wmrcontrol rosaria_teleop_code
Android遥控
Android Teleoperate Pioneer 3at Robot. 见网站:
http://wiki.ros.org/ROSARIA/Tutorials/iPhone Teleop with ROSARIA/Android teleop Pioneer 3at
android_sensors_driver/ Tutorials/Connecting to a ROS Master
进入之前下载的ROSARIA包的文件夹中cd ~/catkin_ws/src/rosaria
网页上是不是写错了?没有ROSARIA. 只能自己写命令git clone https://github.com/amor-ros-pkg/ROSARIA.git, 结果还可以, 结果是在src文件夹中得到了ROSARIA文件夹. rosaria与ROSARIA文件夹一样大小, 是不是就是一样的? 3.2 Step2
使用命令:Path_from_Home/ROSARIA$ rosmake
但是在rosaria中使用rosmake 就可以, 结果为Built 52 packages with 0 failures., 但在ROSARIA下就报错. 网站上是不是写错了? 3.3 Step3
进入文件夹, 网站上写的命令$ roscd ROSARIA, 但进入不了, 只能手动进入rosaria了, 好像roscd也不能使用.
创建一个文件:命令:gedit android_teleop.cpp & 把网站上的代码粘贴进去再保存.
3.4 Step4
编辑rosaria文件夹下的CMakeList. txt文件. 在最后一行添加rosbuild_add_executable(android_teleop android_teleop.cpp)
在rosaria下输入命令:rosmake. 不起作用呢???????????提示错误信息:
11
[ 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 ] Logging to directory /home/listname/.ros/rosmake/rosmake_output-20140314-164512 [ rosmake ] Expanded args [] to:
[ rosmake ] ERROR: No arguments could be parsed into valid package or stack names.
从pubulisher节点中学习如何编译并运行Node??????
TurtleBot的键盘控制:
控制命令以Terminal端键入方式:
TurtleBot与p3dx应该很像,那么能不能在p3dx的terminal命令的基础上修改得到呢?,大胆尝试后,竟然对了!TurtleBot端的命令为:(当然需要先启动机器人)
rostopic pub -1 cmd_vel_mux/input/teleop geometry_msgs/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -0.6}}'
原因是,观察到keyboard_teleop.launch中含有如下一句话:
那么很有可能Topic的名称改为 cmd_vel_mux/input/teleop。输入上述命令之后发现机器人没有动,但我听到机器人里有动静,因此我就把速度量调大,结果机器人就动了。这才意识到,这种TurtleBot机器人不像RosAria那样输入命令后就一直动,而是执行完命令立刻停止,因此速度量小的话机器人基本上不动,会让人误认为命令是错的。 当然也有些偶然因素,若是多个/少个/,去哪知道呢, 是吧。 keyboard_teleop.launch中以及把 turtlebot_teleop_keyboard/cmd_vel映射到cmd_vel_mux/input/teleop上了,因此下方的指令不起作用. rostopic pub -1 turtlebot_teleop_keyboard/cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -0.6}}' 以程序方式控制 与RosAria相似 配置USB转串口 说明: 用于连接先锋机器人 1. 串口编号方式: 串口COM1对应于ttyS0, COM2对应于ttyS1. 若是使用USB转串口, 则 COM1对于ttyUSB0. Aria即默认使用ttyUSB0 2. 默认情况下Ubuntu中已经安装了PL2303的驱动. 插入USB接口后,在dev/下会生成 名为ttyUSB0的文件. 若使用命令lsmod | grep usbserial, 则显示usbserial 42594 1 pl2303. 不过等配置完minicom后又提示 “lsmod | grep usbserial无此命令”了呢? 串口的调试: 1. 串口调试工具minicom的安装:sudo apt-get install minicom一个命令就可以自动下载 安装 2. 串口配置: a) 输入sudo minicom -s (要有root权限,否则提示Cannot write to /usr/etc/minirc.dfl)命令, 进入将串口配置项, 将下面两项配置为 12 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. 参考: Ubuntu 下使用minicom 的配置过程: http://www.cnblogs.com/emouse/archive/2012/03/20/2408243.html CmakeList.txt的制作 RosAria中有如下一行: #include Usb_cam_node节点编译时, 有个usb_cam.h与usb_cam.cpp, 学习一下是怎么编译的, 编译方法: 若工作空间是复制过来的, 是不是直接加入ROS_PACKAGE_PATH就可以使用了?????????????????? 图像的发布与接收 图像的接收,处理与显示 网址: 图像传递cv_bridage http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages 概念: ROS的图像数据使用sensor_msgs/Image的消息格式 CvBridge 属于ROS的库, 在vision_opencv(堆stack) /cv_bridge(包package) /image_geometry中. 用以转换sensor_msgs/Image至cv::Mat 该部分的功能是: 从相应Topic中获得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 该命令也生成了CmakeList.txt与package.xml文件; 也生成了src下的CmakeList.txt的快捷方式?? 3. 编写节点image_converter.cpp: 13 关于Topic, 有: /camera/rgb/image_color : 这个是采集kinect的图像, 并且图像已经自动左右翻转过来了。 /camera/image_raw : 这是原有例程中的, 但是找不到图像 写\时, 里面加了个空格. 生成时通过, 但运行时会报错: [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. 处理CMakeList.txt 在该文件中加入: add_executable(image_converter src/image_converter.cpp) target_link_libraries(image_converter ${catkin_LIBRARIES}) add_dependencies(image_converter cvbridge_generate_messages_cpp) 5. 处理package.xml: 需要加入(include) image_transport,cv_bridge与opencv2三项. 由于在创建包时包含了相关依赖项, 因此 image_transport与cv_bridge已经提前自动加入了. 在package.xml 中虽然没有加入opencv2, 可能在加入cv_bridge时, 其已经加入了opencv2, 因此不加入opencv2也能正常在图像上做操作(比如画个圆圈). 总之, 不对package.xml作任何改动即可直接catkin_make. 若需加入(include), 则加入的格式为: 6. catkin_make: 生成image_converter节点; 也生成了src下的CMakeListtxt的链接?? 7. 运行该节点: a) source ~/catkin_ws_cvbridge/devel/setup.bash b) rosrun cvbridge image_converter Kinect端获取图像 图像Topic的发布: 首先要初始化Kinect: 1首先启动roscore; 若忘记启动roscore,则会报错:[ERROR] [1395107082.920068462]: [registerPublisher] Failed to contact master at [localhost:11311]. Retrying... 启动roscore后, 显示[ INFO] [1395107093.398605143]: Connected to master at [localhost:11311] 2初始化kinect: roslaunch turtlebot_bringup 3dsensor.launch. 也可以启动rviz: roslaunch turtlebot_rviz_launchers view_robot.launch, 在运行此节点过程中, rviz不用关。 a)初始化kinect的过程就等于是发布图像Topic的过程。对于内置USB摄像头而言, 需要运行下载的包usb_cam来产生图像(具体见下一节内置USB摄像头图像获取) 初始化后,后就会产生\等图像Topic。接下来就要从该Topic中接受图像数据并显示出来了, 请见下方。 图像的接收与显示: 运行cv_bridge包:注意将 image_converter.cpp中的Topic名称改为\然后按照”图像传递cv_bridge”一节操作即可。 为了避免混乱, 新建一工作空间 mkdir -p ~/ImageDisplayKinect/src 14 然后把CvBridge中的包cvbridge复制到src下, 对CMakeList做相应修改。 再catkin_make一下 运行该节点: source ~/catkin_ws_cvbridge/devel/setup.bash rosrun cvbridge image_converter 内置USB 摄像头图像获取 需要用到usb_cam包: http://wiki.ros.org/usb_cam 对于笔记本内置USB摄像头的图像获取, 要比Kinect的复杂, 原因是在图像Topic的发布阶段需要做操作。在图像接收并显示的阶段就相似了。 图像Topic的发布: 作用: 将USB摄像头(内置/外置)的图像发布到一个Topic上, 消息类型为sensor_msgs::Image. 1. 创建usb_cam工作空间 之前若没有加入启动命令. /opt/ros/hydro/setup.bash的话, 则加入. mkdir -p ~/catkin_ws_usbcam/src cd ~/catkin_ws_usbcam/src catkin_init_workspace//这一步也不用做 2. 下载usb_cam包到该工作空间中. 首先进入src文件夹, 之后运行命令git clone https://github.com/bosch-ros-pkg/usb_cam.git //这次使用github网站就没有问题, 结果是在src文件夹下得到了包usb_cam. 成功则提示 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), 364.15 KiB | 143 KiB/s, done. Resolving deltas: 100% (244/244), done. 包usb_cam含有文件: 1 ../include/usb_cam/usb_cam.h, 2 ../src/usb_cam.cpp, 3 ../nodes/usb_cam_node.cpp, 4 CMakeList.txt与package.xml文件。 3. 关于usb_cam包中的usb_cam_node.cpp, 有如下说明 a) 内置USB摄像头的设备名称为video0. 关于设备名称的语句为 node_.param(\该节点默认采集内置USB摄像头的图像, 因此不用改了. b) 查看设备名称用 /dev ?? c) 关于压缩格式的语句: node_.param(\pixel_format_name_, std::string(\ROS usb_cam网站上提示: 许多网络摄像头连接进笔记本时, 不支持mjpeg压缩, 此处要改成yuyv或uyvy。 但我的电脑都可以(下面的使用USB外接摄像头也都可以) d) 唯一需要修改的地方是: 在发布话题名称前加'/'. 否则 cv_birdge/image_converter_usbcam.cpp中的语句image_sub_ = it_.subscribe(\1, &ImageConverter::imageCb, this);无法运行回调函 15 数。????????应该不是. Talker与listener也没有加???? 后来又测试,发现不加'/'就不显示图像。 4. 不需要对CMakeList.txt & package.xml做什么, 直接catkin_make一下. 从该包中也可 以学习到如何在有多个.h与.cpp的情况下编译节点. 成功则提示: Scanning dependencies of target usb_cam [ 50%] Building CXX object usb_cam/CMakeFiles/usb_cam.dir/src/usb_cam.cpp.o Linking CXX shared library /home/listname/catkin_ws_usbcam/devel/lib/libusb_cam.so [ 50%] Built target usb_camScanning dependencies of target usb_cam_node [100%] Building CXX object usb_cam/CMakeFiles/usb_cam_node.dir/nodes/usb_cam_node.cpp.o Linking 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 在该生成过程中, usb_cam.cpp文件只是作为源文件,不需要生成节点. 5. 执行该节点: $ source ~/catkin_ws_usbcam/devel/setup.bash $ rosrun usb_cam usb_cam_node 执行结果为 [ INFO] [1395144361.890765227]: Camera name: head_camera [ INFO] [1395144361.890932369]: Camera info url: [ INFO] [1395144361.891021666]: usb_cam video_device set to [/dev/video0] [ INFO] [1395144361.891108635]: usb_cam io_method set to [mmap] [ INFO] [1395144361.891196215]: usb_cam image_width set to [640] [ INFO] [1395144361.891275158]: usb_cam image_height set to [480] [ INFO] [1395144361.891358759]: usb_cam pixel_format set to [mjpeg] [ INFO] [1395144361.891524348]: usb_cam auto_focus set to [0] [ INFO] [1395144362.218432362]: using default calibration URL [ INFO] [1395144362.218573782]: camera calibration URL: file:///home/listname/.ros/camera_info/head_camera.yaml [ INFO] [1395144362.218806683]: Unable to open camera calibration file [/home/listname/.ros/camera_info/head_camera.yaml]//不用管这行 [ WARN] [1395144362.218924552]: Camera calibration file /home/listname/.ros/camera_info/head_camera.yaml not found.//这一行应该没关系, 连接kinect时也会提示 内置摄像头的指示灯确实亮了, ctrl+c后就灭了, 说明应该已经获得图像了. 若要将发布的图像显示出来,请见下方. 图像的接收与显示: 在原有catkin_ws_cvbridge工作空间上进行改动: 1. 编写接收图像节点的源代码image_converter_usbcam.cpp: a) 复制image_converter.cpp为image_converter_usbcam.cpp。 b) 注意将subscribe中的话题名称\改为usb_cam_node发布的\ /image_raw\可以参照openTLD中的launch文件,编写launch文件????? c) 其它的不需要改动 2. 生成节点image_converter_usbcam: a) 对CMakeList.txt加入如下几句命令, package.xml不需要改动 add_executable(image_converter_usbcam src/image_converter_usbcam.cpp) 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/setup.bash rosrun cvbridge image_converter_usbcam 以后若想随时运行, 操作方法: 16 1. 2. 进入工作空间UsbCam, 运行rosrun usb_cam usb_cam_node 进入工作空间CvBridge, 运行rosrun cvbridge image_converter_usbcam 外接USB摄像头图像获取 图像Topic的发布: 与内置USB摄像头的图像发布相似:利用包usb_cam及其节点usb_cam_node. 1. 源文件: 对于usb_cam包中usb_cam_node.cpp的唯一一处作修改: 由于外接USB摄像头的 设备名为video1,因此将设备名的语句修改为 node_.param(\video_device_name_, std::string(\2. 生成与执行该节点 ~/catkin_ws_usbcam$ catkin_make source ~/catkin_ws_usbcam/devel/setup.bash ~/catkin_ws_usbcam$ rosrun usb_cam usb_cam_node 3. 图像Topic的发布: 单独建一个工作空间(上方步骤的重复),为了避免混乱: 作用: 将外置USB摄像头的图像发布到一个Topic上, 消息类型为sensor_msgs::Image. 1. 创建UsbCamExternal工作空间 2. 下载usb_cam包:进入src文件夹,运行git clone https://github.com/bosch-ros-pkg/usb_cam.git 3. ../nodes/usb_cam_node.cpp: a。外置USB摄像头的设备名称为video1. 关于设备名称的语句该为 node_.param(\b。发布话题名称改为image_sub_ = it_.subscribe(\&ImageConverter::imageCb, this); 4. catkin_make 5. 执行该节点: $ source ~/UsbCamExternal/devel/setup.bash $ 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/setup.bash 2. rosrun cvbridge image_converter_usbcam KinectSkeleton Openni_tracker http://wiki.ros.org/openni_tracker openni_tracker是一个单列的包, 之前在openni_kinect中, 现在openni_kinect已经被ROS抛弃了. 17 1. 创建工作空间: mkdir -p ~/OpenniTracker/src 2. 进入src文件夹, 下载包:git clone https://github.com/ros-drivers/openni_tracker.git 成功则提示 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, 也生成了CMakeList.txt链接文件 a) 但提示失败:提示缺少Nite_INCLUDEDIR和Nite_LIBRARY. 因此需要安装NiTE 了. 安装过程见下方. b) 安装v1.5的以后, 不对CMakeList文件做任何修改,再运行catkin_make能生成。 4. 执行该节点 a) 初始化kinect: roslaunch turtlebot_bringup 3dsensor.launch //不用初始化的话 openni_tracker节点也能正常运行,是用了Nite的缘故? 但若用RViz时, 就得需要初始化kinect了,否则软件中就没有信息只有个Grid b) source devel/setup.bash c) rosrun openni_tracker openni_tracker //总是不识别, 得手动敲入了 5. 运行结果: 本以为执行无反应, 其实是该包根本就没有网页上的图像示例(误导使用 者了),有人走过时, 在terminal中才显示, 这个让我长时间误认为程序无法运行: New User 1//用户走入 Pose Psi detected for user 1 //没有这句话啊 Calibration started for user 1 Calibration complete, start tracking user 1 Lost User 1 //用户走出 安装NiTE:不知怎么回事,v2.2,v2.1,运行./install.sh都没有反应, 只能用v1.5了(Bluts给的),运行sudo ./install.sh就立马安装完毕了(就是将.h,.cpp,lib文件复制到相应程序文件夹中了),就对应上了opencv_tracker -> CMakeList.txt中的 find_path(Nite_INCLUDEDIR NAMES XnVNite.h 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等效于libXnVNite_1_3_1.so??? 在RViz中显示坐标系与点云: 需要做修改(Bluts): 1. openni_tracker.cpp中string frame_id(\改为string frame_id(\//在RViz中,Grid的frame之一就是 camera_depth_frame 2. 3dsensor.launch文件中, publish_tf对应的false改为了true, 意义是什么??? a) 进入文件夹所在路径:/opt/ros/hydro/share/turtlebot_bringup/launch b) 修改命令为:sudo gedit 3dsensor.launch RViz中: 1. 命令是rosrun rviz rviz. 结果显示: [ INFO] [1395309973.626822675]: rviz version 1.10.11 [ INFO] [1395309973.626925690]: compiled against OGRE version 1.7.4 (Cthugha) [ INFO] [1395309974.034415316]: OpenGl version: 3 (GLSL 1.3). 2. 在RViz的界面中做如下设置: a) Fixed Frame选择 camera_link , 这个是摄像机的基坐标系. b) TF:无 c) PointCloud2: Topic选择/camera/depth_registerd/points 3. 笔记: 有次运行,点云发暗, 再运行一次就正常了。 18 查看坐标系关系: frames.pdf 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文件夹下产生了frame.pdf: Listening to /tf for 5.000000 seconds Done Listening dot - graphviz version 2.26.3 (20100126.1600) Detected dot version 2.26.3 frames.pdf generated TF Listener(综合实现人体跟踪) 待实现的一环是: 以程序形式获取TF数据. 因此就可利用人体的空间位置来给P3AT发控制量. tf2_ros/transform_broadcaster.cpp: http://docs.ros.org/hydro/api/tf2_ros/html/c++/transform__broadcaster_8cpp_source.html 从cpp代码中, 可知消息类型为 publisher_ = node_.advertise 那么就可以根据该Topic接收了. 重点参考了hal中的程序aria_tf_listener.cpp. tfTutorialsWriting a tf listener (C++) http://wiki.ros.org/tf/Tutorials/Writing a tf listener (C++) 创建包: catkin_create_pkg TfListener std_msgs rospy roscpp tf。比”ROSARIA程序控制”一节多了tf. 1. 复制RosAriaCode中的rosaria_teleop_code.cpp(改名为TfListenerAria)到TfListener中来运行,catkin_make后没有问题。可以运行。 rosrun TfListener TfListenerAria 2. CMakeList.txt中加入: add_executable(TfListenerAria src/TfListenerAria.cpp) target_link_libraries(TfListenerAria ${catkin_LIBRARIES}) add_dependencies(TfListenerAria TfListener_generate_messages_cpp) 2. 加入头文件#include [ERROR] [1395888613.400748574]: \passed to lookupTransform argument target_frame does not exist. 嗯,这也间接说明lookupTransform在运行, bringup Kinect后,提示 [ERROR] [1395888750.517122967]: \does not exist. 看来需要把“head”改为“head_1(2,3…)”, 不知程序从哪里加入了后缀”_1”. 需要运行openni_tracker:rosrun openni_tracker openni_tracker, 运行后则有: 1. depth camera的扫描红线出现了。 2. rviz中,出现了人体TF的信息,否则TF下无任何信息 19 在哪里吧openni_tracker.cpp中的\,\等, 改成了\的坐标系名称 将openni_tracker.cpp中的\改成\后,还得要把\改成\等,否则也提示没有找到\坐标系, 而且rviz里也不会出现\ 对于TfListenerAria节点, 当Lost User X时,仍能收到Tf的信息,为什么??? 读出”head_1”坐标系信息, 有: [ INFO] [1395909978.699846534]: x: 2.339041, y: -1.016116, z: -0.421484 说明 x: 越近kinect越小(即深度信息), y:在kinect前,往右为正,往左为负 z:越下蹲,越负 总体步骤: 1. marvin上启动机器人: rosrun rosaria RosAria (通过原先的ROSARIA程序控制方式来测试: rosrun RosAriaCode rosaria_teleop_code) 2. KinectSkeleton识别人体: bringup Kinect: roslaunch turtlebot_bringup 3dsensor.launch(要打开电源啊,要插上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. 但要把发布的消息由\改为\ 说明: 通过网络控制时的Debug: 在hal上的RosAria, 虽然Topic是”cmd_vel”, 但其定义ROS::NodeHandle时带了”~”, 因此真正的Topic为”/RosAria/cmd_vel”. 因此TfListenerAria.cpp中的Topic也要为”/RosAria/cmd_vel”, 那为什么rosaria_teleop_code.cpp中的”cmd_vel”可以正常连接呢??? 该过程:: rosnode info /RosAria ------------------------------------------------------------------------------ Node [/RosAria] Publications: * /rosout [rosgraph_msgs/Log] * /tf [tf/tfMessage] 20 * /RosAria/bumper_state [ROSARIA/BumperState] * /RosAria/sonar [sensor_msgs/PointCloud] * /RosAria/odom [nav_msgs/Odometry] Subscriptions: * /RosAria/cmd_vel [unknown type] //最好还是需要注明Message Services: * /RosAria/get_loggers * /RosAria/set_logger_level contacting node http://hal:35119/ ... Pid: 3695 Connections: * topic: /rosout * to: /rosout * direction: outbound * transport: TCPROS rosnode info /rosaria_teleop_key_1 ------------------------------------------------------------------------------- Node [/rosaria_teleop_key_1] Publications: * /rosout [rosgraph_msgs/Log] * /RosAria/cmd_vel [geometry_msgs/Twist] Subscriptions: None Services: * /rosaria_teleop_key_1/get_loggers * /rosaria_teleop_key_1/set_logger_level contacting node http://marvin:37524/ ... Pid: 10811 Connections: * topic: /rosout * to: /rosout * direction: outbound * transport: TCPROS * topic: /RosAria/cmd_vel //写的是cmd_vel,但自动变为了这个 * to: /RosAria * direction: outbound * transport: TCPROS ~$ rosnode info /rosaria_teleop_TfListener ------------------------------------------------------------------------------ Node [/rosaria_teleop_TfListener] Publications: 21 * /rosout [rosgraph_msgs/Log] * /cmd_vel [geometry_msgs/Twist] ///问题就出在这里!!!!!,应该是/RosAria/cmd_vel Subscriptions: * /tf_static [unknown type] * /tf [tf/tfMessage] Services: * /rosaria_teleop_TfListener/set_logger_level * /rosaria_teleop_TfListener/get_loggers contacting node http://marvin:55079/ ... Pid: 11076 Connections: * topic: /rosout * to: /rosout * direction: outbound * transport: TCPROS * topic: /tf * to: /RosAria (http://hal:37473/) * direction: inbound * transport: TCPROS 框架 KinectP3-ATPlayer骨骼信息Laptop控制指令Laptop Voice 语言识别pocketsphinx 语言识别教程:http://wiki.ros.org/pocketsphinx . 该包更新之后, 可以用catkin了 1. 运行安装命令:sudo apt-get install ros-hydro-pocketsphinx 有错误提示 Err http://packages.ros.org/ros/ubuntu/ precise/main ros-hydro-pocketsphinx amd64 0.3.0-0precise-20140130-2150-+0000 404 Not Found Failed to fetch http://packages.ros.org/ros/ubuntu/pool/main/r/ros-hydro-pocketsphinx/ros-hydro-pocketsphinx_0.3.0-0precise-20140130-2150-+0000_amd64.deb 404 Not Found E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing? 22 去该网页上找了, 发现只有20140304这一新的版本, 看来得需要先更新源,但运行sudo apt-get update 时报错: W: GPG error: http://security.ubuntu.com precise-security Release: The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key 。。。Hash Sum mismatch 解决办法是: sudo apt-get clean cd /var/lib/apt sudo mv lists lists.old //把lists文件夹改名为list.old sudo mkdir -p lists/partial //新建文件夹 sudo apt-get clean sudo apt-get update 再运行安装命令,sudo apt-get install ros-hydro-pocketsphinx. 成功则提示:ldconfig deferred processing now taking place 2. 运行命令$ roslaunch pocketsphinx robocup.launch //不识别 还得手动敲进去 3. 需要在系统设置中设置麦克风的音量,要设置得大一些, 4. 查看发布的结果消息$ rostopic echo /recognizer/output 查看语音库 roscd pocketsphinx/demo 进入了文件夹; /opt/ros/hydro/share/pocketsphinx/demo$ 识别结果的接收与显示 该程序的目的是: 对于在语言识别阶段发出的识别结果String, 将其获取 (Subscribe)后从屏幕上显示 1. 首先需要获取pocketsphinx的String输出Topic: 该Topic “/recognizer” 的Node信息为 ~$ rosnode info /recognizer ----------------------------------------------------------------- Node [/recognizer] Publications: * /recognizer/output [std_msgs/String] * /rosout [rosgraph_msgs/Log] Subscriptions: None Services: ?? 因此可知Topic为”/recognizer/output”,Message为 [std_msgs/String],因此就可以设计程序了: 1. 创建包:catkin_create_pkg VoiceBridgePKG std_msgs rospy roscpp 2. CMakeList.txt中加入 add_executable(VoiceBridgeNode src/VoiceBridgeNode.cpp) target_link_libraries(VoiceBridgeNode ${catkin_LIBRARIES}) add_dependencies(VoiceBridgeNode VoiceBridgePKG_generate_messages_cpp) 3. 运行 rosrun VoiceBridgePKG VoiceBridgeNode 语言发布 sound_play包的说明: http://wiki.ros.org/sound_play How to Configure and Use Speakers with sound_play: http://wiki.ros.org/sound_play/Tutorials/ConfiguringAndUsingSpeakers 安装与测试: 23 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 https://github.com/ros-drivers/audio_common.git。 成功则提示 100% done a) 在该网站上提供了源Source: git https://github.com/ros-drivers/audio_common.git (branch: hydro-devel), 那么说明应该像安装ROSARIA一样进行安装. 3. 安装该包: a) source ~/catkin_ws_soundplay/devel/setup.bash b) $ rosdep install sound_play 有错误提示 Err http://packages.ros.org/ros/ubuntu/ precise/main ros-hydro-audio-common-msgs amd64 0.2.5-0precise-20140130-1931-+0000 404 Not Found 试一下更新源, 但提示错误: Failed to fetch http://packages.ros.org/ros/ubuntu/pool/main/r/ros-hydro-audio-common-msgs/ros-hydro-audio-common-msgs_0.2.5-0precise-20140130-1931-+0000_amd64.deb 404 Not Found 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/sources.cache. 再运行rosdep install sound_play 还是不行 错误提示The following packages have unmet dependencies: libgstreamer-plugins-base0.10-dev : Depends: libgstreamer-plugins-base0.10-0 (= 0.10.36-1) but 0.10.36-1ubuntu0.1 is to be installed Depends: gir1.2-gst-plugins-base-0.10 (= 0.10.36-1) but 0.10.36-1ubuntu0.1 is to be installed E: Unable to correct problems, you have held broken packages. ERROR: the following rosdeps failed to install apt: command [sudo apt-get install libgstreamer-plugins-base0.10-dev] 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 asoundconf set-default-card [device #]//设置默认声卡, 总提示asoundconf找不到该命令 sudo apt-get install alsa-utils//执行改命令来安装,也不行 再输入asoundconf is-active, 总提示asoundconf找不到该命令 echo 'include \跟setup bash一样? 5. 运行 a) 得需要先catkin_make一下 b) $ rosrun sound_play soundplay_node.py成功则提示[INFO] [WallTime: 1395715034.562594] sound_play node is ready to play sound c) 在另一Terminal中运行:$ rosrun sound_play say.py \成功则发声并提 示:Saying: hello world; Voice: voice_kal_diphone 利用程序来控制发声: 24 1. 文件名修改: 在~/SoundPlay/src/audio_common/sound_play/test下,有文件test.cpp,之 前利用命令catkin_make生成时,由于它与python下的一文件test.py重名了(在外面的CMakeList。txt文件中加入add_executable等后,报错,发现的?),因此无法生成节点。解决方法是: 将test.cpp改名为testcpp.cpp后, 再进行catkin_make就生成了testcpp节点了。 a) 也可以改为SoundDemo.cpp. 2. 运行:rosrun sound_play soundplay_node.py(需要先source devel/setup.bash一下) 3. 再运行rosrun sound_play testcpp, 之后就发出了test.cpp中的语言了 综合: 捕获String并发声 1. 在SoundPlay的testcpp.cpp的基础上进行修改。并参照“识别结果的接收与显示”一节的VoiceBridgeNode.cpp。所得文件为RespondVoice.cpp。 2. 修改RespondVoice.cpp”旁边的“CMakeList.txt: add_executable(RespondVoice RespondVoice.cpp) target_link_libraries(RespondVoice ${catkin_LIBRARIES}) add_dependencies(RespondVoice sound_play_gencpp) 3.运行: a)运行声音捕捉/识别(包含发送String)$ roslaunch pocketsphinx robocup.launch b) source devel/setup.bash rosrun sound_play soundplay_node.py c)再运行source devel/setup.bash rosrun sound_play RespondVoice.cpp Debug: 在main中加入下面语句就可以:, sound_play::SoundClient sc2;//sc2.say(\否则提示: [ WARN] [1395992984.300656028]: Sound command issued, but no node is subscribed to the topic. Perhaps you forgot to run soundplay_node.py 原因??? 两主机通讯ROS_Network 参考网址 http://wiki.ros.org/ROS/NetworkSetup ;http://wiki.ros.org/ROS/Tutorials/MultipleMachines ROS的分布式特点: 对两主机进行简单配置后, 若有相同的Topic, 则节点之间即可跨主机利用网络进行通讯. 因此网络通讯/控制变为十分简单. 安装sshd(需要这步吗??, 直接下一步应该也行?) 首先运行ssh marvin, 有提示错误:ssh: Could not resolve hostname hal: Name or service not known 解决方法:先修改/etc/hosts文件:进入该文件夹: cd /etc ; sudo gedit hosts;加入语句192.168.0.12(Tab键)marvin ? (例如216.239.37.99 www.google.com google; 每行也可以是两部份,即主机IP地址和主机名;比如 192.168.1.100 linmu100,无需重启网络) 再运行ssh marvin, 又有错误提示ssh: connect to host marvin port 22: Connection refused 检查是否有ssh:service ssh status, 若没有, 则安装ssh server:sudo apt-get install 25
正在阅读:
固体物理历年试卷03-27
现场急救演练记录09-07
企业文化 我为什么离开高盛?07-23
党支部党建个人工作总结优选范文04-03
说名道姓作文600字06-20
我最爱的动画人物作文300字06-24
CRH5A EMU概述、司机室和司机操作学习笔记 - 图文09-23
课间风波作文500字07-12
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 机器人
- 详解
- 典型
- 操作系统
- 实现
- 功能
- 方法
- ROS
- 2017长宁二模卷英语(含答案)
- 初中英语语法第三课冠词(适合授课)
- 安全性评价工作管理制度
- 八路军第115师各时期战斗序列及主要干部授衔情况
- 衍纸教学计划
- 邮政经营服务会议局长讲话-工作报告上百度
- 学生会干部竞选词
- 八年级数学下学期期末试卷(含解析) 新人教版1
- 2017年初三中考英语语法总复习
- 中投信德生态农业产业园建设项目可行性研究报告 - 图文
- 2014西藏自治区JAVA版本高级
- 菠萝饮料项目立项申请报告书
- 八年级数学下册 181 勾股定理教案一 新人教版
- 陕西省蓝田县高中化学第三章金属及其化合物3.2铁的重要化合物教
- 外研八年级上册各模块英语作文范文
- 论保护知识产权与健全国家创新机制
- 人民美术出版社四年级上册《书法练习与指导》教案
- 液压传动论文5000字
- 关于框架节点抗剪超限的解决方法
- 民营企业跨国并购融资模式研究