windows10中安装和使用ROS2+python

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,正常的话会得到如下反馈。

windows10中安装和使用ROS2+python_第1张图片

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的主要作用。

windows10中安装和使用ROS2+python_第2张图片

4. 如果我们需要查看ROS2节点下有哪些话题,可以新开一个cmd输入:

call C:\opt\ros\foxy\x64\local_setup.bat  %%不可省略,这是调用ros2的命令,否则下一句报错
ros2 topic list

如果你的小乌龟窗口还没关的话,会显示如下:

windows10中安装和使用ROS2+python_第3张图片

Ok,ROS2安装正常!下面我们的python就要登场了!

三、 用python创建发布和订阅节点

  1. 新建一个工作目录,打开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都帮我们创建了哪些模板文件。

  1. 建好了功能包,就要建立节点了。用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()  
  1. 在工作空间的功能包目录下找到setup.py,修改entry_points,加入想加入的节点,并指定节点的入口函数。这样ROS2就知道有几个节点,每个节点该从哪里执行了。

    entry_points={
        'console_scripts': [
            'talker_node=dmrta_pkg.talker:main',
            'listener_node=dmrta_pkg.listener:main'
        ],
  1. 编写完毕,接下来是编译,使用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这个文件十分重要,启动节点时必须先启动它一下,才能让功能包的环境变量生效。

  1. 接下来测试我们生成的那两个节点。新开两个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没问题,成功通信!那剩下就是编程的事了。

  1. 有个问题就是程序修改后,必须重新编译才行生效。那每次输入编译指令岂不是很麻烦?懒人的做法是做成批处理文件,把下面3句保存成.bat,放在工作空间,每次双击就好。

:: 启动ROS2
call C:\opt\ros\foxy\x64\local_setup.bat
:: 编译当前工作空间内的所有pkg
colcon build --symlink-install
:: 
pause

总结

  1. window10装ROS2没问题,而且很简单;

  1. ROS2对python的支持没问题,而且很简洁。

展望

  1. cmd是windows原生工具,用起来很麻烦,也不美观,推荐使用WindowsTerminal。

你可能感兴趣的:(机器人,python)