机器人操作系统(ROS)课件7.1遥控小海龟_第1页
机器人操作系统(ROS)课件7.1遥控小海龟_第2页
机器人操作系统(ROS)课件7.1遥控小海龟_第3页
机器人操作系统(ROS)课件7.1遥控小海龟_第4页
机器人操作系统(ROS)课件7.1遥控小海龟_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器人操作系统(ROS)机器人操作系统(ROS)遥控小海龟运动7.1机器人操作系统(ROS)7.1遥控小海龟运动

我们在刚开始学习ROS的时候,接触到的第一个功能包是turtlesim,该功能包可以通过键盘控制小海龟在界面中移动。这个功能包的核心是turtlesim_node节点,提供一个可视化的海龟仿真器。本章中我们将学习在ROS中如何使用遥控器来控制小海龟运动,实验分别以红外遥控器和游戏手柄为例来实现小海龟的运动控制。

红外遥控器

游戏手柄

仿真小海龟机器人操作系统(ROS)7.1.1红外遥控器控制小海龟运动硬件基础

实验用到的硬件包括:红外遥控器、红外解码模块、USB转TTL模块。红外解码模块可将红外遥控器发射的红外编码信号解码成相应的16进制数并通过串口进行输出。USB转TTL模块与红外解码模块通过杜邦线进行连接,通过USB端口连接至上位机。

红外遥控器红外解码器USB转TTL模块红外遥控器按键对应的16进制编码红外遥控器按键对应的16进制编码,其中用户码为“00FF”,串口输出数据为“用户码+键位码”,例如我们按下“OK”键,串口则输出“00FF1C”。机器人操作系统(ROS)软件基础在终端中输入以下命令安装ROS串口功能包:$catkin_create_pkgteleoperationstd_msgsrospyroscpp输入以下命令检测serial包是否安装好:$rospackfindserial若终端显示serial的路径(/opt/ros/melodic/share/serial),则说明安装成功。7.1.1红外遥控器控制小海龟运动机器人操作系统(ROS)在~/catkin_ws/src下输入以下命令创建一个名为serialport的功能包:$catkin_create_pkgserialportroscpprospystd_msgsserial在serialport/src文件夹下创建名为infrared_remote.cpp的文件,并填入以下代码:#include<ros/ros.h>#include<serial/serial.h>//ROS已经内置了的串口包#include<geometry_msgs/Twist.h>serial::Serialser;//声明串口对象

uint8_tbuffer[3];//定义串口数据存放数组

uint8_ta;intmain(intargc,char**argv){ros::init(argc,argv,"serial_remote_node");//初始化节点ros::NodeHandlenh;//声明节点句柄 ros::Publisherread_pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);//发布话题……7.1.1红外遥控器控制小海龟运动软件基础机器人操作系统(ROS)代码解释ros/ros.h包含大部分ROS中通用的头文件,serial/serial.h即ROS中已经内置了的串口包,通过它可以与串口设备进行通讯,另外节点会发布geometry_msgs/Twist类型的消息,所以需要加入包含该类型的头文件Twist.h,这个头文件根据Twist.msg的消息结构定义自动生成。1.头文件部分#include<ros/ros.h>#include<serial/serial.h>#include<geometry_msgs/Twist.h>7.1.1红外遥控器控制小海龟运动机器人操作系统(ROS)代码解释在main函数中,通过init函数初始化ros节点,节点名称为serial_remote_node,该名称在运行的ROS中是唯一的,不允许同时存在名称相同的两个节点。通过ros::NodeHandlenh声明节点句柄,最后创建一个名为read_pub的发布者,发布者向话题/turtle1/cmd_vel中发布Twist类型的消息,其中缓存区大小为1。2.主函数部分intmain(intargc,char**argv){ros::init(argc,argv,"serial_remote_node");ros::NodeHandlenh;

ros::Publisherread_pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);......}7.1.1红外遥控器控制小海龟运动机器人操作系统(ROS)代码解释进入trycatch语句,设置串口设备号为/dev/ttyUSB0,串口波特率为9600b/s,串口超时时间为1000ms,设置完成后打开串口。当串口打开错误时,在终端报错:"Unabletoopenport"并返回-1。若串口成功打开,则在终端输出:"SerialPortinitialized"。2.主函数部分try{ser.setPort("/dev/ttyUSB0");ser.setBaudrate(9600);serial::Timeoutto=serial::Timeout::simpleTimeout(1000);ser.setTimeout(to);ser.open();}catch(serial::IOException&e){ROS_ERROR_STREAM("Unabletoopenport");return-1;}7.1.1红外遥控器控制小海龟运动机器人操作系统(ROS)代码解释ros::Rateloop_rate(50);geometry_msgs::Twistvel;指定程序循环的频率为50hz,并创建一个geometry_msgs::Twist类型的变量vel,用于存储需要发布的线速度和角速度数据。while(ros::ok()){if(ser.available()){ ...... } ros::spinOnce loop_rate.sleep();}进入while循环,通过ser.available()函数接收串口缓冲区中当前剩余的字符个数,判断串口的缓冲区有无数据。当ser.available()>0时,说明串口接收到了数据,可以进行数据解析,否则等待串口数据接收。7.1.1红外遥控器控制小海龟运动2.主函数部分机器人操作系统(ROS)编译功能包在CMakeLists.txt文件中添加:add_executable(infrared_remotesrc/infrared_remote.cpp)

add_dependencies(infrared_remote${${PROJECT_NAME}_EXPORTED_TARGETS}

${catkin_EXPORTED_TARGETS})

target_link_libraries(infrared_remote${catkin_LIBRARIES})修改完成之后,在工作空间中进行编译:$cd~/catkin_ws

$catkin_make7.1.1红外遥控器控制小海龟运动机器人操作系统(ROS)开启终端输入以下命令启动小海龟节点,在启动前不要忘记启动roscore命令:$roscore$rosrunturtlesimturtlesim_node插入红外接收探头,另启终端输入以下命令开启红外遥控节点:$source

~/catkin_ws/devel/setup.bash$rosrunserialportinfrared_remote按动红外遥控器上的按键,将出现信息输出日志:信息输出日志结果7.1.1红外遥控器控制小海龟运动机器人操作系统(ROS)7.1.1红外遥控器控制小海龟运动可通过如下命令查看遥控器发送的/turtle1/cmd_vel话题消息:$rostopicecho/turtle1/cmd_vel话题/turtle1/cmd_vel内容机器人操作系统(ROS)7.1.1红外遥控器控制小海龟运动遥控小海龟运动情况此时我们就可以通过红外遥控器控制小海龟的运动,小海龟运动情况如图所示。读者可以根据自己的需要定义遥控器上其他按键的功能,编写属于自己的控制命令。本实验遥控器的按键信息对应如下:上下左右键分别对应前进、后退、左转和右转,OK键对应停止。机器人操作系统(ROS)7.1.2游戏手柄控制小海龟运动硬件基础

除了上一节中讨论的红外遥控器控制小海龟运动,我们还可以通过游戏手柄更加真实而有趣的控制屏幕里的小海龟。微软XBOX360手柄机器人操作系统(ROS)软件基础在终端中输入以下命令安装手柄驱动功能包:$sudoapt-getinstallros-melodic-joystick-drivers输入以下命令检测serial包是否安装好:$rospackfindserial安装完成后将手柄连接到电脑,运行如下命令,查看游戏手柄是否被识别,js0即为手柄端口,查看端口号结果如图。$ls/dev/input查看端口号7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)使用如下命令检查它是否工作,其中jstest是虚拟摇杆工具:$sudojstest/dev/input/js0得到以下输出,说明游戏手柄正常工作,微软X-BOX360手柄有8个轴向输入和11个按钮,操作手柄上的摇杆或按钮将会发生相应数值变化,如图所示:软件基础查看手柄数据7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)软件基础当确定好游戏手柄能够正常工作以后,使用joy和joy_node功能包测试它的功能。输入如下命令并得到以下输出,说明所有配置都是正确的,节点运行结果如图所示:$roscore$rosrunjoyjoy_node我们可以通过如下命令查看joy话题发布的消息,话题/joy内容如图所示:$rostopicecho/joy话题/joy内容查看手柄数据7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)

通过以下命令查看Joy类型的消息,Joy类型消息如图所示:$rostopictype/joy$rosmsgshowsensor_msgs/Joy软件基础查看话题类型7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)通过如下命令启动仿真小海龟,运行小海龟节点如图所示,小海龟界面如图所示:$rosrunturtlesimturtlesim_node软件基础运行节点结果图小海龟界面7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)通过rostopiclist命令查看所有话题,其中/turtle1/cmd_vel是控制小海龟移动的话题,我们可以通过rostopictype命令查看其消息类型:通过如下指令查看geometry_msgs/Twist消息类型$rosmsgshowgeometry_msgs/Twist查看话题类型geometry_msgs/Twist消息类型其中,linear代表三个方向上的线速度,angular代表三个方向的角速度。7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)在serialport/src文件夹下创建一个新的文件xbox_remote.cpp,并填入以下内容:$catkin_create_pkgserialportroscpprospystd_msgsserial在serialport/src文件夹下创建名为infrared_remote.cpp的文件,并填入以下代码:#include<ros/ros.h>#include<sensor_msgs/Joy.h>#include<geometry_msgs/Twist.h>usingnamespacestd;classTeleopJoy{ public: TeleopJoy();private: voidcallBack(constsensor_msgs::Joy::ConstPtr&joy); ros::NodeHandlen; ros::Publisherpub; ros::Subscribersub; inti_velLinear,i_velAngular;};……软件基础7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)代码解释#include<ros/ros.h>#include<sensor_msgs/Joy.h>#include<geometry_msgs/Twist.h>ros/ros.h包含大部分ROS中通用的头文件。节点会发布sensor_msgs/Joy和geometry_msgs/Twist类型的消息,所以需要加入包含该类型的头文件Joy.h和Twist.h,这两个头文件根据Joy.msg和Twist.msg的消息结构定义自动生成。1.头文件部分7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)代码解释在main函数中,通过init函数初始化ros节点,节点名称为xbox_remote,该名称在运行的ROS中是唯一的,不允许同时存在名称相同的两个节点。同时创建TeleopJoy类的一个实例:teleop_turtle,实现遥控器数据的接收和小海龟控制消息的发布。2.主函数部分intmain(intargc,char**argv){ ros::init(argc,argv,"xbox_remote"); TeleopJoyteleop_turtle; ros::spin()}7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)代码解释在TeleopJoy()的类中,创建了一个节点句柄,用于使用和管理节点资源。同时定义了回调函数、线速度变量和角速度变量、发布者和订阅者。3.类和函数部分classTeleopJoy{public:TeleopJoy();private:voidcallBack(constsensor_msgs::Joy::ConstPtr&joy);ros::NodeHandlen;ros::Publisherpub;ros::Subscribersub;inti_velLinear,i_velAngular;};7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)代码解释在构造函数中,对参数进行初始化。线速度和角速度通过参数服务器获取变量的值。发布者pub向话题/turtle1/cmd_vel中发布Twist类型的消息,缓存区大小为1。订阅者sub通过名为joy的话题接收sensor_msgs::Joy类型的消息数据,缓存区大小为10,其中TeleopJoy::callBack为需要执行的回调函数。3.类和函数部分TeleopJoy::TeleopJoy(){ n.param("axis_linear",i_velLinear,i_velLinear); n.param("axis_angular",i_velAngular,i_velAngular); pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1); sub=n.subscribe<sensor_msgs::Joy>("joy",10,&TeleopJoy::callBack,this);}7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)代码解释回调函数是订阅节点接收消息的基础机制,当话题收到消息时会自动以消息指针作为参数,调用回调函数,完成对消息内容的处理。如上,我们在回调函数中创建一个geometry_msgs::Twist类型的变量vel,用于存储需要发布的线速度和角速度数据。当接收到Xbox手柄的轴向角速度和线速度时,更新vel中对应的值。最后,通过调用publish函数将消息发布出去。4.回调函数部分voidTeleopJoy::callBack(constsensor-msgs::Joy::ConstPtr&joy){ geometry_msgs::Twistvel; vel.angular.z=joy->axes[i_velAngular]; vel.linear.x=joy->axes[i_velLinear]; pub.publish(vel);}7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)编译功能包打开功能包中的CMakeLists.txt文件,并添加如下内容:add_executable(xbox_remotesrc/xbox_remote.cpp)

target_link_libraries(xbox_remote${catkin_LIBRARIES})修改完成之后,在工作空间中进行编译:$cd~/catkin_ws

$catkin_make7.1.2游戏手柄控制小海龟运动机器人操作系统(ROS)我们创建一个xbox_remote.launch的启动文件,为参数服务器声明一些变量,并同时启动turtlesim、joy和xbox_remote三个节点。创建启动文件<launch> <nodename="sim"pkg="turtlesim"type="turtlesim_node"/> <nodename="xbox_remote"pkg="serialport"type="example1"/> <paramname="axis_linear"value="1"type="int"/> <paramname="axis_angular"value="0"type="int"/>

<noderespawn="true"pkg="joy"type="joy_node"name="teleo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论