机器人操作系统ROS_典型功能实现方法详解(3)

2019-03-28 12:01

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 //既然有math头文件,可以去CmakeList.txt中看看是怎么添加链接库的 ???

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), 则加入的格式为: opencv2 opencv2

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


机器人操作系统ROS_典型功能实现方法详解(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:微积分实验报告2

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: