ros2笔记

news2024/11/24 23:20:27

Ros2

  • hello world c++
    • create package
    • helloworld.cpp
  • hello world python
    • helloworld.py
  • file explain
  • ros2 cmd
    • create
    • build
    • find
    • run
    • install
  • interfaces
    • msg file
    • srv file
    • action file
  • Topic

hello world c++

mkdir -p {your workspace name}/src
cd {your workspace name} #进入工作空间
colcon build #编译

create package

in {your workspace name}/src

ros2 pkg create {your package name} --build-type ament-cmake --dependencies rclcpp	 --node-name helloworld

在这里插入图片描述

helloworld.cpp

#include "rclcpp/rclcpp.hpp"

int main(int argc,char ** argv)
{
  rclcpp::init(argc,argv);

  auto node = rclcpp::Node::make_shared("helloworld_node");

  RCLCPP_INFO(node->get_logger(),"hello world!");

  rclcpp::shutdown();
  return 0; 
}

if you want to add some dependencies you can like this
在这里插入图片描述
this is CMakeLists 's explain

# 引入外部依赖包
find_package(rclcpp REQUIRED)
# 映射源文件与可执行文件
add_executable(helloworld src/helloworld.cpp)

# 设置目标依赖库
ament_target_dependencies(
  helloworld
  "rclcpp"
)
# 定义安装规则
install(TARGETS helloworld
  DESTINATION lib/${PROJECT_NAME})

build
in your workspace

colcon build

if you meet this situation
在这里插入图片描述you must use pip install catkin_pkg

pip swapping source

pip config set global.index-url --site https://pypi.tuna.tsinghua.edu.cn/simple

run
you must in your workspace

source ./install/setup.bash 
ros2 run {your package name} {your node name} 

在这里插入图片描述

hello world python

in {your workspace name}/src

ros2 pkg create {your package name} --build-type ament_python --dependencies rclpy --node-name {your node name}

在这里插入图片描述

helloworld.py

import rclpy

def main():
    rclpy.init();

    node = rclpy.create_node("hello")

    node.get_logger().info("hello python")

    rclpy.shutdown()

if __name__ == '__main___':

    main()

setup.py
在这里插入图片描述
run

colcon build
. install/setup.bash 
ros2 run {your paceage name} {your node name} 

operational optimization

echo "source /{your work space path}/install/setup.bash" >> ~/.bashrc

file explain

WorkSpace --- 自定义的工作空间。
    |--- build:存储中间文件的目录,该目录下会为每一个功能包创建一个单独子目录。
    |--- install:安装目录,该目录下会为每一个功能包创建一个单独子目录。
    |--- log:日志目录,用于存储日志文件。
    |--- src:用于存储功能包源码的目录。
        |-- C++功能包
            |-- package.xml:包信息,比如:包名、版本、作者、依赖项。
            |-- CMakeLists.txt:配置编译规则,比如源文件、依赖项、目标文件。
            |-- src:C++源文件目录。
            |-- include:头文件目录。
            |-- msg:消息接口文件目录。
            |-- srv:服务接口文件目录。
            |-- action:动作接口文件目录。
        |-- Python功能包
            |-- package.xml:包信息,比如:包名、版本、作者、依赖项。
            |-- setup.py:与C++功能包的CMakeLists.txt类似。
            |-- setup.cfg:功能包基本配置文件。
            |-- resource:资源目录。
            |-- test:存储测试相关文件。
            |-- 功能包同名目录:Python源文件目录。
		|-- C++或Python功能包
		    |-- launch:存储launch文件。
		    |-- rviz:存储rviz2配置相关文件。
		    |-- urdf:存储机器人建模文件。
		    |-- params:存储参数文件。
		    |-- world:存储仿真环境相关文件。
		    |-- map:存储导航所需地图文件。
		    |-- ......

c++ template

#include "rclcpp/rclcpp.hpp"

class MyNode: public rclcpp::Node{
public:
    MyNode():Node("node_name"){
        RCLCPP_INFO(this->get_logger(),"hello world!");
    }

};

int main(int argc, char *argv[])
{
    rclcpp::init(argc,argv);
    auto node = std::make_shared<MyNode>();
    rclcpp::shutdown();
    return 0;
}

python template

import rclpy
from rclpy.node import Node

class MyNode(Node):
    def __init__(self):
        super().__init__("node_name_py")
        self.get_logger().info("hello world!")
def main():

    rclpy.init()
    node = MyNode() 
    rclpy.shutdown()

package.xml

1.根标签
<package>:该标签为整个xml文件的根标签,format属性用来声明文件的格式版本。

2.元信息标签
<name>:包名;

<version>:包的版本号;

<description>:包的描述信息;

<maintainer>:维护者信息;

<license>:软件协议;

<url>:包的介绍网址;

<author>:包的作者信息。

3.依赖项
<buildtool_depend>:声明编译工具依赖;

<build_depend>:声明编译依赖;

<build_export_depend>:声明根据此包构建库所需依赖;

<exec_depend>:声明执行时依赖;

<depend>:相当于<build_depend>、<build_export_depend>、<exec_depend>三者的集成;

<test_depend>:声明测试依赖;

<doc_depend>:声明构建文档依赖。

CMakeLists.txt

# 引入外部依赖包
find_package(rclcpp REQUIRED)

# 映射源文件与可执行文件
add_executable(helloworld src/helloworld.cpp)
# 设置目标依赖库
ament_target_dependencies(
  helloworld
  "rclcpp"
)
# 定义安装规则
install(TARGETS helloworld
  DESTINATION lib/${PROJECT_NAME})

setup.py

from setuptools import setup

package_name = 'pkg02_helloworld_py'

setup(
    name=package_name, # 包名
    version='0.0.0',   # 版本
    packages=[package_name], # 功能包列表
    data_files=[ #需要被安装的文件以及安装路径
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'], # 安装依赖
    zip_safe=True,
    maintainer='ros2', # 维护者
    maintainer_email='ros2@todo.todo', # 维护者 email
    description='TODO: Package description', # 包描述
    license='TODO: License declaration', # 软件协议
    tests_require=['pytest'], # 测试依赖
    entry_points={
        'console_scripts': [
            # 映射源文件与可执行文件
            'helloworld = pkg02_helloworld_py.helloworld:main'
        ],
    },
)

ros2 cmd

create

ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称

格式解释:
–build-type:是指功能包的构建类型,有cmake、ament_cmake、ament_python三种类型可选;

–dependencies:所依赖的功能包列表;

–node-name:可执行程序的名称,会自动生成对应的源文件并生成配置文件。

build

build all

colcon build

build select

colcon build --packages-select 功能包列表

find

ros2 pkg executables [包名] # 输出所有功能包或指定功能包下的可执行程序。
ros2 pkg list # 列出所有功能包
ros2 pkg prefix 包名 # 列出功能包路径
ros2 pkg xml # 输出功能包的package.xml内容

run

ros2 run 功能包 可执行程序 参数

install

sudo apt install ros-ROS2版本代号-功能包名称

interfaces

msg file

int64 num1
int64 num2

srv file

int64 num1
int64 num2
---
int64 sum

upper part is used to declare request and the lower part is response

action file

int64 num
---
int64 sum
---
float64 progress

request response and feedback

Topic

ros2 pkg create cpp01_topic --build-type ament_cmake --dependencies rclcpp std_msgs base_interfaces_demo
ros2 pkg create py01_topic --build-type ament_python --dependencies rclpy std_msgs base_interfaces_demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1795798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CTF-Web】文件上传漏洞学习笔记(ctfshow题目)

文件上传 文章目录 文件上传What is Upload-File&#xff1f;Upload-File In CTFWeb151考点&#xff1a;前端校验解题&#xff1a; Web152考点&#xff1a;后端校验要严密解题&#xff1a; Web153考点&#xff1a;后端校验 配置文件介绍解题&#xff1a; Web154考点&#xff1a…

【Java】static 修饰成员方法

static 修饰成员方法 简介 应用 static 修饰成员方法 1.static 修饰成员方法2.内存原理3.main函数4.类方法的应用 1.static 修饰成员方法 测试类&#xff1a; package suziguang_d2_staticdemo;public class Test {public static void main(String[] args) {// 1.类方法使用/…

六西格玛培训,带你解锁职场超能力工具!

当提及六西格玛培训的精髓时&#xff0c;我们不得不提到那些强大而实用的工具&#xff0c;它们如同探险者的指南针&#xff0c;引导我们走向卓越。今天&#xff0c;就让我们一起揭开这些神秘工具的面纱&#xff0c;探寻六西格玛背后的智慧。 首先&#xff0c;DMAIC流程是六西格…

SpringBoot高手之路04-Aop

文章目录 AOP 基础AOP概述start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖都会下载下来 AOP快速入门AOP核心概念 切入点表达式-execution AOP 基础 AOP概述 AOP 对特定的方法做增强 AOP 快速入门 start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖…

LNMP网站架构部署

目录 一、LNMP架构部署&#xff08;源码编译安装&#xff09; ①实验准备 ②安装nginx服务 ③安装mysql服务&#xff0c;配置文件 ④安装php服务&#xff0c;修改配置文件 ⑤验证 静态页面测试访问 动态页面测试访问 调用数据库测试 二、LNMP架构应用实例 1.论坛网站…

网鼎杯 2020 玄武组 SSRFMe

复习一下常见的redis主从复制 主要是redis伪服务器的选择和一些小坑点 <?php function check_inner_ip($url) { $match_resultpreg_match(/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/,$url); if (!$match_result) { die(url fomat error); } try { …

安卓照片云备份:如何将Android照片备份到云服务

随着智能手机摄影技术的发展&#xff0c;我们每天都在手机上拍摄大量照片和视频。为了防止宝贵的回忆丢失&#xff0c;将这些照片备份到云服务上是一个明智的选择。我们有多种云服务可供选择&#xff0c;如华为云、小米云、腾讯云等&#xff0c;它们提供了安全、便捷的数据备份…

力扣2968.执行操作使频率分数最大

力扣2968.执行操作使频率分数最大 方法一&#xff1a;滑窗 前缀和 求前缀和数组s 求一个数组补齐到中位数的差值 枚举右端点 class Solution {public:int maxFrequencyScore(vector<int>& nums, long long k) {int res0,n nums.size();sort(nums.begin(),nums…

tomcat中管理环境变量之setenv.sh

tomcat配置spring profiles springboot打包war部署到外部tomcat的时候指定profile启动 windows 在%tomcat%/bin下创建setenv.bat文件 linux 在%tomcat%/bin下创建setenv.sh文件 使用JVM参数: windows set "JAVA_OPTS%JAVA_OPTS% -Dspring.profiles.activedev"in…

【ROS2大白话】三、给turtlebot3安装realsense深度相机

系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录效果展示一、修改model.sdf文件1. 路径位置2. 修改…

基于python的网上挂号预约系统-计算机毕业设计源码35796

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院当然也不例外。网上挂号预约系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用Py…

数据结构:详解二叉树(树,二叉树顺序结构,堆的实现与应用,二叉树链式结构,链式二叉树的4种遍历方式)

目录 1.树的概念和结构 1.1树的概念 1.2树的相关概念 1.3树的代码表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的存储结构 2.3.1顺序存储 2.3.2链式存储 3.二叉树的顺序结构和实现 3.1二叉树的顺序结构 3.2堆的概念和结构 3.3堆的特点 3…

Linux 35.5 + JetPack v5.1.3@ego-planner-swarm编译安装

Linux 35.5 JetPack v5.1.3ego-planner-swarm编译安装 1. 源由2. 编译&安装Step 1&#xff1a;依赖库安装Step 2&#xff1a;建立工程Step 3&#xff1a;编译工程Step 4&#xff1a;安装工程 3. 问题汇总3.1 组件ros-noetic-roslint问题3.2 uav_simulator/local_sensing -…

Win32和c++11多线程

Win32和c11多线程 一、概念1.线程的特点线程内核对象线程控制块线程是独立调度和分派的基本单位共享进程的资源 2.线程的上下文切换引起上下文切换的原因 3.线程的状态 二、Windows多线程API1.CreateThread创建线程2.获取线程ID3.关闭线程句柄4.挂起线程5.恢复线程6.休眠线程的…

GAT1399协议分析(二)--注册流程分析

一、官方流程说明 二、官方流程解析 1 : 发起方向接收方发送注册 HTTP POST 请求/VIID/System/Register。 2: 接收方向发送方发送响应401 Unauthorized, 并在响应的消息头 WWW-Authenticate 字段中给 出适合发送方的认证机制和参数。 3: 发起方重新向接收方发送注册 HTTP POST…

谷歌创新框架:从非结构化数据,实现多模态学习

看、听、说的多模态已成为主流大模型的重要功能之一。但在数据爆炸时代&#xff0c;大模型学习文本类的结构化数据相对还好一些&#xff0c;但要去学习视频、音频、图片等非结构化数据非常困难。 目前&#xff0c;从结构化和非结构化数据实现多模态学习&#xff0c;会随着模态…

【Linux】查看进程在哪个CPU上运行

当前服务器是多核&#xff0c;在进行性能压测时&#xff0c;需要除了要观测全局的CPU使用率&#xff0c;对于单进程单线程往往需要在一个cpu上运行&#xff0c;那如何查看进程在哪个CPU上运行呢&#xff1f; 方法一&#xff1a;taskset taskset命令主要是用来检索或设置一个处…

IO进程线程(九)线程的同步 进程间通信

文章目录 一、 线程的同步&#xff08;一&#xff09;无名信号量sem1. 定义和初始化2.获取信号量3.释放信号量4. 销毁5. 使用示例 &#xff08;二&#xff09;条件变量1. 定义和初始化2. 获取条件变量3. 释放条件变量4. 销毁条件变量 二、进程间通信&#xff08;一&#xff09;…

yum进阶——配置yum源

一、yum概述 yum的主要作用 解决依赖关系 自动安装 自动升级 各个系统中的安装软件服务 CentOS7 &#xff1a;yum -y 安装 rpm包 CentOS8 &#xff1a;dnf&#xff08;yum的升级版&#xff09;&#xff0c; Ubantu(22.04) &#xff1a;apt -y 安装&#xff0c;安装源为/…

【Python报错】已解决ModuleNotFoundError: No module named ‘packaging’

成功解决“ModuleNotFoundError: No module named ‘packaging’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No module named packaging这样的错误&#xff0c;通常意味着你的Python环境中缺少名为packaging的模块&#xff0c;或者该模块没有被正确…