机器人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)


 

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

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

相关文章

ctfshow web93-98

web93 打开环境是一个代码审计题目 简单分析就是输入一个变量num&#xff0c;其值不能等于4476与包含字母&#xff0c;但是他的值需要为4476 函数intval作用为获取变量的整数值&#xff0c;第二个参数的意思是进制&#xff0c;默认为10进制。题目参数为0&#xff0c;就根据变…

享元模式(C++)

定义 运用共享技术有效地支持大量细粒度的对象。 使用场景 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍…

立即开始使用 3D 图像

一、说明 这个故事介绍了使用这种类型的数据来训练机器学习3D模型。特别是&#xff0c;我们讨论了Kaggle中可用的MNIST数据集的3D版本&#xff0c;以及如何使用Keras训练模型识别3D数字。 3D 数据无处不在。由于我们希望构建AI来与我们的物理世界进行交互&#xff0c;因此使用3…

8月9日上课内容 nginx负载均衡

负载均衡工作当中用的很多的&#xff0c;也是面试会问的很重要的一个点 负载均衡&#xff1a;通过反向代理来实现&#xff08;nginx只有反向代理才能做负载均衡&#xff09; 正向代理的配置方法&#xff08;用的较少&#xff09; 反向代理的方式&#xff1a;四层代理与七层代…

【多重信号分类】超分辨率测向方法——依赖于将观测空间分解为噪声子空间和源/信号子空间的方法具有高分辨率(HR)并产生准确的估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

牛客小白月赛75C题题解

文章目录 方豆子问题建模问题分析代码 方豆子 问题建模 给定一个整数n&#xff0c;要求输出n级好豆豆&#xff0c;n级好豆豆由3个n-1级好豆豆和1个n-1级坏豆豆组成&#xff0c;已经给出了1级好豆豆和1级坏豆豆。 问题分析 由于最终的豆豆是由其上一级的豆豆产生的&#xff0…

单片机外部晶振故障后自动切换内部晶振——以STM32为例

单片机外部晶振故障后自动切换内部晶振——以STM32为例 作者日期版本说明Dog Tao2023.08.02V1.0发布初始版本 文章目录 单片机外部晶振故障后自动切换内部晶振——以STM32为例背景外部晶振与内部振荡器STM32F103时钟系统STM32F407时钟系统 代码实现系统时钟设置流程时钟源检测…

ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用全流程科研能力提升

查看原文>>>ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合能力 本文将利用ArcGIS Pro 将您的 GIS 工作组织到工程中&#xff0c;您可以使用 ArcGIS Pro 映射 2D 和 3D 数据。借助 ArcGIS Pro&#xff…

float 属性的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ float 是什么&#xff1f;⭐ float 属性值⭐ 使用 float 的注意事项&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门…

力扣hot100刷题记录

二刷hot100&#xff0c;坚持每天打卡&#xff01;&#xff01;&#xff01; 1. 两数之和 // 先求差&#xff0c;再查哈希表 public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map new HashMap<>();for(int i 0;i<nums.length;i){int key …

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验四 蜂鸣器

目录 前言 一、原理图及知识点介绍 1.1、蜂鸣器原理图&#xff1a; 二、代码分析 前言 第一个实验:51单片机&#xff08;普中HC6800-EM3 V3.0&#xff09;实验例程软件分析 实验一 点亮第一个LED_ManGo CHEN的博客-CSDN博客 第二个实验:51单片机&#xff08;普中HC6800-EM…

《2023年中国企业数字化转型发展白皮书》发布

导读 本报告主要采用市场调查、行业深度访谈、桌面研究等方法&#xff0c;并使用艾媒咨询旗下各大数据计算系统和相关计算模型。 对部分相关的公开信息进行筛选&#xff0c;通过对行业专家、相关企业与网民进行深度访谈&#xff0c;了解相关行业主要情况&#xff0c;获得相应…

解决Qt的列表加载大量数据卡顿的问题

问题概述 本人在使用QListView插入大量数据时&#xff0c;界面卡顿十分严重。数据量大概只有上千左右&#xff0c;但是每个Item的内容比较多。当数据不停地插入一段时间后&#xff0c;卡顿到鼠标的移动都有点困难。 解决思路 QListView是典型的MVC思想的产物。界面呈现出来的数…

创建型模式-单例模式

文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现&#xff08;1&#xff09;饿汉式-方式1&#xff08;静态变量方式&#xff09;&#xff08;2&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;&#xff08;3&#xff09;懒汉式-方…

vue+element 下载压缩包和导出

export function goodsInspectionReportDwnloadZip (params) {return axios({url: "/warehouse-entry-server/v1/goodsInspectionReport/downloadZip",method: "get",params,responseType: "blob"}) } //下载handleDownloadFile() {if (!this.$r…

AMBA总线(AHB)

1.AMBA AMBA(Advanced Microcontroller Bus Architecture)高级微控制器总线结构&#xff0c;定义了用于设计高性能嵌入式微控制器的片上通信标准。   AMBA规范中定义了三种不同的总线&#xff1a;   &#xff08;1&#xff09;高级高性能总线&#xff08;Advanced High-per…

基于nodejs+vue+uniapp微信小程序的短视频分享系统

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 3.1小程序端 用户注册页面&#xff0c;输入用户的个人信息点击注册即可。 注册完成后会返回到登录页面&#xff0c;用户输入自己注…

无人车沿着指定线路自动驾驶与远程控制的实践应用

有了前面颜色识别跟踪的基础之后&#xff0c;我们就可以设定颜色路径&#xff0c;让无人车沿着指定线路做自动驾驶了&#xff0c;视频&#xff1a;PID控制无人车自动驾驶 有了前几章的知识铺垫&#xff0c;就比较简单了&#xff0c;也是属于颜色识别的一种应用&#xff0c;主要…

神码ai火车头伪原创设置【php源码】

大家好&#xff0c;给大家分享一下python编写学生信息管理系统的学生信息保存在哪里&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 要求描述&#xff1a; 学生的信息包括&#xff1a;学号&#…

蓝牙资讯|苹果发布AirPods最新开发者固件,最新功能引人关注

苹果面向 AirPods 耳机发布了开发者固件更新 AirPods 6.0 Beta 3&#xff0c;最新内部版本号为 6A5289c。 本次更新适用于 AirPods 3、AirPods Pro 2 和 AirPods Max&#xff0c;不过并非所有 AirPods 耳机都获得了更新。包含5 种新功能 / 新特性&#xff1a; 自适应音频&am…