一、说明
这里说说编译和包生成的操作要点,以python包为例。对于初学者来说,colcon和ament需要概念上搞清楚,与此同时,工作空间、包、节点在一个工程中需要熟练掌握。本文以humble版的ROS2,进行python编程的实现。
二、编译器安装配置
2.1 关于编译器的安装
colcon是ros2的编译器,如果我们想看到colcon编译器,需要到指定位置:
ls /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
如果没有安装,需要如下语句安装之:
sudo apt update
sudo apt install python3-colcon-common-extensions
一般来说,在安装humble版ros2,已经安装好colcon,以上步骤可以忽略。
2.2 关于编译器的配置
在~/.bashrc中配置编译器:
vim ~/.bashrc
将以下语句追加到~/.bashrc的最后语句。
source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
三、建立工程
3.1 建立工程的工作空间
cd ~/tmp
mkdir -p ros2_ws/src
3.2 编译一个空的workspace
编译一个空的工程:
cd ros2_ws
colcon build
设置系统路径、编译器路径、本工程的路径,路径:sudo gedit ~/.bashrc,追加如下:
source /opt/ros/humble/setup.bash
source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
source ~/tmp/ros2_ws/install/setup.bash
四、建立一个软件包
4.1 生成一个包
注意包生成的路径:
cd ros2_ws/src
生成一个包:
ros2 pkg create my_robot_controller --build-type ament_python --dependencies rclpy
通过以上create语句,生成一个名字叫my_robot_controller的包。
4.2 包的在工程中的位置
工作空间中,不外乎两个指令:编译指令、包生成指令,它们执行的地点应该明确了。如下图:
这里参看整个workspace的路径:
cd ros2_ws
tree
├── build
│ ├── COLCON_IGNORE
│ └── my_robot_controller
│ ├── build
│ │ └── lib
│ │ └── my_robot_controller
│ │ └── __init__.py
│ ├── colcon_build.rc
│ ├── colcon_command_prefix_setup_py.sh
│ ├── colcon_command_prefix_setup_py.sh.env
│ ├── install.log
│ ├── my_robot_controller.egg-info
│ │ ├── dependency_links.txt
│ │ ├── entry_points.txt
│ │ ├── PKG-INFO
│ │ ├── requires.txt
│ │ ├── SOURCES.txt
│ │ ├── top_level.txt
│ │ └── zip-safe
│ └── prefix_override
│ ├── __pycache__
│ │ └── sitecustomize.cpython-310.pyc
│ └── sitecustomize.py
├── install
│ ├── COLCON_IGNORE
│ ├── local_setup.bash
│ ├── local_setup.ps1
│ ├── local_setup.sh
│ ├── _local_setup_util_ps1.py
│ ├── _local_setup_util_sh.py
│ ├── local_setup.zsh
│ ├── my_robot_controller
│ │ ├── lib
│ │ │ └── python3.10
│ │ │ └── site-packages
│ │ │ ├── my_robot_controller
│ │ │ │ ├── __init__.py
│ │ │ │ └── __pycache__
│ │ │ │ └── __init__.cpython-310.pyc
│ │ │ └── my_robot_controller-0.0.0-py3.10.egg-info
│ │ │ ├── dependency_links.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── PKG-INFO
│ │ │ ├── requires.txt
│ │ │ ├── SOURCES.txt
│ │ │ ├── top_level.txt
│ │ │ └── zip-safe
│ │ └── share
│ │ ├── ament_index
│ │ │ └── resource_index
│ │ │ └── packages
│ │ │ └── my_robot_controller
│ │ ├── colcon-core
│ │ │ └── packages
│ │ │ └── my_robot_controller
│ │ └── my_robot_controller
│ │ ├── hook
│ │ │ ├── ament_prefix_path.dsv
│ │ │ ├── ament_prefix_path.ps1
│ │ │ ├── ament_prefix_path.sh
│ │ │ ├── pythonpath.dsv
│ │ │ ├── pythonpath.ps1
│ │ │ └── pythonpath.sh
│ │ ├── package.bash
│ │ ├── package.dsv
│ │ ├── package.ps1
│ │ ├── package.sh
│ │ ├── package.xml
│ │ └── package.zsh
│ ├── setup.bash
│ ├── setup.ps1
│ ├── setup.sh
│ └── setup.zsh
├── log
│ ├── build_2023-03-02_10-42-14
│ │ ├── events.log
│ │ └── logger_all.log
│ ├── build_2023-03-02_10-50-32
│ │ ├── events.log
│ │ ├── logger_all.log
│ │ └── my_robot_controller
│ │ ├── command.log
│ │ ├── stderr.log
│ │ ├── stdout.log
│ │ ├── stdout_stderr.log
│ │ └── streams.log
│ ├── build_2023-03-02_10-57-14
│ │ ├── events.log
│ │ ├── logger_all.log
│ │ └── my_robot_controller
│ │ ├── command.log
│ │ ├── stderr.log
│ │ ├── stdout.log
│ │ ├── stdout_stderr.log
│ │ └── streams.log
│ ├── COLCON_IGNORE
│ ├── latest -> latest_build
│ └── latest_build -> build_2023-03-02_10-57-14
└── src
└── my_robot_controller
├── my_robot_controller
│ ├── __init__.py
│ └── my_first_node.py
├── package.xml
├── resource
│ └── my_robot_controller
├── setup.cfg
├── setup.py
└── test
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py
4.3 包生成后重新编译
在包生成后,进行一次空的编译:
cd ros2_ws
colcon build
如果出现下述信息,恭喜您有中着了:
这里错误原因是:setuptooks版本太高引起,查看版本:
pip3 list (如果没有pip3用sudo apt install python3-pip安装。)
pip3 list |grep setuptools
用 pip install setuptools==58.2.0 语句可以降低版本,然后执行无误。
五、生成python节点
5.1 节点程序位置
在以上的工作空间,找到包路径:
cd ./ros2_ws/src/my_robot_controller/my_robot_controller
5.2 编写节点
文件名称:
sudo vim first_node.py
将上述文件保存后,执行colcon编译。(注意:colcon总是在workspace路径上执行)
在setup.py配置如下:
再次强调,需要source文件.bashrc
source /opt/ros/humble/setup.bash
source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
source ~/tmp/ros2_ws/install/setup.bash
再次编译,编译过后:执行
ros2 run my_robot_controller test_node
可以启动。注意这里test_node也可以用first_node.py代替。