很多课程先讲C/C++或者一些其他编程课,称之为基础课程。然后到本科高年级进行机器人专业课学习,这样时间损失非常大,效率非常低。
C++/单片机/嵌入式/ROS等这些编程基础可以合并到一门课中进行实现,这些素材已经迭代三轮以上,全部公开,需要可以参考,不需要,我就当写给自己的^_^感谢大家一直以来的帮助、支持和鼓励。
html
https://www.lanqiao.cn/courses/854
适用于
- C++ 11 14 17 20......
- Arduino UNO DUE ESP8266 ESP32......
- ARM......
- ROS1 kinetic melodic noetic......
- ROS2 foxy humble......
素材只公开部分,主要原因是内容太多......
C++
cpp
#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;
,因此你需要使用完整的标准库名称。
以下是修改后的代码:
cpp
#include <iostream>
int main()
{
Serial.print("Hello World !");
return 0;
}
注意:该代码在Arduino IDE中可能无法直接运行。Arduino IDE主要用于微控制器编程,它与标准的C++编译器有所不同。要在Arduino IDE中打印"Hello World!",你可以使用以下代码:
cpp
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello World!");
delay(1000);
}
上述代码将在打开串行连接后立即打印"Hello World!",然后等待1秒钟,并重复此过程。这是Arduino IDE中常见的串行通信方式。
ROS1
在ROS1中,你可以使用ROS_INFO
函数来替代cout
进行消息输出。下面是将代码改写为使用ROS_INFO
的示例:
cpp
#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
宏的示例:
cpp
#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
cpp
#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话题。让我们详细解释一下代码的各个部分:
#include <ros.h>
: 这是包含ROS框架的头文件。#include <std_msgs/String.h>
: 这是包含标准消息类型(Standard Message Types)中字符串消息的头文件。在ROS中,消息是用于在节点之间传递数据的自定义数据类型。ros::NodeHandle nh;
: 创建一个ROS节点句柄对象。节点句柄是用于与ROS系统进行交互的主要接口。std_msgs::String str_msg;
: 创建一个字符串消息对象,该对象将用于发布消息。ros::Publisher chatter("chatter", &str_msg);
: 创建一个发布者对象,该对象将用于发布消息到名为"chatter"的话题。char hello[13] = "hello world!";
: 创建一个字符数组,存储字符串"hello world!"。void setup()
: 定义一个名为"setup"的函数,该函数将在节点初始化时执行一次。nh.initNode();
: 初始化节点。nh.advertise(chatter);
: 宣布发布者,使节点开始监听名为"chatter"的话题,并准备发布消息。void loop()
: 定义一个名为"loop"的函数,该函数将在节点运行时不断执行。str_msg.data = hello;
: 将字符串"hello world!"赋值给消息对象的数据字段。chatter.publish( &str_msg );
: 发布消息到"chatter"话题。nh.spinOnce();
: 轮询一次消息队列,以接收来自其他节点的消息。delay(1000);
: 延迟1秒钟,然后重复执行循环。
总体来说,这段代码创建了一个简单的ROS节点,它不断发布包含字符串"hello world!"的消息到名为"chatter"的话题。
M5ATOMS3基础03给ROS1发一个问候(rosserial)
ROS2 & Arduino
M5ATOMS3基础04给ROS2发一个问候(micro-ROS)