《Ubuntu22.04环境下的ROS2学习笔记2》

一、在ROS2环境下创建功能包

        如果您已经完成了上一小节的内容,那么接下来您一定渴望自己创建一个功能包来实现相应的功能。在ROS1中,您创建的功能包可以既写C/C++,又写python,但ROS2中不允许用户这么做,您的C/C++和python代码创建的功能包是不一样的。

二、创建功能包的流程

ros2 pkg create <package_name> --build-type ament_cmake 

ros2 pkg create <package_name> --build-type ament_python

这两句代码分别对应两种不同的功能包,我们创个C/C++的来看看怎么个事。

这里警告了,原因是咋们的许可证没选择在ROS2官方文档里面是带了这个参数项的

--license Apache-2.0

ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>

他的功能包名字放在最后,参数里除了提示了是C/C++语言还提到了许可证,但不填似乎问题不大,当然您不过看到警告就烦体质可以带上。方便复制下面。

ros2 pkg create <package_name> --build-type --license Apache-2.0 ament_cmake 

三、编写代码

        这次编写代码原本我是想用像大多数一样的class类继承rclcpp::Node的方式来写的,但是奈何技术不够,磕了几天感觉头疼换和ROS1类似的方式写了下面的代码,同时呢我想让本次的测试更有观赏性和参考性,我用了turtlesim功能包作为我的辅助,同时详细介绍下msg文件如何include。

a、首先我下载了turtlesim功能包

        您可以 ROS Package: turtlesim 先ros.index网站找到功能包,详细细节您可以看我之前的一篇文章《Ubuntu20.04环境下的ROS进阶学习0》_ubuntu下查看ros-CSDN博客

总而言之您只需要操作以下代码就可以下载该功能包:

cd ~/ros2_ws/src

git clone https://github.com/ros_tutorials.git

b、各种msg消息类型

        同样的操作搜索common_interfaces功能包,如下操作也行。

cd ~/ros2_ws/src

git clone https://github.com/ros2/common_interfaces.git

c、下载eigen3库

        这个和之前不一样,这个是一个C++的头文件集,用来处理向量、矩阵和线性代数相关的计算和转换。

cd ~/code        (没有记得建一个文件夹)

git clone https://gitlab.com/libeigen/eigen.git

git完后咱么那就要解压安装了。

cd eigen

mkdir build

cd build 

cmake ..

sudo make install

d、编写代码

 cd ~/ros2_ws/src

touch turtle_control.cpp 

        代码实现了turtle_control节点订阅turtle1/pose同时向turtle1/cmd_vel里面发送消息的功能。

所以在实际测试的时候得运行turtlesim节点。

#include <chrono>	//C++标准库,用于处理时间和日期的工具,特别是处理时间间隔和计数器
#include <memory>	//C++标准库,提供了智能指针,用于管理动态分配的内存,以避免内存泄漏
#include <string>	//C++标准库的头文件,提供了string类型的字符串相关操作函数
#include <eigen3/Eigen/Geometry> 	// C++ 用来提供向量和矩阵运算的头文件库#include "rclcpp/rclcpp.hpp"          // ROS2 C++接口库
#include "std_msgs/msg/string.hpp"    // 字符串消息类型
#include "turtlesim/msg/pose.hpp"
#include "geometry_msgs/msg/twist.hpp"		//位置好像是 /ros2_ws/install/geometry_msgs/include/geometry_msgs/geometry_msgs/msgclass Turtle_Pose_Sub
{public:Turtle_Pose_Sub() : receive_flag_(false){}void Turtle_Pose_Callback(const turtlesim::msg::Pose::ConstPtr& msg){turtle_pose_msgs_ = *msg;receive_flag_ = true;}bool Get_Turtle_Info(turtlesim::msg::Pose& msg){if(receive_flag_){msg = turtle_pose_msgs_;return true;}return false;}private:bool receive_flag_;turtlesim::msg::Pose turtle_pose_msgs_;};int main(int argc , char * argv[])
{rclcpp::init(argc , argv);	//初始化rclcpprclcpp::Node::SharedPtr node = rclcpp::Node::make_shared("turtle_control");	//创建节点rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr turtle1_cmd_vel_pub = node->create_publisher<geometry_msgs::msg::Twist>("/turtle1/cmd_vel" , 10);Turtle_Pose_Sub Turtle_pose_sub_class;//rclcpp::Subscription<turtlesim::msg::Pose>::SharedPtr turtle1_pose_sub = node->create_subscription<turtlesim::msg::Pose>("/turtle1/pose" , 10 , &Turtle_Pose_Sub::Turtle_Pose_Callback , &Turtle_pose_sub_class);rclcpp::Subscription<turtlesim::msg::Pose>::SharedPtr turtle1_pose_sub = node->create_subscription<turtlesim::msg::Pose>("/turtle1/pose" , 10 , std::bind(&Turtle_Pose_Sub::Turtle_Pose_Callback , &Turtle_pose_sub_class , std::placeholders::_1));rclcpp::WallRate loop_rate(10);	// 创建时钟 并设置评率为1s 10次geometry_msgs::msg::Twist turtle1_cmd_vel_msg;turtlesim::msg::Pose turtle1_pose_msg;Eigen::Matrix<double, 2, 1> turtle_point;Eigen::Matrix<double, 2, 1> target_point;Eigen::Matrix<double, 2, 1> P;Eigen::Matrix<double, 2, 1> U;Eigen::Matrix<double, 2, 2> R_;double theta , distance;target_point << 6.0 , 7.0;std::cout << "i will go to while" << std::endl;while(rclcpp::ok()){rclcpp::spin_some(node);try{//std::cout << "i am trying it" << std::endl;if(Turtle_pose_sub_class.Get_Turtle_Info(turtle1_pose_msg)){//std::cout << turtle1_pose_msg.x << std::endl;turtle_point << turtle1_pose_msg.x , turtle1_pose_msg.y;theta = turtle1_pose_msg.theta;}}catch(const std::out_of_range& e){continue;}R_ << cos(theta),sin(theta),-sin(theta),cos(theta);P << target_point(0) - turtle_point(0) , target_point(1) - turtle_point(1);distance = sqrt(P.transpose()*P);std::cout << "distance = " << distance << "\n" << std::endl;std::cout << "turtle_point = \n" << turtle_point << "\n" << std::endl;std::cout << "theta = " << theta << std::endl;U = R_ * P;turtle1_cmd_vel_msg.linear.x = U(0);turtle1_cmd_vel_msg.angular.z = U(1);//这个限幅写的好丑,我建议去掉{},但我不喜欢。if(turtle1_cmd_vel_msg.linear.x > 2){turtle1_cmd_vel_msg.linear.x = 2;}if(turtle1_cmd_vel_msg.linear.x < -2){turtle1_cmd_vel_msg.linear.x = -2;}if(turtle1_cmd_vel_msg.angular.z > 2){turtle1_cmd_vel_msg.angular.z = 2;}if(turtle1_cmd_vel_msg.angular.z < -2){turtle1_cmd_vel_msg.angular.z = -2;}if(distance < 0.3){turtle1_cmd_vel_msg.linear.x = 0;turtle1_cmd_vel_msg.angular.z = 0;}turtle1_cmd_vel_pub->publish(turtle1_cmd_vel_msg);loop_rate.sleep();}return 0;
}

        值得注意的一点是,该代码并没有像官方示例一样使用继承节点的关系继承 : rclcpp_Node类,而是类似于C语言的方式面向过程写的,在之后的改进我将试着使用。

e、修改CMakeList.txt

        在ROS2中的CMakeList.txt 和ROS1中有一定的区别,而在本次的教程中您只需要修改以下部分。

首先本次程序需要一下功能包,其中参数分别是:功能包名 、 REQUIRED(必须,即缺少报错)。

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(turtlesim REQUIRED)

将我们写的CPP文件编译成可执行文件,同时添加依赖项。

add_executable(turtle_control src/turtle_control.cpp)
ament_target_dependencies(turtle_control rclcpp std_msgs geometry_msgs turtlesim)

指定可执行文件的位置。

install(TARGETS

  turtle_control
    
    DESTINATION lib/${PROJECT_NAME})

整体如下所示,之后为了篇幅将不再贴出。

cmake_minimum_required(VERSION 3.8)
project(turtle_control)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(turtlesim REQUIRED)add_executable(turtle_control src/turtle_control.cpp)
ament_target_dependencies(turtle_control rclcpp std_msgs geometry_msgs turtlesim)#add_executable(turtle_control_useclass src/turtle_control_useclass.cpp)
#ament_target_dependencies(turtle_control_useclass rclcpp std_msgs geometry_msgs turtlesim)install(TARGETSturtle_control#turtle_control_useclassDESTINATION lib/${PROJECT_NAME})if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()

f、编译运行代码

cd ~/ros2_ws

colcon build        (运行这段代码的时间有时可达3分钟,编译真的超慢ROS2)

当然如果您已经编译过,您只需要编译您新写的代码就行

参数是--packages-select + 功能包名

那么这里我们一共打开两个终端:

第一个终端输入:  ros2 run turtlesim turtlesim_node

第二个终端输入:  ros2 run turtle_control turtle_control

        可以看到,这里的终端里面的坐标和距离目标点的距离,我们代码里面设置的distance < 0.3则停,如果您设置太小,小海龟会在那一直打圈,这个和我们的控制律有关系,之后在解决这不是本次的重点。

四、参考

Creating a package — ROS 2 Documentation: Humble documentation

ROS2 发布/订阅Topic_ros2 发布订阅-CSDN博客

[Eigen中文文档] 从入门开始..._eigen库下载-CSDN博客  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 中 web-view 向 App 传递消息

web-view向App传递消息 引入官方库 在web项目中引入官方库 uni.webview.1.5.4.js &#xff0c;可以从uniapp官方示例库中下载&#xff0c;下载后放入web项目目录下即可&#xff0c;本文放在js文件夹中&#xff0c;然后在web项目页面中引入。 官网对于uni-app使用web-view的介…

WebDeveloper:1靶机

端口扫描 靶机ip地址为192.168.153.158 目录扫描 访问80端口 拼接访问 /ipdata 发现了一个流量包 放在 wireshark 查看&#xff0c;找到 账号密码 账号&#xff1a;webdeveloper 密码&#xff1a;Te5eQg&4sBS!Yr$)wf%(DcAd 拼接 /wp-login.php 找到登录框 登录成功 找…

安卓TV入门项目

android studio创建tv项目 下载android studio点此下载 配置环境变量&#xff1a; d盘新增Android文件夹&#xff0c;创建android-avd和android-sdk文件夹 环境变量名称&#xff1a;ANDROID_HOME 环境变量值&#xff1a;D:\Android\android-sdk 环境变量名称&#xff1a;ANDRO…

海外媒体发稿:法新社发稿7种吸引住读者的文章标题

写一篇科谱详细介绍文章内容在现代的媒体环境中&#xff0c;吸引住读者成为了一个重要的考验。彭博社做为国际知名的财经资讯组织&#xff0c;经过多年实践活动总结出七种吸引住读者的差异表达形式。本文将对这七种形式进行科谱详细介绍&#xff0c;可以帮助读者更好地了解并应…

星地多网融合调度平台:高效融合,智慧救援

在应急救援领域&#xff0c;通信的畅通无阻是保障救援行动成功的关键。然而&#xff0c;面对复杂多变的救援环境和多样化的通信需求&#xff0c;传统的通信系统往往难以满足现代应急救援的高标准要求。为了克服这些挑战&#xff0c;星地多网融合调度平台应运而生&#xff0c;它…

MySQL-进阶篇-索引

文章目录 1. 准备工作2. 索引概述2.1 什么是索引2.2 索引的优缺点 3. 索引的结构3.1 索引结构介绍3.2 二叉树3.3 BTree3.4 BTree3.5 MySQL 中的 BTree3.6 Hash3.7 思考题&#xff1a;为什么 InnoDB 存储引擎选择使用 BTree 索引结构 4. 索引的分类5. 索引的语法5.1 创建索引5.2…

数字营销中的人工智能 --- 完整指南 (By Hubspot)

原文作者&#xff1a;Rebecca Riserbato 原文发布日期&#xff1a;2024年3月7日 翻译和编辑&#xff1a;数字化营销工兵 【引言】 ChatGPT和谷歌巴德已经加入聊天。如果你还没有加入数字营销中关于人工智能&#xff08;AI&#xff09;的对话&#xff0c;你就错过了这个营销…

ElasticSearch数据建模

文章目录 如何处理关联关系避免过多字段避免正则/通配符/前缀查询避免空值引起的聚合不准为索引的Mapping加入Meta 信息 如何处理关联关系 Object: 优先考虑反范式&#xff08;Denormalization&#xff09; Nested: 当数据包含多数值对象&#xff0c;同时有查询需求 Child/Pa…

宝塔面板如何修改域名和网站名

目录 前言修改域名修改网站名 前言 BT宝塔面板是一款安全高效的服务器运维平台&#xff0c;windows和Linux系统都可以使用&#xff0c;安装也简单&#xff0c;相信很多开发者都在用它。 但当我们创建的网站需要更换新的域名&#xff0c;面板中的网站名官方却没有给修改的地方&…

DETR论文,基于transformer的目标检测网络 DETR:End-to-End Object Detection with Transformers

transformer的基本结构: encoder-decoder的基本流程为&#xff1a; 1&#xff09;对于输入&#xff0c;首先进行embedding操作&#xff0c;即将输入映射为向量的形式&#xff0c;包含两部分操作&#xff0c;第一部分是input embedding&#xff1a;例如&#xff0c;在NLP领域&…

动作捕捉与数字人实时交互实训室解决方案:赋能数字人微专业实践课程

随着近年来虚拟现实技术产业与元宇宙数字人产业不断发展&#xff0c;就业市场对元宇宙、影视动画、游戏、艺术创作、舞台特效、虚拟数字人、虚拟主播等行业具备相关技能人才的需求增加&#xff0c;面向数字媒体艺术设计、影视多媒体技术、广告设计与制作、电子商务、广播电视新…

【论文阅读】BoT-SORT: Robust Associations Multi-Pedestrian Tracking

题目&#xff1a;BoT-SORT: Robust Associations Multi-Pedestrian Tracking 作者&#xff1a;Nir Aharon* Roy Orfaig Ben-Zion Bobrovsky motivation: 作者来得很直接&#xff0c;就说他们用相机运动模型和优化卡尔曼做了个可以解决具有挑战的跟踪问题的算法:BOT-SORT;说他们…

Ubuntu22.04安卓编译环境搭建及so库编译

1.配置Android-ARM64开发环境工具链: vim ~/.profile 或者 ~/.bashrc 或者 /etc/profile 编辑环境变量文件 输入下面内容 export CROSS_TRIPLE=aarch64-linux-android export CROSS_ROOT=/usr/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}…

【人工智能】数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 点击蓝字 关注我们 1 Habitat Platform 发布方&#xff1a; Facebook AI Research西蒙菲莎大学佐治亚理工学院Facebook Reality LabsIntel LabsUniversity of California, Berkeley…

20条项目经理成功经验,助你玩转项目管理软件

项目管理软件是现代项目管理不可或缺的工具&#xff0c;但仅仅掌握软件操作并不足以让你成为一名成功的项目经理。你需要的是经验和技巧&#xff0c;将软件的功能与实际项目管理相结合&#xff0c;才能真正发挥其优势。本文将分享20条项目经理成功经验&#xff0c;助你玩转项目…

基于华为atlas的皮带跑偏、空载、堆煤、启停探索

生乎吾前&#xff0c;其闻道也固先乎吾&#xff0c;吾从而师之&#xff1b;生乎吾后&#xff0c;其闻道也亦先乎吾&#xff0c;吾从而师之。吾师道也&#xff0c;夫庸知其年之先后生于吾乎&#xff1f;是故无贵无贱&#xff0c;无长无少&#xff0c;道之所存&#xff0c;师之所…

[C#]实现GRPC通讯的服务端和客户端实例

最近要做两个软件之间消息的通讯&#xff0c;学习了一下GRPC框架的通讯。根据官方资料做了一个实例。 官方资料请参考&#xff1a;Create a .NET Core gRPC client and server in ASP.NET Core | Microsoft Learn 开发平台&#xff1a;Visual Studio 2022 开发前提条件&#x…

图像识别,图片线条检测

import cv2 import numpy as np # 读取图片 img cv2.imread(1.png)# 灰度化 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 边缘检测 edges cv2.Canny(gray, 100, 200) 当某个像素点的梯度强度低于 threshold1 时&#xff0c;该像素点被认为是非边缘&#xff1b;当梯度强度…

达梦数据库版本介绍

达梦数据库根据不同用户的不同需求&#xff0c;提供了三种版本的数据库&#xff1a;DM Standard Edition 标准版、DM Enterprise Edition 企业版、DM Security Edition 安全版。那么这三种版本有什么区别&#xff0c;我们该如何选择合适的版本&#xff1f;下面先介绍三种版本各…

language model

1、language model&#xff08;LM&#xff09;&#xff1a;估计token序列的可能性 2、对于HMM&#xff0c;固定需要P(Y)才符合公式&#xff1b;对于LAS&#xff0c;加上P(Y)能够使效果更好 P(Y|X)需要成对的数据&#xff0c;而P(Y)不需要成对&#xff0c;所以可以得到很多数据 …