当前位置: 首页 > 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)


http://www.lryc.cn/news/123432.html

相关文章:

  • 前后端分离------后端创建笔记(03)前后端对接(下)
  • Leet code1049 最后一块石头的重量II
  • Rust语法:变量,函数,控制流,struct
  • LVS简介及LVS-DR搭建
  • Java基础篇--日期时间类
  • Vue生命周期函数 详解
  • 判断链表有环的证明
  • 百度屏蔽词有哪些?其中就有移民关键词指数被屏蔽?
  • 代码随想录day02
  • VR时代真的到来了?
  • docker run 命令转化为 docker-compose 工具
  • php如何对接伪原创api
  • 设计模式行为型——模板模式
  • 12.Eclipse导入Javaweb项目
  • 探索自动化网页交互的魔力:学习 Selenium 之旅【超详细】
  • css常用样式和不常用样式
  • 【小练习】交互式网格自定义增删改错误记录及解决(进行中)
  • 云渲染效果不对?云渲染前的四个细节表明你的问题出在这里!
  • 翻转二叉树
  • 检测新突破 | AlignDet:支持各类检测器自监督新框架(ICCV2023)
  • 03.Show and Tell
  • QStackedWidget 的使用
  • 大数据--难点--地图的制作
  • 【AI作画】使用Stable Diffusion的艺术二维码完全生成攻略
  • SQLAlchemy------更多查询
  • 13-数据结构-串以及KMP算法,next数组
  • Stable Diffusion - 俯视 (from below) 拍摄的人物图像 LoRA 与配置
  • Redis——String类型详解
  • Android:换肤框架Android-Skin-Support
  • 软件测试面试心得:四种公司、四种问题…