ROS称为机器人操作系统,是开发智能机器人的极具生产力的工具,主要用于仿真验证、代码部署。ROS已经从ROS1发展到ROS2,而ROS2才真正实现了分布式通信。如果现在开始学的话,建议最好直接上手ROS2。ROS2支持多开发语言,当然了,在算法开发语言中,Python绝对是一个最佳的选择,因为它是脚本语言,调试时无需编译,各种工具包层出不穷,所以开发起来十分方便。
作为懒人,实在懒得折腾linux+ROS2,所以本文主要介绍如何在windows10中安装ROS2,以及如何编写简单的python发布和订阅程序。
一、安装python和pycharm
1. 在windows10中安装python,网上教程实在太多了,不多介绍。
2. 在windows10中安装pycharm,这是python的IDE(集成开发环境),编辑python代码之用,当然用别的IDE如vscode也是可以的。网上教程也很多,不再赘述。
二、安装ROS2
1. 在windows10中安装Chocolatey,方法是打开cmd,输入如下指令。这里解释一下,Chocolatey是windows下的包管理工具,类似linux下的apt-get,有了它可以直接从网上下载和安装软件包。
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
测试一下Chocolatey是否安装成功,在cmd中输入 choco,正常的话会得到如下反馈。
2. 利用choco安装ROS2,方法是在cmd中输入如下指令。有的博主说,要先建立c:\opt\chocolatey目录,并设置2个环境变量,以我的经验看并不需要,设置错了反而很难排故。
choco source add -n=ros-win -s="https://aka.ms/ros/public" --priority=1
choco upgrade ros-foxy-desktop -y --execution-timeout=0
等待约半个小时,ROS2就安好了,成功的话有下图那样的提示。
3. 测试一下小乌龟demo,输入命令:
call C:\opt\ros\foxy\x64\local_setup.bat %%不可省略,这是调用ros2的命令,否则下一句报错
ros2 run turtlesim turtlesim_node
再打开一个cmd,输入命令:
call C:\opt\ros\foxy\x64\local_setup.bat %%不可省略,这是调用ros2的命令,否则下一句报错
ros2 run turtlesim turtle_teleop_key
小乌龟就跑起来了,turtlesim_node节点是仿真节点,turtle_teleop_key节点是键盘节点,二者通过订阅和发布,完成通信。这也是ROS2的主要作用。
4. 如果我们需要查看ROS2节点下有哪些话题,可以新开一个cmd输入:
call C:\opt\ros\foxy\x64\local_setup.bat %%不可省略,这是调用ros2的命令,否则下一句报错
ros2 topic list
如果你的小乌龟窗口还没关的话,会显示如下:
Ok,ROS2安装正常!下面我们的python就要登场了!
三、 用python创建发布和订阅节点
新建一个工作目录,打开cmd,cd到这个目录下,然后输入如下指令来创建功能包:
call C:\opt\ros\foxy\x64\local_setup.bat
ros2 pkg create 功能包名称 --build-type ament_python --dependencies rclpy
我们的基于python的ros功能包就建好了,如下图,我的功能包叫dmrta_pkg。可以亲自到目录下看一看,ros2都帮我们创建了哪些模板文件。
建好了功能包,就要建立节点了。用pycharm打开我们的功能包作为项目,在功能包的同名文件夹下新建.py文件,我这里建立了2个,文件名分别为talker.py和listener.py。在其中写入函数(比如我这里的main函数),过后我们会用它配置节点的入口函数。注意二者的topic必须一致才能对话。
# talker.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String # 载入String的msg类型
class TALKER(Node):
def __init__(self, name, topic):
# 初始化
super().__init__(name)
# 创建发布节点
self.publisher = self.create_publisher(String, topic, 10)
self.get_logger().info("TALKER: I'm publisher %s, I have topic '%s'" % (name, topic))
# 创建定时器
self.timer = self.create_timer(1.0, self.timer_callback)
# 定时发布
def timer_callback(self):
msg = String()
msg.data = 'The talker is publishing ...'
self.publisher.publish(msg) # 发布消息msg
def main():
# 初始化
rclpy.init()
# 创建发布节点
node = TALKER(name='talker_node', topic='our_topic')
# 死循环
rclpy.spin(node)
# 关闭
node.destroy_node()
rclpy.shutdown()
# listener.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class LISTENER(Node):
def __init__(self, name, topic):
# 初始化
super().__init__(name)
# 创建发布节点
self.subscriber = self.create_subscription(String, topic, self.receive_callback, 10)
self.get_logger().info("LISTENER: I'm listener %s, I subscribed topic %s" % (name, topic))
#
self.n_receive = 0
# 订阅器都是通过回调函数来实现对应功能,callback()内部完成对应实现
def receive_callback(self, msg):
self.n_receive += 1
self.get_logger().info("%d I heard %s" % (self.n_receive, msg.data))
def main():
# 初始化
rclpy.init()
# 创建订阅节点
node = LISTENER(name="listener_node", topic='our_topic')
# 死循环
rclpy.spin(node)
# 关闭
rclpy.shutdown()
在工作空间的功能包目录下找到setup.py,修改entry_points,加入想加入的节点,并指定节点的入口函数。这样ROS2就知道有几个节点,每个节点该从哪里执行了。
entry_points={
'console_scripts': [
'talker_node=dmrta_pkg.talker:main',
'listener_node=dmrta_pkg.listener:main'
],
编写完毕,接下来是编译,使用colcon命令。有博主说必须要安装visual studio,其实不需要的。我们安装ROS2的时候已经自带了。cd到工作空间下,输入命令:
call C:\opt\ros\foxy\x64\local_setup.bat %%如果ros2已经运行起来了,可不输入这句
colcon build --symlink-install %%使用--symlink-install的目的是使用符号连接,这样修改python文件后会直接生效,而无需再次编译
编译成功!去工作目录下观察一下colcon都给我们生成了哪些文件。注意\install\local_setup.bat这个文件十分重要,启动节点时必须先启动它一下,才能让功能包的环境变量生效。
接下来测试我们生成的那两个节点。新开两个cmd,分别输入命令:
call C:\opt\ros\foxy\x64\local_setup.bat
call 你的工作区目录\install\local_setup.bat %% 注意这里替换
ros2 run dmrta_pkg talker_node
call C:\opt\ros\foxy\x64\local_setup.bat
call 你的工作区目录\install\local_setup.bat %% 注意这里替换
ros2 run dmrta_pkg listener_node
ok没问题,成功通信!那剩下就是编程的事了。
有个问题就是程序修改后,必须重新编译才行生效。那每次输入编译指令岂不是很麻烦?懒人的做法是做成批处理文件,把下面3句保存成.bat,放在工作空间,每次双击就好。
:: 启动ROS2
call C:\opt\ros\foxy\x64\local_setup.bat
:: 编译当前工作空间内的所有pkg
colcon build --symlink-install
::
pause
总结
window10装ROS2没问题,而且很简单;
ROS2对python的支持没问题,而且很简洁。
展望
cmd是windows原生工具,用起来很麻烦,也不美观,推荐使用WindowsTerminal。