实验编号: 实验指导书 实验项目: 外部设备的使用 所属课程: ROS机器人操作系统基础与实战 课程代码: 面向专业: 机电专业 课程负责人: 朱笑笑 年月 日
实验编号: 实 验 指 导 书 实验项目: 外部设备的使用 所属课程: ROS 机器人操作系统基础与实战 课程代码: 面向专业: 机电专业 课程负责人: 朱笑笑 年 月 日
”、 实验目的 理解外部设备驱动的概念,掌握调用方法 2, 掌握利用RVIZ对传感器数据的读取 3, 掌握遥控手柄的使用 二、 实验内容 三、 实验过程或其他示意图 1. 游戏手柄的使用 游戏手柄包含一组多个开关型按钮和定位计型的遥感,可以用来对游戏角色进行各种 运动控制。 在OS中可以利用手柄来对机器人进行要操作改变机器人的速度或方向。比使用键盘和 鼠标要方便很多。 Step1.手柄驱动RoS包、手柄例程包安装。 S sudo apt-get install ros-kinectic-joy* 将手柄USB插入电脑,并检查设备文件,看是系统是否检测到合适的硬件。 S Is /dev/input/ 一般会输出以下内容,其中js0就是我们的手柄(joystick) by-id evento event2 event4 event6 event8 js0 mouse0 by-path eventl event3 event5 event7 event9 mice 我们可以用手柄驱动自带的命令来测试手柄是否可以正常工作。 S sudo jstest/dev/input/js0 有以下输出 Axes:0:0 1:0 2:0 Buttons:0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 这里用的手柄罗技F710有8个遥感轴和11个按钮,如果按下按钮或者拨动摇杆可以 看到相应数字的变动。 Step2.利用joy node发出手柄的运动topic。 joy_node包可以将手柄的参数以topic的形式发出来,利用以下指令可以查看发出的topic -2
- 2 - 一、 实验目的 1, 理解外部设备驱动的概念,掌握调用方法 2, 掌握利用RVIZ对传感器数据的读取 3, 掌握遥控手柄的使用 二、 实验内容 三、 实验过程或其他示意图 1. 游戏手柄的使用 游戏手柄包含一组多个开关型按钮和定位计型的遥感,可以用来对游戏角色进行各种 运动控制。 在ROS中可以利用手柄来对机器人进行要操作改变机器人的速度或方向。比使用键盘和 鼠标要方便很多。 Step1. 手柄驱动ROS包、手柄例程包安装。 $ sudo apt-get install ros-kinectic-joy* 将手柄USB插入电脑,并检查设备文件,看是系统是否检测到合适的硬件。 $ ls /dev/input/ 一般会输出以下内容,其中js0就是我们的手柄(joystick) by-id event0 event2 event4 event6 event8 js0 mouse0 by-path event1 event3 event5 event7 event9 mice 我们可以用手柄驱动自带的命令来测试手柄是否可以正常工作。 $ sudo jstest /dev/input/js0 有以下输出 Axes: 0: 0 1: 0 2: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 这里用的手柄罗技 F710 有 8 个遥感轴和 11 个按钮,如果按下按钮或者拨动摇杆可以 看到相应数字的变动。 Step2. 利用joy_node发出手柄的运动topic。 joy_node包可以将手柄的参数以topic的形式发出来,利用以下指令可以查看发出的topic
信息。 S rostopic echo /joy 将会看到输出结果 header: seq:157 stamp: secs:1357571648 nsecs::430257462 frame id:" axes:-0.0,-0.0,0.0,-0.0,-0.0,0.0-0.0,-0.01 buttons:I00,0,0,0,0,0,0,0,0,0l 可以看到主要的数据在两个向量中。 利用rosnode命令可以看到该topic的参数类型,这样可以方便后续的使用。 S rosnode type /joy 可以看到输出为sensor msgs/Joy类型。这是一个ROS系统的标准类型,进一步可以通 过rosmsg命令查看具体该类型。 S rosmsg show sensor_msgs/Joy 会有以下输出 uint32 seq time stamp string frane id float32[]axes int32[]buttons 这个消息在开发的时候是必须用到的,可以看到axes是一个float32的数组而buttons.是一 个int32的数组 Step3.利用joystick数据来在turtlesim中控制一个turtle 这里将创建一个node从joy node中获得数据然后发布topic来控制turtlesim。上面己经知 道手柄的消息类型,这里还需要查看控制turtle需要用的topic类型。 首先利用rosrun启动turtlesim turtlesim_node S rosrun turtlesim turtlesim node 观察当前的topic列表 S rostopic list 会有以下结果输出,其中turtlel/command_velocity就是我们将用到的topic -3-
- 3 - 信息。 $ rostopic echo /joy 将会看到输出结果 --- header: seq: 157 stamp: secs: 1357571648 nsecs: 430257462 frame_id: '' axes: [-0.0, -0.0, 0.0, -0.0, -0.0, 0.0, -0.0, -0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] --- 可以看到主要的数据在两个向量中。 利用rosnode命令可以看到该topic的参数类型,这样可以方便后续的使用。 $ rosnode type /joy 可以看到输出为sensor_msgs/ Joy 类型。这是一个ROS系统的标准类型,进一步可以通 过rosmsg命令查看具体该类型。 $ rosmsg show sensor_msgs/Joy 会有以下输出 这个消息在开发的时候是必须用到的,可以看到axes是一个float32的数组而buttons是一 个int32的数组 Step3. 利用joystick数据来在turtlesim中控制一个turtle 这里将创建一个node从joy_node中获得数据然后发布topic来控制turtlesim。上面已经知 道手柄的消息类型,这里还需要查看控制turtle需要用的topic类型。 首先利用rosrun 启动 turtlesim turtlesim_node $ rosrun turtlesim turtlesim_node 观察当前的topic列表 $ rostopic list 会有以下结果输出,其中turtle1/command_velocity 就是我们将用到的topic
/rosout /rosout agg /turtle1/colar sensor /turtle1/conrand_velocity /turtlel/pose 利用rostopici查看topic类型 S rostopic type/turtlel/command velocity 输出 turtlesim/Velocity 同样再利用rosmsg可以查看该topic类型的具体内容 S rosmsg show turtlesim/Velocity 输出: float32 linear float32 angular 这里linear是速度的大小,angular是速度的方向 在了解输入和输出的topic类型信息后,可以开始编写node了。 创建一个joystic_turtle包,创建一个examle..cpp.输入以下代码。 #include<ros/ros.h> #include<turtlesim/Velocity.h> //turtlesim速度控制消息类型 #include<sensor msgs/Joy.h> //joystick消息类型 #include<iostream> using namespace std; class TeleopJoy{ public: TeleopJoy(); private: void callBack(const sensor_msgs:Joy:ConstPtr&joy吵,/joystick消息回调函数 ros:NodeHandle n; ros::Publisher pub; ros::Subscriber sub; int i_velLinear,i_velAngular; TeleopJoy::TeleopJoy() n.param("axis_linear",i_velLinear,i velLinear); n.param("axis angular",i velAngular,i velAngular): pub=n.advertise<turtlesim::Velocity>("turtlel/command_velocity",1); sub=n.subscribe<sensor_msgs::Joy>("joy",10,&TeleopJoy::callBack, this): void TeleopJoy::callBack(const sensor_msgs::Joy::ConstPtr&joy) turtlesim::Velocity vel; vel.angular =joy->axes[i_velAngular]; vel.linear=joy->axes[i_velLinear]; pub.publish(vel); -4-
- 4 - 利用rostopic查看topic类型 $ rostopic type /turtle1/command_velocity 输出 turtlesim/Velocity 同样再利用rosmsg可以查看该topic类型的具体内容 $ rosmsg show turtlesim/Velocity 输出: float32 linear float32 angular 这里linear是速度的大小,angular是速度的方向 在了解输入和输出的topic类型信息后,可以开始编写node了。 创建一个joystic_turtle包,创建一个examle.cpp.输入以下代码。 #include<ros/ros.h> #include<turtlesim/Velocity.h> //turtlesim速度控制消息类型 #include<sensor_msgs/Joy.h> //joystick消息类型 #include<iostream> using namespace std; class TeleopJoy{ public: TeleopJoy(); private: void callBack(const sensor_msgs::Joy::ConstPtr& joy); //joystick消息回调函数 ros::NodeHandle n; ros::Publisher pub; ros::Subscriber sub; int i_velLinear, i_velAngular; }; TeleopJoy::TeleopJoy() { n.param("axis_linear",i_velLinear,i_velLinear); n.param("axis_angular",i_velAngular,i_velAngular); pub = n.advertise<turtlesim::Velocity>("turtle1/command_velocity",1); sub = n.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopJoy::callBack, this); } void TeleopJoy::callBack(const sensor_msgs::Joy::ConstPtr& joy) { turtlesim::Velocity vel; vel.angular = joy->axes[i_velAngular]; vel.linear = joy->axes[i_velLinear]; pub.publish(vel); }
int main(int argc,char**argv) ros::init(argc,argv,"teleopJoy"); TeleopJoy teleop turtle; ros::spin(); 另外,需要创建一个launch文件来实现对joystick_turtle、sim、joy三个node的调用。 <launch> <node pkg="turtlesim"type="turtlesim_node"name="sim"/> <node pkg="chapter4_tutorials"type="examplel"name="examplel"> <param name="axis_linear"value="1"type="int"> <param name="axis angular"value="0"type="int"> <node respawn="true"pkg="joy"type="joy"name="teleopJoy"> <param name="dev"type="string"value="/dev/input/js0"> <param name="deadzone"value="0.12"> </node> </launch> 在这个launch文件中还定义了4个参数,这些参数将自动添加到参数服务器中,供node 调用。其中axis linear和axis angular参数用来配置手柄的轴。Dev和deadzone参数用来配置手 柄的端口号和非识别区域(即微小的移动会被作为干扰项滤除)。 Step4.利用roslaunch命令运行launch文件。利用手柄控制仿真的turtle运动。 S roslaunch chapter4_tutorials example1.launch Step5.利用rqt_graph,,rosnode list,,或者rostopic list来观察整个系统。 2. 完成Ros Kinect的安装 Kinect是一种用于微软的Xbox360体感游戏的附件设备,具有以下的3中传感器可以用 来进行相关机器人的任务开发。 只 一个彩色VGA视频相机可以采集环境颜色信息 B. 深度相机,由一个红外投影器和一个灰度CMOS传感器一起工作,能感知环境的距离 信息。 ,个麦克风阵列用来将用于的声音从环境噪声中隔离出来。 KINECT 在这里我们将使用其中两个传感器:RGB彩色相机和深度传感器。 Step1.安装包和驱动。 sudo apt-get install ros-kinetic-openni-camera ros-kinetic-openni-launch rosstack profile rospackage profile 安装完成后插入Kinect传感器,运行node可以开始使用。首先运行roscore,.然后在新 -5-
- 5 - int main(int argc, char** argv) { ros::init(argc, argv, "teleopJoy"); TeleopJoy teleop_turtle; ros::spin(); } 另外,需要创建一个launch文件来实现对joystick_turtle、sim、joy三个node的调用。 <launch> <node pkg="turtlesim" type="turtlesim_node" name="sim"/> <node pkg="chapter4_tutorials" type="example1" name="example1" /> <param name="axis_linear" value="1" type="int" /> <param name="axis_angular" value="0" type="int" /> <node respawn="true" pkg="joy"type="joy" name="teleopJoy"> <param name="dev" type="string" value="/dev/input/js0" /> <param name="deadzone" value="0.12" /> </node> </launch> 在这个launch文件中还定义了4个参数,这些参数将自动添加到参数服务器中,供node 调用。其中axis_linear和axis_angular参数用来配置手柄的轴。Dev和deadzone参数用来配置手 柄的端口号和非识别区域(即微小的移动会被作为干扰项滤除)。 Step4. 利用roslaunch命令运行launch文件。利用手柄控制仿真的turtle运动。 $ roslaunch chapter4_tutorials example1.launch Step5.利用rqt_graph,rosnode list,或者rostopic list 来观察整个系统。 2. 完成Ros Kinect的安装 Kinect 是一种用于微软的Xbox360体感游戏的附件设备,具有以下的3中传感器可以用 来进行相关机器人的任务开发。 A. 一个彩色VGA视频相机可以采集环境颜色信息 B. 深度相机,由一个红外投影器和一个灰度CMOS传感器一起工作,能感知环境的距离 信息。 C. 一个麦克风阵列用来将用于的声音从环境噪声中隔离出来。 在这里我们将使用其中两个传感器:RGB彩色相机和深度传感器。 Step1.安装包和驱动。 $ sudo apt-get install ros-kinetic-openni-camera ros-kinetic-openni-launch $ rosstack profile $ rospackage profile 安装完成后插入Kinect传感器,运行node可以开始使用。首先运行roscore,然后在新