python的打包和引入依赖的方式相比C++要容易太多。本节小鱼带你来通过几个实例学习下Python的路径查找机制。
在d2lros2/d2lros2/chapt2/basic
新建second_ros2_node.py
,输入下面的内容
# 导入rclpy库,如果Vscode显示红色的波浪线也没关系
# 我们只是把VsCode当记事本而已,谁会在意记事本对代码的看法呢,不是吗?
import rclpy
from rclpy.node import Node
# 调用rclcpp的初始化函数
rclpy.init()
# 调用rclcpp的循环运行我们创建的second_node节点
rclpy.spin(Node("second_node"))
打开终端,输入指令
ls
python3 second_ros2_node.py
打开新的终端,输入
ros2 node list
完美,四行代码写了个ROS2的Python节点。
那么问题来了,我们import rclpy,rclpy到底在哪里?python是如何找到的?
Python3运行import rclpy
时候如何找到它的呢?答案是通过环境变量PYTHONPATH
Ctrl+C打断节点运行,接着输入下面指令
echo $PYTHONPATH
结果
/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages
你会发现里面有关于humble的python路径,在上面两个目录下找一下rclpy,看看能不能找到rclpy
查找第一个路径
ls -l /opt/ros/humble/lib/python3.10/site-packages | grep rclpy
没找到,第二个
ls -l /opt/ros/humble/local/lib/python3.10/dist-packages/ | grep rclpy
找到了
drwxr-xr-x 1 root root 4096 Jun 3 04:45 rclpy
drwxr-xr-x 2 root root 4096 May 23 22:23 rclpy-3.3.4-py3.10.egg-info
使用unset
指令可以将环境变量删除掉,尝试删除掉PYTHONPATH
之后再运行代码,看看是否还可以导入rclpy
。
unset
python3 second_ros2_node.py
提示如下
root@490925f19143:~/d2lros2/d2lros2/chapt2/basic# python3 second_ros2_node.py
Traceback (most recent call last):
File "/root/d2lros2/d2lros2/chapt2/basic/second_ros2_node.py", line 3, in <module>
import rclpy
ModuleNotFoundError: No module named 'rclpy'
请你记住这个报错信息ModuleNotFoundError: No module named 'xxx'
,这也是你未来学习过程中可能会经常会遇到的。
下次遇到时,你会想起小鱼这篇文章,然后对它轻蔑的一笑,接着找到这个库所在的目录,把它加到环境里。
本节小鱼带你学习了Python编写ROS2节点的方式,并带你认识了一个常见的错误ModuleNotFoundError: No module named 'xxx'
。
技术交流&&问题求助:
QQ交流群:139707339
版权保护:已加入“维权骑士”(rightknights.com)的版权保护计划