ロボット CPP プログラミングの基礎-01 最初のプログラム Hello World
基本的なコードは、人工知能ツールの助けを借りて学習できます。
C++
#include<iostream>
using namespace std;
main()
{
//Declaring an integer type variable A, allocates 4 bytes of memory.
int A=4;
cout<<A <<endl;
//Prints the address of the variable A.
cout<<&A <<endl;
/*
1. Variables cant have the same name.
2. Variable name cant start with a number.
3. Variable name should not contain spaces.
4. Variable name should be self-descriptive.
5. Variable name can't have special characters or keywords.
*/
//Re-initialization of A.
A=10;
cout<<A <<endl;
cout<<&A;
}
コードは基本的に次のことを行います。
- という名前の Integer 型の変数を宣言し
A
、 に初期化します4
。C++ では、int
型は通常 4 バイトのメモリ空間を占有します。 cout
ステートメントを 使用して 、A
変数の値を出力します。つまり4
、cout
ステートメント を使用してA
、変数のアドレス、つまりメモリ内の変数の位置を出力します。- 変数の命名に関するルールや注意事項がコメントとして記載されています。
A
変数の値を 再初期化します10
。- このステートメントを使用して 、
cout
変数A
の値を 再度出力します10
。 cout
最後に、ステートメントを 再度 使用して、A
変数のアドレスを出力します。
コードが解析されます。
基本コンセプト:
C++ 変数は、プログラムにデータを保存するためのメカニズムです。変数は、データの保存と操作に使用される識別子です。以下は C++ 変数の詳細な紹介です。
- 変数の名前付け: 変数名には文字、数字、アンダースコアを使用できますが、文字またはアンダースコアで始める必要があります。変数名には通常、キャメルケースまたはアンダースコア命名法が使用されます。
- 変数の型: 変数は、宣言時にその型を指定する必要があります。C++ には、整数、浮動小数点数、文字、ブール値などを含む多くの組み込み型があります。さらに、構造体、クラスなどのカスタム型を使用することもできます。
- 変数の宣言: C++ では、変数はプログラム内で使用される前に宣言する必要があります。宣言はコンパイラに変数の名前と型を伝え、コンパイラが変数にメモリ領域を割り当てる方法を認識できるようにします。
- 変数の割り当て: 変数を宣言した後、値に初期化する必要があります。代入演算子(=)を使用して変数に値を代入できます。
- 変数のスコープ: 変数のスコープとは、プログラム内の変数の可視性とライフサイクルを指します。C++ には、ローカルとグローバルの 2 種類のスコープがあります。ローカル スコープでは、変数の可視性と有効期間が、変数が定義されているコード ブロック内でのみ使用できるように制限されます。グローバル スコープにより、プログラム全体で変数が見えるようになります。
- 定数: 定数は、不変の値を表す特別なタイプの変数です。C++ では、
const
定数はキーワードを使用して宣言されます。 - 変数の型変換: C++では暗黙的な型変換と明示的な型変換を行うことができます。暗黙的な型変換は、整数を浮動小数点数に変換するなど、コンパイラがある型の値を別の型に自動的に変換するときに発生します。明示的な型変換では、型変換演算子 (例
static_cast
: 、dynamic_cast
など) を使用して、ある型の値を別の型に明示的に変換します。
上記は C++ 変数の詳細な紹介であり、これらの概念を習得することは、効率的な C++ プログラムを作成するために非常に重要です。
C++14 は C++ 言語の最新標準であり、変数に関するいくつかの新機能と改善が導入されています。C++14 の変数に関する詳細は次のとおりです。
-
auto キーワード: C++14 では、変数の型を自動的に推測する auto キーワードが導入されています。auto キーワードを使用すると、特に複雑な式やネストされたコンテナを使用する場合に、変数の型宣言が簡素化されます。
-
リストの初期化と変数宣言: C++14 はリストの初期化に中括弧 ({}) の使用をサポートしており、代入演算子を使用せずに初期値を変数に直接割り当てることができます。例えば:
cpp复制代码
int a = {10}; |
|
std::string str = {"Hello World"}; |
-
初期化リスト コンストラクター: C++14 では初期化リスト コンストラクターが導入されており、これにより、初期化リストを使用してクラス コンストラクター内のメンバー変数を初期化できるようになります。例えば:
cpp复制代码
class MyClass { |
|
public: |
|
MyClass(int a, int b) : m_a(a), m_b(b) {} |
|
private: |
|
int m_a; |
|
int m_b; |
|
}; |
- 一般化されたデリゲート式: C++14 では、一般化されたデリゲート式 (一般化されたデリゲート式) が導入され、より柔軟な式を使用してデリゲート式を構築できるようになります。
- 静的アサーション: C++14 では、コンパイル時に条件が満たされているかどうかを確認するために使用される静的アサーション (Static Assert) が導入されています。条件が満たされない場合、コンパイラはエラーまたは警告を生成します。
- 右辺値参照と移動セマンティクス: C++14 では、リソース管理とパフォーマンスを最適化するために、右辺値参照 (Rvalue Reference) と移動セマンティクス (Move Semantics) が導入されています。
上記は、C++14 の変数の詳細な紹介です。これらの新機能と改善により、コードの可読性とパフォーマンスが向上し、C++ がより現代的で柔軟になります。
C++20 は C++ 言語の最新標準であり、変数に関するいくつかの新機能と改善が導入されています。C++20 の変数の詳細を次に示します。
-
型推論と auto キーワード: C++20 では型推論の機能が拡張され、変数宣言時に変数名の型を省略して変数名のみを使用できるようになりました。これにより、コードがより簡潔で読みやすくなります。
cpp复制代码
auto x = 10; // 推断x的类型为int |
|
auto v = {1, 2, 3}; // 推断v的类型为std::initializer_list<int> |
-
構造化バインディング: C++20 では、構造化バインディング (構造化バインディング) が導入されており、構造体または共用体のメンバー変数を複数の変数に直接割り当てることができます。
cpp复制代码
struct Point { |
|
int x; |
|
int y; |
|
}; |
|
Point p; |
|
auto [x, y] = p; // 将p的x和y成员变量分配给x和y变量 |
-
範囲ベースの for ループ: C++20 では範囲ベースの for ループ (範囲ベースの for ループ) が導入され、コンテナまたは配列の要素を for ループ内で直接走査できるようになります。
cpp复制代码
int arr[] = {1, 2, 3, 4, 5}; |
|
for (int elem : arr) { |
|
// 直接访问arr的每个元素 |
|
std::cout << elem << std::endl; |
|
} |
- 初期化リスト コンストラクター: C++20 は引き続き初期化リスト コンストラクターをサポートし、クラス コンストラクターで初期化リストを使用してメンバー変数を初期化できるようにします。
- コンセプト キーワード: C++20 では、型の概念を定義し、テンプレート パラメーターの型を制約するために使用されるコンセプト キーワードが導入されました。これは、コードの読みやすさと保守性の向上に役立ちます。
- if constexpr と if let: C++20 では、コンパイル時の条件判断とパターン マッチングに使用される if constexpr と if let が導入されており、より簡潔で効率的なコードの作成に役立ちます。
- コルーチン: C++20 では、関数が実行中に実行を一時停止し、呼び出し元に制御を返し、特定の時点で実行を再開できるようにする制御フロー メカニズムであるコルーチン (Coroutines) が導入されています。コルーチンを使用すると、非同期プログラミングやジェネレーターなどの関数を実装できます。
上記は、C++20 の変数の詳細な紹介です。これらの新機能と改善により、コードの可読性とパフォーマンスがさらに向上し、C++ がより現代的で柔軟になります。
Arduino
int A = 4; // 声明一个整数类型的变量 A,并初始化为 4
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率为 9600
}
void loop() {
Serial.print(A); // 输出变量 A 的值到串口
Serial.print(" "); // 输出一个空格
Serial.print(&A); // 输出变量 A 的地址到串口
Serial.println(); // 输出一个换行符
delay(1000); // 延时 1 秒
A = 10; // 重新初始化变量 A 的值为 10
}
Arduino IDEでは、シリアルモニターを通じて出力結果を確認できます。関数内では 、変数Aの値とアドレスを出力し、毎回Aの値を初期化し直した後、 1秒遅延させて出力結果の変化を観察するためにloop()
使用しています 。delay(1000)
ROS1
#include <ros/ros.h>
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "my_node");
// 创建ROS节点句柄
ros::NodeHandle nh;
// 声明一个整数类型变量A,分配4个字节的内存空间
int A = 4;
// 发布变量A的值到"chatter"话题
ros::Publisher chatter_pub = nh.advertise<std_msgs::Int32>("chatter", 1000);
// 创建标准消息类型:整数类型(32位)
std_msgs::Int32 msg;
msg.data = A;
// 发布消息到"chatter"话题
ros::Rate loop_rate(1);
while (ros::ok()) {
msg.data = A;
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
上記のコードは、ROS C++ ライブラリを使用する ROS1 の C++ ノードです。コードの詳細な説明は次のとおりです。
#include <ros/ros.h>
: ROS ネームスペースとヘッダー ファイルを紹介します。これらには、ROS で使用されるさまざまな関数とクラスが含まれています。using namespace std;
:std
名前空間を導入することで、標準ライブラリの関数やオブジェクトをそれぞれプレフィックスを付けずに直接使用できるようになりますstd::
。int main(int argc, char **argv)
: プログラムの実行が開始されるメイン関数。コマンドライン引数の数 (argc
) とコマンドライン引数の値 (argv
) の 2 つの引数を受け入れます。ros::init(argc, argv, "my_node")
: ROS ノードを初期化します。これは、ROS のすべてのノードが実行する必要がある最初のステップです。コマンドライン引数の数と値、およびノード名という 3 つの引数を受け入れます。ros::NodeHandle nh;
: ノード ハンドル オブジェクトを作成しますnh
。ノード ハンドルは ROS の非常に重要なオブジェクトであり、ROS システムとの通信インターフェイスを提供します。ros::Publisher chatter_pub = nh.advertise<std_msgs::Int32>("chatter", 1000);
:chatter_pub
ノード ハンドルを使用して「chatter」という名前の Publisher オブジェクトを作成し、advertise
関数を使用してそれを「chatter」という名前のトピックに関連付けます。この発行者は、std_msgs::Int32
メッセージ タイプを使用してメッセージを発行します。2 番目のパラメータはパブリッシャ キューのサイズで、ここでは 1000 に設定されています。std_msgs::Int32 msg;
: 「chatter」トピックに投稿するmsg
ための名前を付けたメッセージ オブジェクトを作成します。std_msgs::Int32
msg.data = A;
:msg
メッセージ オブジェクトのデータ フィールドをA
変数の値に設定します。chatter_pub.publish(msg);
: パブリッシャー オブジェクトを使用してchatter_pub
、メッセージ オブジェクトをmsg
「chatter」トピックにパブリッシュします。ros::Rate loop_rate(1);
:loop_rate
rate object という名前の rate オブジェクトを作成し、メッセージを毎秒発行するように設定します (パラメーターが 1 であるため)。while (ros::ok())
: ROS システムが正常に動作している限り実行されるループを作成します。ros::spinOnce();
: ROS Spin メイン ループを実行して、ROS システムからのメッセージを処理し、コールバック関数を呼び出します。loop_rate.sleep();
:sleep
rate オブジェクトの関数を呼び出し、一定期間実行を一時停止して、公開頻度を 1 秒あたり 1 回に保ちます。return 0;
: 0 を返し、プログラムの実行が成功したことを示します。
A
要約すると、このコードは、「chatter」と呼ばれるトピックに整数変数を定期的に公開する ROS ノードを作成します。ノード ハンドル、パブリッシャー、メッセージ タイプなどの ROS のコア コンポーネントを使用して、ROS システムと対話します。
……