机器人编程趣味实践03-运算(+ - × ÷)
2023-03-31 10:31:17 时间
前一篇,讲解了如何在屏幕或者两台电脑之间传输一段信息:
C++的输入和输出(iostream):
- cin
- cout
这都是使用“流”(stream)的方式实现。
- >>
- <<
对比,C语言中标准库函数(cstdio):
- scanf
- printf
使用scanf比cin效率高,速度快,思考为什么?
小贴士:命令行终端最绚丽的效果能达到什么样的程度呢?
引用别人的案例:
动态字符是最基本的效果,需要比运算更复杂的程序,下一节详细介绍;
更酷的案例如下:
C++的运算除了+ - × ÷还包括++、--;类型转换;并且提供了数学函数cmath。关于机器人的案例可以参考:
- CppRobotics
后续会详细补充的。
- win端出现乱码,由于中文字符导致,如何修正
- linux端无法获取具体数值,而是采用程序初值运算
有bug代码如下:
服务器端:
#include <inttypes.h>
#include <memory>
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"
using AddTwoInts = example_interfaces::srv::AddTwoInts;
rclcpp::Node::SharedPtr g_node = nullptr;
void handle_service(
const std::shared_ptr<rmw_request_id_t> request_header,
const std::shared_ptr<AddTwoInts::Request> request,
const std::shared_ptr<AddTwoInts::Response> response)
{
(void)request_header;
RCLCPP_INFO(
g_node->get_logger(),
"分别获取两个整数 %" PRId64 " + %" PRId64, request->a, request->b);
response->sum = request->a + request->b;
}
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
g_node = rclcpp::Node::make_shared("minimal_service");
auto server = g_node->create_service<AddTwoInts>("add_two_ints", handle_service);
rclcpp::spin(g_node);
rclcpp::shutdown();
g_node = nullptr;
return 0;
}
客户端:
#include <chrono>
#include <cinttypes>
#include <memory>
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"
using AddTwoInts = example_interfaces::srv::AddTwoInts;
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("minimal_client");
auto client = node->create_client<AddTwoInts>("add_two_ints");
while (!client->wait_for_service(std::chrono::seconds(1))) {
if (!rclcpp::ok()) {
RCLCPP_ERROR(node->get_logger(), "客户端在等待服务出现时中断.");
return 1;
}
RCLCPP_INFO(node->get_logger(), "正在等待服务启动...");
}
auto request = std::make_shared<AddTwoInts::Request>();
request->a = 41;
request->b = 1;
auto result_future = client->async_send_request(request);
if (rclcpp::spin_until_future_complete(node, result_future) !=
rclcpp::FutureReturnCode::SUCCESS)
{
RCLCPP_ERROR(node->get_logger(), "服务调用失败 :(");
return 1;
}
auto result = result_future.get();
RCLCPP_INFO(
node->get_logger(), "结果 %" PRId64 " + %" PRId64 " = %" PRId64,
request->a, request->b, result->sum);
rclcpp::shutdown();
return 0;
}
当然,嵌入式设备可以通过串口、蓝牙、wifi等与主机通信完成调用。
运算量大的程序在主机运行,嵌入式设备负责数据采集。
相关文章
- 当iPhone不再神奇,频繁人事变动显露苹果的艰难抉择
- Google意外发布了Fuchsia OS的第一个“候选版本”
- Facebook开发AI语音助手,或是“钱途”未卜
- 那些年,我们一起卸载过的软件…
- 苹果产品的三种死法
- 刚入行做UI设计,需要考虑哪些问题?
- iPhone全线降价后,之前买贵的怎么退差价?
- 由“硬”变“软”的苹果这次能成功吗?
- 没有硬件的苹果发布会:中年危机的解药
- 苹果发布会亮点汇总:这些东西值得一看
- 十多年后,我们终于看到了初代 iPhone 原型机巨大的红色开发板
- 苹果进行iPhone问世后重大转型:硬件时代转向互联网服务
- 新一代iPad真香,但苹果重回昔日巅峰还差得远
- 继苹果iCloud服务出现大面积瘫痪之后 Siri也中招了
- 另一种绕过 Android P以上非公开API限制的办法
- 专利曝光!谷歌即将推出可折叠智能手机
- 苹果宣布今年WWDC将于6月3日举行 新系统要来了
- css中z-index属性
- css中translate函数的用法
- css中transition方法的介绍