提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文记录学习赵虚左老师的ROS2系列课程第一章课程记录
1 ROS简介
1.1 ROS的概念?
ROS的全称为Robot Operation System(机器人操作系统),但其实并不是真正意义上的操作系统(区别于Windows,Mac等),它依赖于这些操作系统,是一个SDK(Software Development Kit),即软件开发工具箱
1.2 ROS humble
2022年推出,ROS2的第一个5年长支持版,对于ROS是一个里程碑事件
1.3 ROS的组成体系
ROS由通信(Plumbing)、工具(tools)、功能(capacibilities)、社区(community)四部分组成
通信
通信是ROS的核心,体现了面向接口的编程思想,具体体现在只要外接工具符合规范,就可以进行相应的使用
工具
例如rviz2,ROS提供了许多工具来提高效率
功能
降低开发门槛,提高开发效率
社区
1.4 ROS2和ROS1的区别
1、ROS2不再以master结点为中心进行各个结点的连接,而是采用节点之间可以互相发现的模式;
2、通信上采用DDS而不是自己写通信底层;
3、更加支持多机器人编队;
4、产品更易落地
2 安装ROS2
此处不写出ROS2在安装过程
2.1 测试ROS2
小乌龟案例
启动两个终端分别输入
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
3 Hello World
创建工作空间
mkdir -p 父子级关系创建文件夹
mkdir -p ws00_helloworld/src
cd ws00_helloworld/
colcon build
接下来:
1.创建功能包
2.编写源文件
3.编辑配置文件
4.编译
5.执行
C++编写
1.创建功能包
cd src
ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld
pkg create 创建功能包
pkg01_helloworld_cpp 自定义包名
–build-type ament_cmake 指定构建类型–C++
–dependencies rclcpp 设置依赖
–node-name helloworld 设置可执行程序名字
2.编写源文件
#include"rclcpp/rclcpp.hpp"
int main(int argc,char **argv){
//初始化ROS2客户端;
rclcpp::init(argc,argv);
//创建节点指针
auto node = rclcpp::Node::make_shared("helloworld_node_cpp");
//输出日志
RCLCPP_INFO(node->get_logger(),"hello world!");
//释放资源
rclcpp::shutdown();
return 0;
}
3.编辑配置文件
4.编译
cd ..
colcon build
5.更新环境变量
source install/setup.bash
6.执行
ros2 run pkg01_helloworld_cpp helloworld
包名+可执行程序名字
python编写
1.创建功能包
工作空间下src目录中
ros2 pkg create pkg02_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld
2.编写源文件
import rclpy
def main():
#初始化ROS2客户端
rclpy.init()
#创建节点
node = rclpy.create_node("helloworld_node_py")
#输出日志
node.get_logger().info("hello world!(python)")
#释放资源
rclpy.shutdown()
if __name__ == '__main__':
main()
3.编辑配置文件
4.编译
工作空间下编译
colcon build
5.执行
source install/setup.bash
ros2 run pkg_02_helloworld_py helloworld
4 运行优化
以上的更新环境变量只能保证在当前终端有效,改变终端之后就会发生找不到工作空间的现象
因此可以将当前的工作空间写入.bashrc文件中
sudo gedit ~/.bashrc 打开bashrc文件
source /home/linxin/ws00_helloworld/install/setup.bash 将这句话添加到文件最下面
5 安装软件
Vscode快捷键
ctrl+shift+a 多行注释
ctrl+/ 单行注释
terminator快捷键:
ctrl+shift+o 水平分割
ctrl+shift+e 垂直分割
alt+上下左右箭头
6 代码编写规范
在ROS2中,直接实例化的代码方式是不被推荐的(1个进程只能运行一个节点),更推荐以继承Node的方式来创建节点对象(1个进程内可以组织多个节点)
C++
//推荐
class MyNode : public rclcpp::Node{
public:
MyNode():Node("hello_node_cpp"){
RCLCPP_INFO(this->get_logger(),"hello world!(继承的方式)");
}
} ;
//const char *argv[] 表示 argv 是一个指向常量字符指针的数组,即指向不可修改的字符数组。这表示 argv 中的字符串是只读的
int main(int argc, char const *argv[])
{
//初始化
rclcpp::init(argc,argv);
//实例化自定义类
auto node = std::make_shared<MyNode>();
//其他操作......
//资源释放
rclcpp::shutdown();
return 0;
}
python
#方式2 推荐
#自定义类
class MyNode(Node):
def __init__(self):
super().__init__("hello_node_py")
self.get_logger().info("hello world!(python 继承方式)")
def main():
#初始化
rclpy.init()
#创建对象
node = MyNode()
#其他操作
#资源释放
rclpy.shutdown()
if __name__ == '__main__':
main()
初始化与资源释放在程序中的作用
初始化可以生成context容器方便在一个进程中传递信息(假如传输图像信息等)
7 下载humble tutorials源码
-b 版本
git clone https://github.com/ros/ros_tutorials.git -b humble
8 技术支持
ROS index可以搜索到可用的功能包
9 ROS2应用方向
nav2:导航 继承自navigation stack
opencv
moveit
autoware fundation 自动驾驶
microROS 用于硬件比如stm32
PX4 用于无人机和无人驾驶,开源的飞行控制软件
…