ROS2学习1 环境搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文记录学习赵虚左老师的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 用于无人机和无人驾驶,开源的飞行控制软件

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值