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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

脚本一键生成通用接口,一分钟实现增删改查

直接使用无需看此配置 快速生成通用接口业务配置 &#xff1a; https://blog.zysicyj.top/2023/08/14/快速生成通用接口业务配置 一、插件安装 二、脚本 关注绿色聊天软件【程序员朱永胜】回复&#xff1a;1013 下载 三、使用 拷贝到扩展目录下 修改mybatisCodehelper.vm 修改i…

说一下什么是tcp的2MSL,为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?

1.TCP之2MSL 1.1 MSL MSL:Maximum Segment Lifetime报文段最大生存时间&#xff0c;它是任何报文段被丢弃前在网络内的最长时间 1.2为什么存在MSL TCP报文段以IP数据报在网络内传输&#xff0c;而IP数据报则有限制其生存时间的TTL字段&#xff0c;并且TTL的限制是基于跳数 1.3…

mysql中在有数据的表中新增一个主键处理方案

需求&#xff1a;因为业务需要修改表中原来的主键为新增的字段&#xff1b; 处理方案&#xff1a; 1、先将表名修改一下&#xff1b; 2、新增一个一样的表结构&#xff0c;表名与原表名一致&#xff0c;多了一个主键&#xff08;自增&#xff09;的字段&#xff1b; 3、把原…

ubuntu中安装python

最简单方便的是 apt 使用第三方的 ppa 源&#xff0c;然后直接 apt 安装 python3.9 安装 software-properties-common 获取add-apt-repository命令&#xff1a;apt install -y software-properties-common添加第三方的 ppa 源&#xff1a;add-apt-repository ppa:deadsnakes/p…

【一场专属于开发者的盛会!】------NPCon2023 AI模型技术与应用峰会(北京站)

2023年8月12日&#xff0c;由CSDN官方举办的2023年-NPCon2023 AI模型技术与应用峰会(北京站)在北京格兰云天大酒店荣重召开&#xff01; 话不多说&#xff01;上图~~~ 目录 【会议展望】 【大咖宣讲】 【CSDN活动介绍】 【开谈环节&#xff0c;我有句话说】 【现场人气】…

简单入门seleniumUI自动化测试

目录 一、selenium的介绍 二、selenium的原理 三、selenium的八种元素定位的方法 1、ID定位&#xff1a; 2 、name定位&#xff1a; 3、class定位&#xff1a; 4、tag定位&#xff1a; 5、link_text定位&#xff1a; 6、partial_link_text定位&#xff1a; 7、css定位…

【UniApp开发小程序】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面首页让文字只显示两行路由跳转传递对象将商品分为两列显示使用中划线划掉原价 后端商品controllerservicemappersql 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除关于商品分类页面的实现&#xff0c;请在我…

基于 ObjectOutputStream 实现 对象与二进制数据 的序列化和反序列化

目录 为什么要进行序列化呢&#xff1f; 如何实现 对象与二进制数据 的序列化和反序列化&#xff1f; 为什么要进行序列化呢&#xff1f; 主要是为了把一个对象&#xff08;结构化的数据&#xff09;转化成一个 字符串 / 字节数组&#xff0c;方便我们存储&#xff08;有时候需…

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-01入门&#xff09; 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

海量数据迁移,亚马逊云科技云数据库服务为大库治理提供新思路

1.背景 目前&#xff0c;文档型数据库由于灵活的schema和接近关系型数据库的访问特点&#xff0c;被广泛应用&#xff0c;尤其是游戏、互联网金融等行业的客户使用MongoDB构建了大量应用程序&#xff0c;比如游戏客户用来处理玩家的属性信息&#xff1b;又如股票APP用来存储与时…

SpringBoot复习:(44)MyBatisAutoConfiguration

可以看到MyBatisAutoConfiguration引入了MyBatisProperties这个属性&#xff1a; MyBatisAutoConfiguration中配置了一个SqlSessionFactoryBean,代码如下&#xff1a; 可以配置mybatis-config.xml,需要配置文件里指定&#xff1a; mybatis.config-locationclasspath:/mybat…

【环境配置】Windows 10 安装 PyTorch 开发环境,以及验证 YOLOv8

Windows 10 安装 PyTorch 开发环境&#xff0c;以及验证 YOLOv8 最近搞了一台Windows机器&#xff0c;准备在上面安装深度学习的开发环境&#xff0c;并搭建部署YOLOv8做训练和测试使用&#xff1b; 环境&#xff1a; OS&#xff1a; Windows 10 显卡&#xff1a; RTX 3090 安…

笔记04:全局内存

一、CUDA内存模型概述 寄存器、共享内存、本地内存、常量内存、纹理内存和全局内存 一个核函数中的线程都有自己私有的本地内存。 一个线程块有自己的共享内存&#xff0c;对同一个线程块中所有的线程都可见&#xff0c;其内容持续线程块的整个生命周期。 所有线程都可以访问…

【LeetCode动态规划#】完全背包问题实战(单词拆分,涉及集合处理字符串)

单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a; 输入: s "l…

手把手教你 Vue3 + vite + Echarts 5 +TS 绘制中国地图,看完就会

废话不多说&#xff0c;看图&#xff01; 本篇文章介绍 Vue3 vite TS 项目内使用 Echarts 5 绘制中国地图&#xff0c;标记分布点&#xff01;之前没有接触过 Echarts 的&#xff0c;可以先去官方示例看看&#xff0c;里面图形特别齐全。但是官方文档看着费劲的&#xff0c;太…

铁是地球科学争论的核心

一项新的研究调查了地球内部铁的形态。这些发现对理解内核的结构产生了影响。 一项新的研究探索了地球内核的铁结构&#xff0c;如图中的黄色和白色所示。 资料来源&#xff1a;地球物理研究快报 地球内核以铁为主&#xff0c;铁可以多种晶体形式作为固体材料存在。&#xff08…

html css实现爱心

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…

JVM 内存结构快速入门

文章目录 一、简介二、JVM内存区域2.1 方法区2.3.2 永久代和元空间 2.2 堆2.1.2 对象的创建和销毁 2.2 栈内存2.2.1 栈帧的组成和作用2.2.2 栈的特点 2.4 程序计数器2.4.1 程序计数器的作用和使用场景 一、简介 Java 内存模型&#xff08;Java Memory Model&#xff0c;JMM&…

docker发展历史

docker 一、docker发展历史很久以前2013年2014年2015年2016年2017年2018年2019年及未来 二、 docker概述定义&#xff1a;docker底层运行原理:docker简述核心概念容器特点Docker与虚拟机的区别: 三、容器在内核中支持两种重要技术四、namespace的六项隔离五、虚拟化产品有哪些1…

CTFshow 限时活动 红包挑战7、红包挑战8

CTFshow红包挑战7 写不出来一点&#xff0c;还是等了官方wp之后才复现。 直接给了源码 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd…