文章目录
- 实验1 熟悉ROS操作系统、熟悉ROS通信架构
- 1、实验目的
- 2、实验设备
- 3、实验内容
- 3.1 安装ROS
- 3.2 ROS常用指令以及小海龟示例
- ·roscore命令
- ·rosrun命令
- ·rosnode 命令
- ·roscd 命令
- ·rostopic 命令
- 动手实现1:
- ·rosservice 命令
- ·roslaunch 命令
- 动手实现2:
- 动手实现3:
- 3.3 了解ROS节点间的通信过程:
- ·使用rqt_graph查看ROS节点关系
- ·使用rostopic查看话题信息
- 动手实现4:
- 3.4编写节点实现话题通信
- ·创建功能包
- ·编写发布者节点(c++版本)
- ·编写接收者节点(c++版本)
- ·构建节点
- 动手实现5:
- 动手实现6:
- 动手实现7:
- (1)创建beginner_tutorials包:
- (2)创建srv
- (3)使用rossrv
- (4)msg和srv的一般步骤
- (5)编写服务节点
- (6)编写客户端节点
- (7)构建节点
- (8)检验简单的服务和客户端
实验1 熟悉ROS操作系统、熟悉ROS通信架构
1、实验目的
掌握ROS的安装以及常用命令,具体内容如下:
- 学会在ubuntu18.04系统下安装ROS。
- 了解ROS基础命令。
- 运行海龟示例。
- 了解ROS节点间的话题通信过程,编写节点实现话题通信。
- 了解ROS节点间的服务通信过程,编写节点实现服务通信。
2、实验设备
硬件环境:windows 10
系统环境:Ubuntu20.04、ROS noetic
3、实验内容
3.1 安装ROS
1、添加ROS软件源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ \$DISTRIB_CODENAME main" \> /etc/apt/sources.list.d/ros-latest.list'
2、添加密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
3、更新软件源
sudo apt update
4、安装ROS
sudo apt install ros-noetic-desktop-full
过程:
5、 初始化rosdep
输入以下的命令,先对其初始化一下
sudo rosdep init
6、设置环境变量
(1)ubuntu是20.04版本的,对应的是noetic。
echo “source /opt/ros/noetic/setup.bash” >> ~/.bashrc
(2)输入以下命令,运行该脚本让环境变量生效
source ~/.bashrc
7、 安装rosinstall
输入以下命令:
sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool
9、 验证ROS是否安装成功
roscore
3.2 ROS常用指令以及小海龟示例
·roscore命令
ROS的使用需要一个主节点master,通过执行roscore命令即可启动一个主节点。
·rosrun命令
然后启动一下小海龟的仿真器,按ctrl+alt+t打开一个新的终端,输入以下命令
rosrun turtlesim turtlesim_node
按ctrl+alt+t再打开一个新的终端,输入以下命令
rosrun turtlesim turtle_teleop_key
此时将光标聚焦于该窗口,这时候按键盘上的↑↓←→键就可以控制小海龟移动了。
·rosnode 命令
执行rosnode list命令,即可查看当前运行中的节点。如下图所示。
·roscd 命令
通过使用roscd命令定位到该包所在的路径。使用方法为roscd 包名,比如定位turtlesim包
·rostopic 命令
可以通过rostopic命令当前节点间存在的通信话题
rostopic list
动手实现1:
通过手动给/turtle1/cmd_vel话题发送消息,控制小海龟移动。
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
让这个指令每秒发送10次
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
控制转弯:
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
控制画圈:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, -1.8]’
·rosservice 命令
使用rosservice list命令即可查看当前运行的服务,如下图所示。
·roslaunch 命令
与前面rosrun命令启动一个节点相对比,roslaunch可以一次启动多个节点
roslaunch gazebo_ros empty_world.launch
动手实现2:
当使用rosluanch启动节点后,再运行roscore会发生什么,为什么?
roscore是roslaunch工具的一个专业化工具,用于启动“核心”ROS 系统。如果 roslaunch 检测到它尚未运行(除非提供了 --wait 参数),它将自动启动 roscore。也就是说使用rosluanch启动节点的时候已经自动启动了roscore。
动手实现3:
使用rosed命令或者roscd命令快速定位到empty_world.launch所在位置并打开查看内容
3.3 了解ROS节点间的通信过程:
·使用rqt_graph查看ROS节点关系
rqt_graph
·使用rostopic查看话题信息
rostopic info turtle1/cmd_vel
geometry_msgs/Twist,话题的发布者为/teleop_turtle节点,话题的订阅者有/turtlesim节点。
动手实现4:
利用所学知识,查看turtle1/cmd_vel话题的消息类型Twist的内容是什么?
rosmsg show geometry_msgs/Twist
3.4编写节点实现话题通信
·创建功能包
首先创建一个工作空间,并使用catkin_make编译。
然后创建名为test的功能包,为其加上std_msgs、rospy、roscpp依赖。
·编写发布者节点(c++版本)
进入该包内,创建c++文件并编写
mkdir -p test/src
cd test/src
gedit talker.cpp
代码如下
·编写接收者节点(c++版本)
gedit listener.cpp
代码如下
·构建节点
打开test包内的CMakeLists.txt,
修改内容:
找到
// 建立talker节点
// 建立listener节点
保存文件,并编译
cd ~/catkin_ws
catkin_make
将该工作空间添加到.bashrc文件中,让系统能够知道我们所写的功能包在哪。
gedit ~/.bashrc
添加如下内容
source /home/xinyang/catkin_ws/devel/setup.bash
保存后重新打开终端,即可运行我们写的两个节点。
首先启动roscore
启动talker节点
rosrun test talker
启动listener节点
rosrun test listener
此时,两个节点就建立了通信,如下图所示
动手实现5:
利用所学知识,编写launch文件,通过roslaunch同时启动talker与listener节点。
cd ~/catkin_ws/src
catkin_create_pkg test_launch
gedit test.launch
catkin_make
·编写Python版本话题通信
与C++文件不同,python文件一般存储在scripts文件夹内,接下来编写talker.py
cd test
mkdir scripts
cd scripts
gedit talker.py
填入如下代码
编写listener.py
gedit listener.py
代码如下
修改CmakeLists.txt
保存退出,此时还需为python文件添加执行权限
cd scripts
chmod +x listener.py
chmod +x talker.py
回到catkin工作空间,然后运行catkin_make:
cd ~/catkin_ws
catkin_make
此时,即可运行,首先运行roscore,然后到scripts目录下分别执行
rosrun test talker.py
rosrun test listener.py
此时发送与接收的消息为当前的系统时间。
动手实现6:
当话题通信时,使用学习的命令,查看话题的信息,比如rosnode、rostopic、rosservice。
动手实现7:
模仿话题通信方式,实现服务通信过程。
实现目标:用C++编写服务和客户端节点。接收两个整数,并返回它们的和。
(1)创建beginner_tutorials包:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
将当前目录切换到之前创建的beginner_tutorials包中:
roscd beginner_tutorials
(2)创建srv
srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。srv文件则存放在srv目录下
用之前创建的包再来创建服务:mkdir srv
从rospy_tutorials包中复制一个服务:
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
打开package.xml,取消以下两行的注释。
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
在CMakeLists.txt文件中,直接将message_generation添加到COMPONENTS列表中即可,如下所示:
此外,在CMakeLists.txt文件中,修改服务字段,因此请看上面描述的所需附加依赖项。删除#符号来取消注释,然后将Service*.srv替换为你的.srv文件名,就像下边这样:
(3)使用rossrv
通过rossrv show命令看看ROS能否识别它。
rossrv show beginner_tutorials/AddTwoInts
(4)msg和srv的一般步骤
取消注释,然后添加任意消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:
已经创建了一些新消息,所以需要重新make一下软件包: catkin_make
(5)编写服务节点
创建简单的服务(Service)节点add_two_ints_server,该节点将接收两个整数,并返回它们的和。
在beginner_tutorials包中创建src/add_two_ints_server.cpp文件并粘贴以下内容进去:
(6)编写客户端节点
在beginner_tutorials包中创建src/add_two_ints_client.cpp文件并粘贴以下内容进去:
(7)构建节点
再来编辑一下beginner_tutorials里面的CMakeLists.txt文件,文件位于~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,并将下面的代码添加在文件末尾:
在catkin工作空间下
cd ~/catkin_ws
catkin_make
(8)检验简单的服务和客户端
运行服务
rosrun beginner_tutorials add_two_ints_server
运行客户端(并附带必要的参数:)
rosrun beginner_tutorials add_two_ints_client 1 3