目录
一、ROS安装
1、安装虚拟机
2、安装Ubuntu
3、安装ROS
二、话题通信
概念:
1、理论模型:
?
2、基本操作(python)
流程:
?3、实操
话题发布
话题订阅
参考感谢:
一、ROS安装
1、安装虚拟机
VMare的下载与安装
2、安装Ubuntu
Ubuntu20.04安装教程
3、安装ROS
Ubuntu | ROS | 16.04 | Kinetic | 18.04 | Melodic | 20.04 | Noetic |
?打开“软件和更新”对话框后,按下图配置?
?
快捷键Ctrl?+?Alt?+?T打开一个终端
来自国内清华的安装源:
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
回车后需要输入管理员密码(注:此时输入密码时不会显示密码长度)
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
apt是用于从互联网仓库搜索、安装、升级、卸载软件或操作系统的工具。
sudo apt update
这里安装的是完整桌面版(Desktop-Full,官网推荐):除了桌面版的全部组件外,还包括2D/3D模拟器(simulator)和2D/3D 感知包(perception package)。
sudo apt install ros-noetic-desktop-full
这里需要长时间等待,由于网络原因,导致连接超时,可能会安装失败,可以多次重复调用?更新和?安装?命令
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
sudo rosdep init
rosdep update
二、话题通信
概念:
以发布订阅的方式实现不同节点之间数据交互的通信模式,适用于不断更新的数据传输相关的应用场景
1、理论模型:
- ?ROS Master(管理者)
- Talker(发布者)
- Listener(订阅者)
管理者负责保管发布者和订阅者注册的信息,并匹配话题相同的发布者和订阅者,帮助其建立连接,连接建立后,订阅者可以接收到发布者发布的消息。
2、基本操作(python)
需求:编写发布订阅实现,要求发布方以10HZ的频率发布文本消息,订阅方订阅消息并将消息内容打印输出。
流程:
CTRL+Alt+T打开命令行
输入mkdir -p 工作空间名/src
mkdir -p practice/src
?进入工作空间
cd practice/
catkin_make
?此命令后会生成与src同级的devel和build文件夹
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
?
右击src,新建功能包(Create Catkin Package),输入功能包名字(此处是pub_sub)
?导入依赖
roscpp rospy std_msgs
?
?
右击第一级src,创建文件夹srcipts,然后右击srcipts创建文件,取名后缀加上.py。
开始编写:
#! /usr/bin/env python
import rospy
from std_msgs.msg import String #发布消息的类型
"""
使用Python实现消息发布:
1.导包
2.初始化ros节点
3.创建发布者对象
4.编写发布逻辑并发布数据
"""
if __name__=="__main__":
#2.初始化ros节点
rospy.init_node("sg") #传入节点名称
#3.创建发布者对象
pub = rospy.Publisher("shuai",String,queue_size=10)
#4.编写发布逻辑并发布数据
#创建数据
msg = String()
msg_front = "hello"
count = 0 #计数器
# 设置循环频率
rate = rospy.Rate(1)
while not rospy.is_shutdown():
#拼接字符串
msg.data = msg_front + str(count)
pub.publish(msg)
rate.sleep()
rospy.loginfo("发布的数据:%s",msg.data)
count += 1
import rospy
from std_msgs.msg import String
def doMsg(msg):
rospy.loginfo("I heard:%s",msg.data)
if __name__ == "__main__":
#2.初始化 ROS 节点:命名(唯一)
rospy.init_node("mn")
#3.实例化 订阅者 对象
sub = rospy.Subscriber("shuai",String,doMsg,queue_size=10)
#4.处理订阅的消息(回调函数)
#5.设置循环调用回调函数
rospy.spin()
?右击scripts,点“在集成终端打开”
chmod +x *.py
ll查看是否成功添加可执行权限
CTRL+/ 放开这段注释,并将my_python_script改为python文件名(此处为pub_p.py)
快捷键CTRL+shift+B,输入catkin_make:build进行编译
ctrl+Alt+T打开终端,输入roscore启动ros核心,另两个终端输入rosrun +包名 +python文件名
3、实操
话题发布
需求:编码实现乌龟运动控制,让小乌龟做圆周运动
分析:自定义控制节点,按照一定的逻辑发布消息
流程:
命令行1:roscore
命令行2:rosrun turtlesim turtlesim_node
命令行3:rosrun turtlesim turtle_teleop_key(在3中可通过上下左右键控制乌龟运动)
?
通过计算图查看话题为/turtle1/cmd_vel
rqt_graph
?
?获取消息类型为geometry_msgs/Twist
rostopic type /turtle1/cmd_vel
然后获取消息格式
rosmsg info geometry_msgs/Twist
?linear为线速度,对于乌龟来说只用改x;angular为角速度,对于乌龟来说只用改z。
右击src,新建功能包(Create Catkin Package),输入功能包名字(此处是plumbing_test)
添加依赖:roscpp rospy std_msgs geometry_msgs
在plumbing_test下的scripts创建python文件,开始编写
#! /usr/bin/env python
from mimetypes import init
import rospy
from geometry_msgs.msg import Twist
"""
发布方:发布速度消息
话题:/turtle1/cmd_vel
消息:geometry_msgs/Twist
1.导包
2.初始化ros节点
3.创建发布者对象
4.组织数据并发布数据
"""
if __name__ =="__main__":
#2.初始化ros节点
rospy.init_node("my_control_p")
#3.创建发布者对象
pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)
#4.组织数据并发布数据
#设置发布频率
rate = rospy.Rate(10)
#创建速度消息
twist = Twist()
twist.linear.x = 0.5
twist.linear.y = 0.0
twist.linear.z = 0.0
twist.angular.x=0.0
twist.angular.y=0.0
twist.angular.z=0.5
#循环发布
while not rospy.is_shutdown():
pub.publish(twist)
rate.sleep()
右击scripts,点“在集成终端打开”
chmod +x *.py
CTRL+/ 放开这段注释,并将my_python_script改为python文件名(此处为test01_pub_twist_p.py)
注:后面订阅方编辑也是此处
快捷键CTRL+shift+B,输入catkin_make:build进行编译
?打开终端
命令行1:roscore
命令行2:rosrun turtlesim turtlesim_node
命令行3:cd 自定义包名
source ./devel/setup.bash 刷新环境变量
rosrun 工作空间名 python文件名
?
?
话题订阅
需求:控制乌龟运动,并实时打印当前乌龟的位姿
分析:控制乌龟运动,并通过ros命令来获取乌龟位姿发布的话题以及消息,编写订阅节点,订阅并打印乌龟位姿
流程:
rostopic list
rostopic type /turtle1/pose
rosmsg info turtlesim/Pose
在plumbing_test下的scripts创建python文件,开始编写
#! /usr/bin/env python
import rospy
from turtlesim.msg import Pose
"""
需求:订阅并输出乌龟位姿信息
1.导包
2.初始化ros节点
3.创建订阅对象
4.使用回调函数处理订阅到的消息
5.spin()
"""
def doPose(pose):
rospy.loginfo("P->乌龟位姿信息:坐标(%.2f,%.2f),朝向:%.2f,线速度:%.2f,角速度:%.2f",
pose.x,pose.y,pose.theta,pose.linear_velocity,pose.angular_velocity)
if __name__=="__main__":
# 2.初始化ros节点
rospy.init_node("sub_pose_p")
# 3.创建订阅对象
sub=rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size=100)
# 4.使用回调函数处理订阅到的消息
# 5.spin()
rospy.spin()
右击scripts,点“在集成终端打开”
chmod +x *.py
同上发布方
快捷键CTRL+shift+B,输入catkin_make:build进行编译
打开终端
命令行1:roscore
命令行2:rosrun turtlesim turtlesim_node
命令行3:rosrun turtlesim turtle_teleop_key
命令行4:cd 自定义包名
source ./devel/setup.bash 刷新环境变量
rosrun 工作空间名 python文件名
?
?
参考感谢:
赵虚左老师的课《ROS理论与实践》
官网镇楼:http://wiki.ros.org/cn
?注:后面还会持续更新
|