网站设计就业压力,wordpress插件漏洞扫描,新华社官网,队徽logo在线设计1、概述
我们在前面介绍的ROS#xff0c;都是ROS1的版本#xff0c;近期对机器狗进行学习的时候#xff0c;发现版本是ROS2了#xff0c;也发现平时习惯的一些命令都有了变化#xff0c;改变还是挺大的#xff0c;不过熟悉之后还是很习惯ROS2的写法。 ROS2不是在ROS1的基…1、概述
我们在前面介绍的ROS都是ROS1的版本近期对机器狗进行学习的时候发现版本是ROS2了也发现平时习惯的一些命令都有了变化改变还是挺大的不过熟悉之后还是很习惯ROS2的写法。 ROS2不是在ROS1的基础上做的更新而是重新构建的这样避免ROS1的设计的很多不规范尤其是在实时性安全性等方面都满足不了现代工作的需求而做一些底层修改又可能造成ROS1的不稳定所以算是全新架构了。底层是用C语言编写叫做RCL库(ROS客户端库Client Library是一种API提供ROS话题、服务、动作、参数等接口)在写上层程序中调用的rclcpp和rclpy是在RCL库上进行一次包装这样带来的好处是让C(默认使用cpp 11 cpp1A4cpp17标准比ROS1默认使用的cpp98标准更加现代化的)和Python(这里放弃了Python2直接使用的是Python3)程序调用API更加统一相似同时对ROS2进行功能更新时直接更新RCL库再新增C和Python的支持。 虽然launch启动文件还是支持不过在ROS2中建议使用Python文件写launch文件更加的灵活。
2、历史版本
我们先来看下ROS1有哪些历史版本 Ubuntu版本 ros版本 Ubuntu 20.04 noetic Ubuntu18.04 melodic Ubuntu16.04 kinetic Ubuntu14.04 indigo 这个跟Ubuntu的版本对应着到了ROS2的时候基本每年都有新的版本发布ROS2的历史版本列表 Crystal: 2018年12月 Dashing: 2019年5月 Eloquent: 2019年11月 Foxy: 2020年6月 Galactic: 2021年5月 本人的Ubuntu版本信息lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.4 LTS Release: 20.04Codename: focal 其余命令还有cat /etc/issue 或者cat /etc/os-release或者cat /proc/version
比如本人的ROS2版本rosversion -dfoxy 或者rosversion --distrofoxy
3、命令变化
命令也改变了基本是将ros1中的rosxxx拆分成了ros2 xxx的形式比如 rosrun 变成了 ros2 run当然我们可以通过双击tab键来看提示是最好的这个也是多次推荐的做法如下图 可以看到这样的命令个人感觉更合理了每个单词都有其实际意义了更加直观。
我们来运行一个节点Demo看下效果一个发布节点和一个订阅节点
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener 截图如下 这里运行上述两个节点之前我并没有运行roscore可以看到两个节点可以互相进行通信了也就是说ROS2的去中心化设计让其适应更多工业应用和产品级应用场景的需求。 ROS1和ROS2可以并存于同⼀台电脑,你只需要source其对应的setup.bash即可完成环境的选择。 其余一些常见命令的变化如下 编译指令从 catkin_make 更改为 colcon build rosrun rqt_graph rqt_graph 更改为 rqt_graphrosrun rqt_tf_tree rqt_tf_tree 更改为 ros2 run tf2_tools view_frames.pyrviz 更改为 rviz2 4、全新安装
本人安装环境lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.6 LTS Release: 18.04Codename: bionic 前面铺垫了一些ROS1到ROS2的部分变化接下来我们来安装一个全新的ROS2这样就会更加快速的熟悉它。
4.1、安装ROS2
首先更新软件库
sudo apt update
sudo apt upgrade
安装ROS2推荐安装完整版
sudo apt install ros-foxy-desktop
如果不想安装完整版本可以只安装核心软件包sudo apt install ros-foxy-ros-base 不出意外的出了意外报错如下 E: Unable to locate package ros-foxy-desktop 所以需要指定软件安装源来安装
sudo apt update sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c echo deb [arch$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main /etc/apt/sources.list.d/ros2-latest.list
这里可以写死也可以获取变量值的写法
dpkg --print-architecture 本机amd64 lsb_release -c 可以给出自身的版本本机 Codename: bionic
写入之后我们查看下源内容cat /etc/apt/sources.list.d/ros2-latest.list deb [archamd64,arm64] http://packages.ros.org/ros2/ubuntu bionic main 然后再次更新sudo apt update
这里的Ubuntu18版本好像不能安装foxy网上却很多安装成功的这个暂时存疑因为我也觉得这个ROS2应该跟Ubuntu版本没有对应关系了那我们安装Dashing来体验下
sudo apt install ros-dashing-desktop
安装好了之后配置环境追加到 ~/.bashrc这样不需要每次source
echo source /opt/ros/dashing/setup.bash ~/.bashrc
由于本人在之前也安装了ROS1所以我们在这里可以写一个判断~/.bashrc文件追加如下内容
echo ROS melodic (1) or ROS2 dashing (2)?
read edition
if [ $edition -eq 1 ];thensource /opt/ros/melodic/setup.bashecho using ros melodic
elsesource /opt/ros/dashing/setup.bashecho using ros2 dashing
fi
这样就会在开启终端时选择ROS1还是ROS2输入1表示启动ROS1输入2表示启动ROS2 如果启动ROS2时出现下面警告 ROS_DISTRO was set to melodic before. Please make sure that the environment does not mix paths from different distributions. 翻译过来是之前将ROS_DISTRO设置为“melodic”。请确保环境没有混合来自不同发行版的路径。 就将.bashrc里面的/opt/ros/melodic/setup.bash注释掉即可。
如果双击tab键没有给出提示需安装命令补全包sudo apt install python3-argcomplete
然后测试下分别输入
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener
ROS2安装之后测试没问题如下图 一些常见的开发需要的包自行按需选择安装
sudo apt install ros-dashing-turtlesim
sudo apt install ros-dashing-xacro
sudo apt install python3-pip
sudo apt install python3-colcon-common-extensions
sudo apt install python3-vcstool
sudo apt-get install ros-dashing-joint-state-publisher-gui#卸载ROS2
sudo apt remove ros-dashing-* sudo apt autoremove
4.2、安装Gazebo
Gazebo是一个强大的仿真平台平时用的比较多安装如下
sudo apt install ros-dashing-gazebo-ros-pkgs
导航相关的包
sudo apt install ros-dashing-cartographer
sudo apt install ros-dashing-cartographer-ros
sudo apt install ros-dashing-navigation2
sudo apt install ros-dashing-nav2-bringup
sudo apt install ros-dashing-gazebo-ros2-control
sudo apt install ros-dashing-ros2-control ros-dashing-ros2-controllers 4.3、编译
编译的过程相比ROS1在ROS2中也发生了很大的改变未来随着ROS1的慢慢淘汰我们还是重点掌握ROS2的用法即可创建工作空间
mkdir -p ~/myRobotDog_ws/src
cd ~/myRobotDog_ws/src
创建包(这里跟ROS1不一样)
ros2 pkg create --build-type ament_cmake mypkg --node-name mynode
同样会在mypkg这个包下面生成以下目录与文件 CMakeLists.txt include package.xml src 然后我们来看下节点mynode在src里的一个c文件gedit mynode.cpp
#include cstdioint main(int argc, char ** argv)
{(void) argc;(void) argv;printf(hello world mypkg package\n);return 0;
}
接下来就是编译在编译之前确保已安装colcon编译器
sudo apt install python3-colcon-common-extensions
cd ~/myRobotDog_ws
colcon build --symlink-install
echo source ~/myRobotDog_ws/install/setup.bash ~/.bashrc
然后测试下
ros2 run mypkg mynode
#hello world mypkg package
如果想增加节点修改CMakeLists.txt文件即可
cd ~/myRobotDog_ws/src/mypkg
gedit CMakeLists.txt
新增即可:
add_executable(mynode src/mynode.cpp)
target_include_directories(mynode PUBLIC$BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include$INSTALL_INTERFACE:include)install(TARGETS mynodeDESTINATION lib/${PROJECT_NAME})
colcon的一些常用参数 --symlink-install使用符号链接比如动态链接库会在install目录中使用符号链接指向build目录下生成的库文件(如 *.so)如果没有该选项则两个目录都有该库文件。--packages-select只编译指定包比如单独编译mypkg包colcon build --packages-select mypkg--packages-ignore 忽略指定包用法同上--continue-on-error编译出错继续编译其他模块--cmake-args --ament-cmake-args --catkin-cmake-args 传递参数给对应的package 最后需要注意的ROS2在修改完任何文件后需要重新编译 colcon build
更多详情可以查阅https://docs.ros.org/en/dashing/Installation/Ubuntu-Install-Debians.html
5、编译Python
对于Python的编译有好几个点需要注意以及一些配置文件的修改
mkdir -p ~/mypy_ws/src
cd ~/mypy_ws/src
ros2 pkg create --build-type ament_python my_py
cd ~/mypy_ws/src/my_py/my_py
touch PYNode.py
gedit PYNode.py
#!/usr/bin/env python3import rclpy
from rclpy.node import Nodedef main(argsNone):rclpy.init(argsargs)node Node(ChyiChin_Node)node.get_logger().info(Python TEST)rclpy.spin(node)rclpy.shutdown()if __name__ __main__:main()
加个可执行权限chmod x PYNode.py
cd ~/mypy_ws
colcon build --packages-select my_py
source install/setup.bash
运行ChyiChin_Node节点看下能否正确输出日志信息
ros2 run my_py ChyiChin_Node
[INFO] [ChyiChin_Node]: Python TEST
OK没有问题对C和Python的编译就这么愉快的搞定了。接下来将贴出在编译过程中遇到的一些错误以及处理的方法
6、编译出错
6.1、setup.cfg Usage of dash-separated script-dir will not be supported in future version 短横线在未来版本不再支持所以我们需要修改为下划线的形式
cd ~/mypy_ws/src/my_py
gedit setup.cfg
将里面的script-dir和install-scripts修改为script_dir和install_scripts
6.2、Setuptools版本 SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools. setuptools.SetuptoolsDeprecationWarning, 查看下setuptools的版本
python3import setuptools
print(setuptools.__version__)
59.6.0
版本太新了安装低版本的就可以了
pip3 install setuptools58.2.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
6.3、No executable found
ros2在运行python文件时会报错No executable found
在前面的mypkg包里面可以查询到所有可执行程序ros2 pkg executables mypkg mypkg mynode mypkg mynode1 然后在Python里面的my_py包查询是空的ros2 pkg executables my_py
解决方案在编译之前需要修改setup.py告知入口点位置也就是Python文件的路径
cd ~/mypy_ws/src/my_py
gedit setup.pyentry_points{console_scripts: [ChyiChin_Nodemy_py.PYNode:main],},
其中ChyiChin_Node为节点名称my_py.PYNode为Python文件路径(包名.文件名)加:main入口函数
6.4、RuntimeError RuntimeError: distutils.core.setup() was never called -- perhaps setup.py is not a Distutils setup script? 翻译过来是RuntimeError: Distutils .core.setup()从未被调用-也许setup.py不是Distutils安装脚本? 这个属于运行时错误所以需要一个rclpy的依赖所以在创建包的时候这样写即可ros2 pkg create my_py --build-type ament_python --dependencies rclpy 最后来看下运行Python写的这个节点
ros2 run my_pkg ChyiChin_Node
截图如下 7、小结
ROS2的出现让ROS真正成为了去中心化的分布式的操作系统这个是其最主要的特点因为在ROS1中我们知道需要首先启动roscore也就是MASTER管理节点如果这个节点崩了那整个ROS系统都崩了这是一种不好的设计。 另外引入了数据分发服务通信协议(DDS)使用零拷贝的方式来传递消息这大大节省了内存和传输所占用的资源提高了通信的实时性。