当前位置: 首页 > news >正文

机器人CPP编程基础-01第一个程序Hello World

很多课程先讲C/C++或者一些其他编程课,称之为基础课程。然后到本科高年级进行机器人专业课学习,这样时间损失非常大,效率非常低。

C++/单片机/嵌入式/ROS等这些编程基础可以合并到一门课中进行实现,这些素材已经迭代三轮以上,全部公开,需要可以参考,不需要,我就当写给自己的^_^感谢大家一直以来的帮助、支持和鼓励。

https://www.lanqiao.cn/courses/854

适用于

  1. C++ 11 14 17 20……
  2. Arduino UNO DUE ESP8266 ESP32…… 
  3. ARM……
  4. ROS1 kinetic melodic noetic……
  5. ROS2 foxy humble……

素材只公开部分,主要原因是内容太多…… 


C++

#include<iostream>
using namespace std;main()
{cout<<"Hello World !";
}

这是一个使用C++语言编写的简单的程序。让我用中文为你详细解释一下:

首先,#include<iostream>是一个预处理指令,告诉编译器在程序运行之前要包含iostream文件。iostream文件包含了我们需要进行输入/输出操作的函数和对象。

然后,using namespace std;告诉编译器我们打算使用std命名空间。这是因为iostream文件中的函数和对象都在std命名空间中。

接下来是main()函数,这是C++程序的入口点。当你运行程序时,main函数就会被调用。

在main函数中,我们使用cout来输出一条消息,即"Hello World !"。cout是一个流对象,它表示标准输出(通常是显示器)。在这里,我们使用cout对象来发送一个字符串(即"Hello World !")到标准输出。

总的来说,这个程序的作用就是输出一条"Hello World !"的消息。


Arduino

在Arduino IDE中,使用C++编程语言,你需要使用Serial.print()Serial.println()函数来输出到串行端口,而不是cout。此外,Arduino IDE不支持using namespace std;,因此你需要使用完整的标准库名称。

以下是修改后的代码:

#include <iostream>  int main()  
{  Serial.print("Hello World !");  return 0;  
}

注意:该代码在Arduino IDE中可能无法直接运行。Arduino IDE主要用于微控制器编程,它与标准的C++编译器有所不同。要在Arduino IDE中打印"Hello World!",你可以使用以下代码:

void setup() {  Serial.begin(9600);  
}  void loop() {  Serial.println("Hello World!");  delay(1000);  
}

上述代码将在打开串行连接后立即打印"Hello World!",然后等待1秒钟,并重复此过程。这是Arduino IDE中常见的串行通信方式。 

M5ATOMS3基础01按键


ROS1

在ROS1中,你可以使用ROS_INFO函数来替代cout进行消息输出。下面是将代码改写为使用ROS_INFO的示例:

#include <ros/ros.h>  int main(int argc, char **argv)  
{  ros::init(argc, argv, "my_node");  ros::NodeHandle nh;  ROS_INFO("Hello World !");  return 0;  
}

在上述代码中,我们包含了ros/ros.h头文件,这是ROS1中的主要头文件。然后,我们使用ros::init函数初始化ROS节点,并创建一个节点句柄(ros::NodeHandle)。接下来,我们使用ROS_INFO函数输出"Hello World !"消息。

请注意,你需要将此代码与ROS1环境一起编译和运行,以确保正确地处理ROS的相关功能和消息传递。


ROS2

能否快速独立完成???

在ROS2中,你可以使用rclcpp库中的RCL_INFO宏来替代cout进行消息输出。下面是将代码改写为使用RCL_INFO宏的示例:

#include <rclcpp/rclcpp.hpp>  int main(int argc, char **argv)  
{  rclcpp::init(argc, argv);  rclcpp::Node::SharedPtr node = rclcpp::Node::make_shared("my_node");  rclcpp::Rate rate(1);  // 设置一个频率为1Hz的定时器  while (rclcpp::ok()) {  node->get_logger().info("Hello World !");  // 使用RCL_INFO宏输出消息  rate.sleep();  // 等待一段时间以保持1Hz的频率  }  rclcpp::shutdown();  // 关闭ROS节点  return 0;  
}

在上述代码中,我们首先包含了rclcpp/rclcpp.hpp头文件。然后,我们使用rclcpp::init函数初始化ROS节点。接下来,我们创建一个共享的节点句柄,并设置一个频率为1Hz的定时器。在循环中,我们使用RCL_INFO宏将"Hello World !"消息输出到ROS系统的日志中。然后,我们通过调用rate.sleep()来等待一段时间,以保持1Hz的频率。最后,我们使用rclcpp::shutdown()函数关闭ROS节点。

请注意,你需要将此代码与ROS2环境一起编译和运行,以确保正确地处理ROS的相关功能和消息传递。


ROS1 & Arduino

#include <ros.h>
#include <std_msgs/String.h>ros::NodeHandle nh;std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);char hello[13] = "hello world!";void setup()
{nh.initNode();nh.advertise(chatter);
}void loop()
{str_msg.data = hello;chatter.publish( &str_msg );nh.spinOnce();delay(1000);
}

这段代码是一个简单的ROS(Robot Operating System)节点,它使用C++编写。ROS是一个用于编写机器人软件的框架,它支持多种编程语言,包括C++、Python和Java等。

代码的主要功能是发布一个包含字符串“hello world!”的消息到名为“chatter”的ROS话题。让我们详细解释一下代码的各个部分:

  1. #include <ros.h>: 这是包含ROS框架的头文件。
  2. #include <std_msgs/String.h>: 这是包含标准消息类型(Standard Message Types)中字符串消息的头文件。在ROS中,消息是用于在节点之间传递数据的自定义数据类型。
  3. ros::NodeHandle nh;: 创建一个ROS节点句柄对象。节点句柄是用于与ROS系统进行交互的主要接口。
  4. std_msgs::String str_msg;: 创建一个字符串消息对象,该对象将用于发布消息。
  5. ros::Publisher chatter("chatter", &str_msg);: 创建一个发布者对象,该对象将用于发布消息到名为“chatter”的话题。
  6. char hello[13] = "hello world!";: 创建一个字符数组,存储字符串“hello world!”。
  7. void setup(): 定义一个名为“setup”的函数,该函数将在节点初始化时执行一次。
  8. nh.initNode();: 初始化节点。
  9. nh.advertise(chatter);: 宣布发布者,使节点开始监听名为“chatter”的话题,并准备发布消息。
  10. void loop(): 定义一个名为“loop”的函数,该函数将在节点运行时不断执行。
  11. str_msg.data = hello;: 将字符串“hello world!”赋值给消息对象的数据字段。
  12. chatter.publish( &str_msg );: 发布消息到“chatter”话题。
  13. nh.spinOnce();: 轮询一次消息队列,以接收来自其他节点的消息。
  14. delay(1000);: 延迟1秒钟,然后重复执行循环。

总体来说,这段代码创建了一个简单的ROS节点,它不断发布包含字符串“hello world!”的消息到名为“chatter”的话题。

M5ATOMS3基础03给ROS1发一个问候(rosserial)


ROS2 & Arduino

M5ATOMS3基础04给ROS2发一个问候(micro-ROS)


相关文章:

机器人CPP编程基础-01第一个程序Hello World

很多课程先讲C/C或者一些其他编程课&#xff0c;称之为基础课程。然后到本科高年级进行机器人专业课学习&#xff0c;这样时间损失非常大&#xff0c;效率非常低。 C/单片机/嵌入式/ROS等这些编程基础可以合并到一门课中进行实现&#xff0c;这些素材已经迭代三轮以上&#xf…...

前后端分离------后端创建笔记(03)前后端对接(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…...

Leet code1049 最后一块石头的重量II

1049 最后一块石头的重量II 【问题描述】 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉…...

Rust语法:变量,函数,控制流,struct

文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop & whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量 可变与不可变变量 Rust中使用let来声明变量&#xff0c;但是let声明的是不可变变量&#x…...

LVS简介及LVS-DR搭建

目录 一. LVS简介&#xff1a; 1.简介 2. LVS工作模式&#xff1a; 3. LVS调度算法&#xff1a; 4. LVS-DR集群介绍&#xff1a; 二.LVS-DR搭建 1.RS配置 1&#xff09;两台RS&#xff0c;需要下载好httpd软件并准备好配置文件 2&#xff09;添加虚拟IP&#xff08;vip&…...

Java基础篇--日期时间类

目录 前言 Instant&#xff08;时间戳&#xff09;类 LocalData(日期)类 LocalTime(时间)类 LocalDataTime(日期时间)类 Duration(时间间隔)类 Period(日期间隔)类 Clock&#xff08;获取时区&#xff09;类 前言 在开发中经常需要处理日期和时间&#xff0c;Java提供…...

Vue生命周期函数 详解

以下是Vue生命周期函数的流程图和每个周期的代码详解&#xff1a; 流程图&#xff1a; beforeCreate -> created -> beforeMount -> mounted -> beforeUpdate -> updated -> beforeDestroy -> destroyed详解&#xff1a; beforeCreate&#xff1a; 触发时…...

判断链表有环的证明

目录 1.问题 2.证明 3.代码实现 1.问题 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用…...

百度屏蔽词有哪些?其中就有移民关键词指数被屏蔽?

我是百收网SEO&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 今日tombkeeper消息爆料&#xff1a;百度指数已经屏蔽“移民”等关键词指数。 大家好&#xff0c;我是百收网SEO商学院的狂潮微课老师&#xff0c;今天我们来讲解第 12 节课关键词优化难度分析…...

代码随想录day02

977.有序数组的平方 ● 力扣题目链接 ● 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 思路 ● 暴力排序&#xff0c;时间复杂度O(n nlogn) ● 使用双指针&#xff0c;时间复杂度O(n) …...

VR时代真的到来了?

业界对苹果的期待是&#xff0c;打造一台真正颠覆性的&#xff0c;给头显设备奠定发展逻辑底座的产品&#xff0c;而实际上&#xff0c;苹果只是发布了一台更强大的头显。 大众希望苹果回答的问题是“我为什么需要一台AR或者VR产品&#xff1f;”&#xff0c;但苹果回答的是“…...

docker run 命令转化为 docker-compose 工具

工作当中需要将 docker run 转换为更方便的 docker-compose 格式&#xff0c;可以使用下面的工具来完成。 转换工具&#xff1a;https://www.composerize.com/?utm_sourceappinn.com 使用介绍&#xff1a;https://www.appinn.com/composerize-for-docker-compose/...

php如何对接伪原创api

在了解伪原创api的各种应用形态之后&#xff0c;我们继续探讨智能写作背后的核心技术。需要说明的是&#xff0c;智能写作和自然语言生成、自然语言理解、知识图谱、多模算法等各类人工智能算法都有紧密的关联&#xff0c;在百度的智能写作实践中&#xff0c;常根据实际需求将多…...

设计模式行为型——模板模式

目录 模板模式的定义 模板模式的实现 模板模式角色 模板模式类图 模板模式举例 模板模式代码实现 模板模式的特点 优点 缺点 使用场景 注意事项 实际应用 模板模式的定义 模板模式&#xff08;Template Pattern&#xff09;属于行为型设计模式&#xff0c;又叫模版…...

12.Eclipse导入Javaweb项目

同事复制一份他的项目给我ekp.rar (懒得从SVN上拉取代码了)放在workspace1目录下 新建一个文件夹 workspace2&#xff0c;Eclipse切换到workspace2工作空间 选择Import导入 选择导入的项目(这里是放到workspace1里面) 拷贝一份到workspace2里面 例子 所有不是在自己电脑上开发…...

探索自动化网页交互的魔力:学习 Selenium 之旅【超详细】

"在当今数字化的世界中&#xff0c;网页自动化已经成为了不可或缺的技能。想象一下&#xff0c;您可以通过编写代码&#xff0c;让浏览器自动执行各种操作&#xff0c;从点击按钮到填写表单&#xff0c;从网页抓取数据到进行自动化测试。学习 Selenium&#xff0c;这一功能…...

css常用样式和不常用样式

文章目录 1、hover鼠标变小手2、ul去除点3、文字溢出显示省略号&#xff08;1&#xff09;一行文字溢出显示省略号&#xff08;2&#xff09;多行文字溢出显示省略号 4、文字单词超出&#xff08;1&#xff09;文字单词超出换行&#xff08;word-wrap&#xff09;&#xff08;2…...

【小练习】交互式网格自定义增删改错误记录及解决(进行中)

经过之前的学习&#xff0c;已经能创建简单的交互式网格并设置自定义增删改按钮&#xff0c;但是实现上还是存在一些问题&#xff0c;来完善优化一下。 首先是修改&#xff0c;正常修改都会弹出修改框&#xff0c;里面是之前存储的信息&#xff0c;根据实际需要对其进行修改&a…...

云渲染效果不对?云渲染前的四个细节表明你的问题出在这里!

云渲染针对3D渲染行业&#xff0c;帮助本地电脑解决渲染慢的问题&#xff0c;大幅提高设计师的工作效率。但小编发现&#xff0c;有不少小伙伴在使用云渲染时&#xff0c;出现了渲染效果不对或丢失的问题&#xff0c;根据小伙伴们的问题和我们创意云云渲染平台给出的解决方案&a…...

翻转二叉树

声明 该系列文章仅仅展示个人的解题思路和分析过程&#xff0c;并非一定是优质题解&#xff0c;重要的是通过分析和解决问题能让我们逐渐熟练和成长&#xff0c;从新手到大佬离不开一个磨练的过程&#xff0c;加油&#xff01; 原题链接 翻转二叉树备战技术面试&#xff1f;…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...