今天在做项目时发现ROS2不能用catkin_make了,才发现自己缺了ROS2的知识,记录一下ROS2的学习

文章目录

  • ROS2 学习
    • 11. Creating a workspace
      • 11.1 设置ROS2环境变量
      • 11.2 创建一个新的工作空间
      • 11.3 放置例程代码
      • 11.4 解决依赖问题
      • 11.5 编译工作空间
      • 11.6 设置环境变量
    • 12. Creating your first ROS 2 package
      • 12.1 创建功能包
      • 12.2 编译功能包
      • 12.3 运行功能包
    • 13. Writing a simple publisher and subscriber (C++)
      • 13.1 创建功能包
      • 13.2 创建发布者节点
      • 13.3 设置依赖项
      • 13.4 创建订阅者
      • 13.5 设置依赖项2
      • 13.6 编译并运行
    • 14. Writing a simple service and client
      • 14.1 创建功能包
      • 14.2 创建服务器节点
      • 14.3 创建服务器节点
      • 14.4 编译并运行
    • 15. Creating custom ROS 2 msg and srv files
      • 15.1 创建功能包
      • 15.2 创建自定义接口
      • 15.3 编译并运行
    • 16. Using parameters in a class
      • 16.1 创建功能包
      • 16.2 编写C++代码
      • 16.3 编译运行

ROS2 学习

11. Creating a workspace

Thanks
ROS默认是启动最上层的工作空间( overlay),上层工作空间中的功能包会覆盖(override)下层工作空间(underlay)中的同名功能包。所以有多个工作空间存在的时候,我们还需要注意设置工作空间的层次。

11.1 设置ROS2环境变量

Before using ROS 2, it’s necessary to source your ROS 2 installation workspace in the terminal you plan to work in.

11.2 创建一个新的工作空间

$ mkdir -p ~/dev_ws/src
$ cd ~/dev_ws/src

11.3 放置例程代码

现在我们使用的终端已经cd到dev_ws/src路径下,接下来我们在这里先放置一些示例的功能包(下一篇会讲如何创建功能包)

$ git clone https://github.com/ros/ros_tutorials.git -b foxy-devel

11.4 解决依赖问题

在创建好功能包之后,我们最好养成一个比较好的习惯,就是先解决所有功能包的依赖,不然未来编译运行都会有很多问题。
ROS2也提供了自动化的依赖安装方式,需要我们在工作空间的根目录dev_ws下运行如下命令:

$ cd ~/dev_ws
$ rosdep install -i --from-path src --rosdistro foxy -y

这里需要注意一点,以上自动化安装依赖的前提是:每个功能包已经完整的将所依赖的包和库在package.xml文件中声明了。

11.5 编译工作空间

接下来就可以编译代码啦。colcon是ROS2的编译工具,类似于ROS1中的catkin。需要在工作空间的根目录dev_ws下运行:

$ cd ~/dev_ws
$ colcon build

如果提示colcon没有安装的话,可以使用如下命令安装:

$ sudo apt install python3-colcon-common-extensions

colcon build后边还可以跟一些常用的参数:

  1. --packages-up-to :编译指定的功能包,而不是整个工作空间
  2. --symlink-install :节省每次重建python脚本的时间
  3. --event-handlers console_direct+ :在终端中显示编译过程中的详细日志
    在dev_ws工作空间下,可以看到有几个新创建的文件夹,其中的install文件夹就是运行所有节点启动文件和脚本的位置。

11.6 设置环境变量

接下来设置dev_ws工作空间的环境变量:

$ cd ~/dev_ws
$ . install/local_setup.sh

install里有两个很类似的文件:local_setup.sh和setup.sh,前者仅会设置当前工作空间中功能包的相关环境变量,后者还会设置该工作空间下其他底层工作空间的环境变量。现在我们就可以来运行dev_ws工作空间下的turtlesi功能包了:

$ ros2 run turtlesim turtlesim_node

并且如果有同名的包,只会运行当前工作空间下的包。因为这里dev_ws是上层工作空间,ROS2安装的包在下层工作空间。ROS2默认启动上层工作空间,具体运行哪里的包,全看在终端中如何设置环境变量。

12. Creating your first ROS 2 package

12.1 创建功能包

打开终端后进入到dev_ws/src路径下,然后就可以使用如下语法来创建功能包了(以下二选一):

$ cd ~/dev_ws/src
# CMake包
$ ros2 pkg create --build-type ament_cmake <package_name>
# Python包
$ ros2 pkg create --build-type ament_python <package_name>
# 创建功能包的指令还允许设置节点名,自动生成一个helloworld的例程代码:
# CMake包
$ ros2 pkg create --build-type ament_cmake --node-name my_node my_package
# Python包
$ ros2 pkg create --build-type ament_python --node-name my_node my_package

12.2 编译功能包

$ cd ~/dev_ws
# 编译工作空间下所有的包
$ colcon build
# 如果只想编译某一个包的话:
$ colcon build --packages-select my_package
# 打开一个新的终端,运行下工作空间的环境变量,这样才能让该终端找到新创建的包:
. install/setup.bash

12.3 运行功能包

$ ros2 run my_package my_node

13. Writing a simple publisher and subscriber (C++)

13.1 创建功能包

ros2 pkg create --build-type ament_cmake cpp_pubsub

13.2 创建发布者节点

在cpp_pubsub的src文件夹下,创建一个发布者节点的代码文件publisher_member_function.cpp:

#include <chrono>
#include <functional>
#include <memory>
#include <string>
//"rclcpp/rclcpp.hpp"是ROS2中常用C++接口的头文件
#include "rclcpp/rclcpp.hpp"
//"std_msgs/msg/string.hpp"是ROS2中字符串消息的头文件
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals;/* This example creates a subclass of Node and uses std::bind() to register a* member function as a callback from the timer. */
//创建一个节点类MinimalPublisher,从rclcpp::Node这个ROS2节点基类继承而来
class MinimalPublisher : public rclcpp::Node{public:/* 这是节点类MinimalPublisherd的构造函数,将count_变量初始化为0,节点名初始化为“minimal_publisher”。构造函数内先是创建了一个发布者,发布的话题名是topic,话题消息是String,保存消息的队列长度是10,然后创建了一个定时器timer_,做了一个500ms的定时,每次触发定时器后,都会运行回调函数timer_callback。*/MinimalPublisher(): Node("minimal_publisher"), count_(0){publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this));}private:/*每次触发timer_callback都会发布一次话题消息。message中保存的字符串是Hello world加一个计数值,然后通过RCLCPP_INFO宏函数打印一次日志信息,再通过发布者的publish方法将消息发布出去。*/void timer_callback(){auto message = std_msgs::msg::String();message.data = "Hello, world! " + std::to_string(count_++);RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());publisher_->publish(message);}rclcpp::TimerBase::SharedPtr timer_;rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;size_t count_;};
/*最后就是main函数啦,先初始化ROS2节点,然后使用rclcpp::spin创建MinimalPublisher,并且进入自旋锁,当退出锁时,就会关闭节点结束。*/int main(int argc, char * argv[]){rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<MinimalPublisher>());rclcpp::shutdown();return 0;}

13.3 设置依赖项

打开功能包的package.xml文件,修改以下内容:

<license>Apache License 2.0</license>

添加依赖项,放到ament_cmake下边:

<depend>rclcpp</depend>
<depend>std_msgs</depend>

接下来打开CMakeLists.txt文件,在find_package语句下添加:

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp std_msgs)install(TARGETS talker DESTINATION lib/${PROJECT_NAME})

13.4 创建订阅者

创建订阅者的代码subscriber_member_function.cpp:

#include <memory>#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using std::placeholders::_1;class MinimalSubscriber : public rclcpp::Node{public:/*现在的节点名叫minimal_subscriber,构造函数中创建了订阅者,订阅String消息,订阅的话题名叫做“topic”,保存消息的队列长度是10,当订阅到数据时,会进入回调函数topic_callback。*/MinimalSubscriber(): Node("minimal_subscriber"){subscription_ = this->create_subscription<std_msgs::msg::String>("topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));}private:void topic_callback(const std_msgs::msg::String::SharedPtr msg) const{RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;};int main(int argc, char * argv[])
{rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<MinimalSubscriber>());rclcpp::shutdown();return 0;
}

13.5 设置依赖项2

编译规则CMakeList.txt还是得加一些内容:

add_executable(listener src/subscriber_member_function.cpp)
ament_target_dependencies(listener rclcpp std_msgs)

install修改为

install(TARGETS talker listener DESTINATION lib/${PROJECT_NAME})

13.6 编译并运行

编译前先确认下功能包的依赖项有没有都安装好,在dev_ws路径下运行如下命令:

rosdep install -i --from-path src --rosdistro foxy -y

在该路径下编译cpp_pubsub功能包:

colcon build --packages-select cpp_pubsub
. install/setup.bash
ros2 run cpp_pubsub talker
# 另起一个终端,运行监听者节点
. install/setup.bash
ros2 run cpp_pubsub listener

14. Writing a simple service and client

14.1 创建功能包

在dev_ws工作空间的src文件夹下,使用如下命令创建一个新的功能包:

ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces

记得要修改下功能包中的package.xml文件中的功能包信息:

  <description>C++ server and client</description><maintainer email="howtoloveyou@todo.todo">howtoloveyou</maintainer><license>Apache License 2.0</license>

14.2 创建服务器节点

在 dev_ws/src/cpp_srvcli/src 路径下,创建一个文件并命名为 add_two_ints_server.cpp ,拷贝如下代码:

#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"
#include <memory>
//add函数的传入参数是服务的请求和应答数据,在其中实现请求数据的求和,然后把求和结果放到应答数据中,同时在终端中打印信息。
void add(const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response)
{response->sum = request->a + request->b;RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld",request->a, request->b);RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);
}
int main(int argc, char **argv)
{//初始化ROS2的C++库rclcpp::init(argc, argv);//创建一个叫做add_two_ints_server的节点std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_server");//创建一个叫做add_two_ints的服务,绑定add回调函数rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service =node->create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", &add);//打印日志信息RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add two ints.");//进入自旋锁,等待客户端请求rclcpp::spin(node);rclcpp::shutdown();
}

代码编写完成后,需要在CmakeList.txt中设置编译规则:

add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp example_interfaces)

还需要添加一个install的规则:

install(TARGETS server DESTINATION lib/${PROJECT_NAME})

14.3 创建服务器节点

在 dev_ws/src/cpp_srvcli/src 路径下,创建名为 add_two_ints_client.cpp 的文件,拷贝如下代码:

#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/add_two_ints.hpp"
#include <chrono>
#include <cstdlib>
#include <memory>using namespace std::chrono_literals;int main(int argc, char **argv)
{rclcpp::init(argc, argv);if (argc != 3) {RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_two_ints_client X Y");return 1;}
//首先创建一个节点,然后创建一个客户端实例std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_client");rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client =node->create_client<example_interfaces::srv::AddTwoInts>("add_two_ints");
//接下来创建一个请求数据,包括两个加数的数值auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();request->a = atoll(argv[1]);request->b = atoll(argv[2]);
//通过while循环等待1秒钟时间,查看服务器端是否已经启动while (!client->wait_for_service(1s)) {if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");return 0;}RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");}auto result = client->async_send_request(request);// Wait for the result.if (rclcpp::spin_until_future_complete(node, result) ==rclcpp::FutureReturnCode::SUCCESS){RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Sum: %ld", result.get()->sum);} else {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service add_two_ints");}rclcpp::shutdown();return 0;
}

配置CMakeLists.txt文件如下:

add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp example_interfaces)add_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(client rclcpp example_interfaces)install(TARGETSserverclientDESTINATION lib/${PROJECT_NAME})

14.4 编译并运行

在包下确认所有的依赖都安装了:

rosdep install -i --from-path src --rosdistro foxy -y

然后在工作空间的根目录下仅编译这个包

$ cd ~/dev_ws
$ colcon build --packages-slect cpp_srvcli
$ . install/setup.bash 
# run server node
$ ros2 run cpp_srvcli server
# open a new terminal
$ . install/setup.bash
$ ros2 run cpp_srvcli client 3 2

这样就可以在两边看到结果了

15. Creating custom ROS 2 msg and srv files

接下来我们就学习下如何自定义话题及服务消息类型

15.1 创建功能包

ros2 pkg create --build-type ament_cmake tutorial_interfaces

15.2 创建自定义接口

Create the directories in dev_ws/src/tutorial_interfaces :

$ cd ~/dev_ws/src/tutorial_interfaces
$ mkdir msg
$ mkdir srv
  1. 在msg文件夹下,创建一个新文件Num.msg,在其中输入如下内容:
int64 num

这就是一个最简单的消息啦,只有一个64位整型数,叫做num

  1. 在srv文件夹下,创建一个新文件 AddThreeInts.srv ,在其中输入如下内容:
int64 a
int64 b
int64 c
---
int64 sum

15.3 编译并运行

  1. 修改CMakeLists.txt文件,添加以下内容:
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}"msg/Num.msg""srv/AddThreeInts.srv"
)
  1. 修改package.xml文件,在package.xml中设置:
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
  1. 编译
$ colcon build --packages-select tutorial_interfaces
$ .install/setup.bash
$ ros2 interface show tutorial_interfaces/msg/Num
$ ros2 interface show tutorial_interfaces/srv/AddThreeInts

这样就可以查看两个自定义接口的类型了
4. 测试请看链接

16. Using parameters in a class

16.1 创建功能包

ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp

修改package.xml

16.2 编写C++代码

在dev_ws/src/cpp_parameters/src路径下,创建一个名为cpp_parameters_node.cpp的代码文件,然后复制粘贴如下代码内容:

#include <rclcpp/rclcpp.hpp>
#include <chrono>
#include <string>
#include <functional>using namespace std::chrono_literals;class ParametersClass: public rclcpp::Node
{public://第一行就创建了一个ROS参数,参数名为my_parameter,参数值为“world”,数据类型是string。接下来的第二行创建了一个1s周期的定时器,触发respond函数。ParametersClass() : Node("parameter_node"){this->declare_parameter<std::string>("my_parameter", "world");timer_ = this->create_wall_timer(1000ms, std::bind(&ParametersClass::respond, this));}//在respond函数中,第一行会查询“my_parameter”参数,并且保存在parameter_string_这个私有变量中,紧接着第二行就把查询到的参数值打印出来了void respond(){this->get_parameter("my_parameter", parameter_string_);RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());}private:std::string parameter_string_;rclcpp::TimerBase::SharedPtr timer_;
};int main(int argc, char** argv)
{rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<ParametersClass>());rclcpp::shutdown();return 0;
}

16.3 编译运行

  1. 在CMakeLists.txt文件中添加配置内容:
add_executable(parameter_node src/cpp_parameters_node.cpp)
ament_target_dependencies(parameter_node rclcpp)install(TARGETSparameter_nodeDESTINATION lib/${PROJECT_NAME}
)

运行后可以看到不断输出参数 Hello world

  1. 通过终端修改参数值
    不要关闭刚才运行的参数功能节点,打开一个新终端,使用如下命令查询当前所有参数列表:
$ ros2 param list

在列表中可以看到my_parameter这个参数,接下来就可以通过如下命令行来修改这个参数的值了。

ros2 param set /parameter_node my_parameter earth
  1. 通过Launch文件修改参数值
    和ROS1一样,在ROS2中也可以通过Launch文件来设置参数值。在cpp_parameters功能包中,创建一个launch文件夹,并在其中创建cpp_parameters_launch.py,复制粘贴如下内容:
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package="cpp_parameters",executable="parameter_node",name="custom_parameter_node",output="screen",emulate_tty=True,parameters=[{"my_parameter": "earth"}])])

之后修改CMakeLists.txt文件:

install(DIRECTORY launchDESTINATION share/${PROJECT_NAME}
)

然后进行编译:

$ cd ~/dev_ws
$ colcon build --packages-select cpp_parameters
$ . install/setup.bash
$ ros2 launch cpp_parameters cpp_parameters_launch.py
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Java 多线程学习笔记(狂神)

    文章目录 1、线程简介2、线程实现2.1 继承 Thread 类&#xff0c;重写 run 方法2.2 继承 Runnable 接口&#xff0c;创建 Tread 对象2.3 实现 Callable 接口&#xff08;了解&#xff09;2.4 Lamda 表达式2.5 静态代理模式3、线程的 5 种状态 3.1 线程的一些常用方法 3.1.1 线程…...

    2024/4/28 7:44:23
  2. Keil相关部分界面“μVision”显示为“礦ision”的解决方法

    第一步&#xff0c;打开注册表编辑器&#xff0c;按下“WinR”&#xff0c;输入“regedit”&#xff0c;点击“确定”即可打开注册表编辑器&#xff1b; 第二步&#xff0c;在注册表编辑器中点开“HKEY_CLASSES_ROOT”&#xff1b; 第三步&#xff0c;下拉找到“UV2FILE”&…...

    2024/4/27 23:34:15
  3. 【笔记】PP-YOLO、PP-YOLOv2、PP-YOLO Tiny

    &Title PP-YOLO: An Effective and Efficient Implementation of Object Detector&#xff08;2020&#xff09;PP-YOLOv2: A Practical Object Detector&#xff08;2021&#xff09;代码 &Summary 目标检测算法的准确性和推理速度不可兼得&#xff0c;本文的工作旨…...

    2024/4/28 14:40:31
  4. Intel Edge Insights for Autonomous Mobile Robots

    主要是这个方案&#xff0c;他提供了什么样的功能&#xff1f;价格多少钱&#xff1f;性能如何&#xff1f;对此进行了解&#xff0c;然后可以给大家介绍一下 Research Goals 功能价格性能 文章目录EI for AMRHow it WorksModules and ServicesDriversMiddlewareAlgorithmsApp…...

    2024/4/27 22:32:48
  5. FCN网络结构解析

    daily&#xff1a;作为深度学习图片分割第一个学习的网络结构 Q1&#xff1a; 为什么要用FCN&#xff1f; A1&#xff1a;应为和以前网络R-CNN&#xff0c;SDS相比提升比较大 Q2&#xff1a;与CNN什么区别&#xff1f; A2:使用全卷积层代替全连接层 Q3&#xff1a;为什么要进行…...

    2024/4/28 6:41:13
  6. 还剩3个月过年,我能为产品经理求职做点什么?

    还剩3个月过年&#xff0c;我能为产品经理求职做点什么&#xff1f; 转载自&#xff1a;https://zhuanlan.zhihu.com/p/428777821 现在已经进入11月份了&#xff0c;明年过年是在2月1日&#xff0c;留给今年找工作的还有3个月的时间&#xff0c;在这个时间里&#xff0c;我想跟…...

    2024/4/27 0:28:15
  7. 小解:b、B

    b&#xff1a;全称为&#xff1a;bit&#xff0c;中文名“比特”&#xff0c;bit是计算机中的最小数据单位&#xff0c;人们常说的“8比特”&#xff0c;“比特位”中的“比特”&#xff0c;指的就是这个单位 → bit。在计算机中&#xff0c;数据都是由二进制数 0 /1 组成&a…...

    2024/4/27 21:52:05
  8. T31系统Day4-工程规约

    一.作业 二.应用分层 三.Maven Maven排除依赖 四.二方库依赖 什么是二方库 一方库&#xff1a;本工程中的各模块的相互依赖 二方库&#xff1a;公司内部的依赖库&#xff0c;一般指公司 内部的其他项目发布的jar包 三方库&#xff1a;公司之外的开源库 比如apache Goo…...

    2024/4/28 11:34:07
  9. Redis核心技术与实战笔记(1)

    对一个大型软件系统的更好的学习方式&#xff1a;先建立起系统观&#xff0c;再关注具体的细枝末节。 先考虑简单的键值数据库架构&#xff1a; 理解数据模型和操作接口&#xff0c;知道Redis可以做什么&#xff0c;不能做什么。 数据模型&#xff1a; key-value类型&#x…...

    2024/4/28 0:05:11
  10. 21天好习惯第一期--12

    今天我学习了递推法&#xff0c;学习了如何正确地使用for语句&#xff0c;do-while语句和while语句 for&#xff08;表达式1;表达式2;表达式3) ↑ ↑ ↖ 循环初始条件&#xff0c;循环控制条件&#xff0c;循环转化条件 表达式1;循环初始条…...

    2024/4/28 19:01:03
  11. 谈谈GIS三维渲染引擎

    minemap:是我们公司的产品&#xff0c;主要以earth的形态展示&#xff0c;支持矢量切片倾斜数据&#xff08;这一点我个人认为是它最大的优点&#xff0c;即兼容了矢量切片精美地图又兼容倾斜数据&#xff0c;目前倾斜数据采用的3dtile格式&#xff09;&#xff0c;目前正在重构…...

    2024/4/28 14:09:08
  12. 地图数据快速渲染------基于传统GIS平台多服务器切片

    传统的地理信息平台显示矢量数据的方式或栅格数据&#xff0c;是直接渲染在软件上进行展示&#xff0c;需要配以专业的地图软件、符号库、字体库等内容。随着BS端对于地图展示的要求&#xff0c;传统的渲染方式已经不能满足要求&#xff08;需要的前置条件太多&#xff0c;而且…...

    2024/4/28 22:33:22
  13. mysql中isnull,ifnull的用法及区别

    isnull(expr)的用法 如果expr为null&#xff0c;isnull()返回1&#xff0c;否则返回0 mysql> select isnull(11); -> 0 mysql> select isnull(1/0); -> 1 ifnull(expr1, expr2) 的用法 如果expr1为null,则返回expr2,否则返回expr1 mysql> SELECT IFNUL…...

    2024/4/28 20:55:56
  14. 手机号归属地数据库;根据手机号查找对应的归属地;

    我在网上找到了一份手机号对应归属地的数据库文档。 链接: https://pan.baidu.com/s/1MQtDkw3sowNmdSeoVJUbEA 密码: tp1o 链接: https://pan.baidu.com/s/1pzh_FqXOP_6Ta103K5Cmyw 密码: 9j5r 如有需要&#xff0c;先点赞、关注&#xff0c;再下载。...

    2024/4/28 20:17:57
  15. LeetCode 76. 最小覆盖子串

    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如…...

    2024/4/28 15:56:12
  16. CHAP协议认证模式

    CHAP&#xff1a;挑战握手认证协议 &#xff0c;是 PPP 协议集中的一种链路控制协议&#xff0c;在网络物理连接后进行连接安全性验证的协议。通过三次握手周期性的校验对端的身份&#xff0c;在初始链路建立时完成&#xff0c;可以在链路建立之后的任何时候重复进行&#xff0…...

    2024/4/27 23:05:12
  17. 从SVN服务器下载project到本地

    从SVN服务器下载project到本地&#xff1a; 马克- to-win&#xff1a;马克 java社区&#xff1a;防盗版实名手机尾号&#xff1a; 73203 1.在资源库视图里点击资源库左边的小加号后出现该资源库下的所有project 2.选择要下载的project右击 --> 检出为 看输出窗口&#xff0…...

    2024/4/28 18:14:23
  18. ORACLE —— 事务

    什么是事务&#xff1f; 在数据库中&#xff0c;事务是工作的逻辑单元。一个事务可以是一个SQL语句&#xff0c;也可以是多个完成一系列操作的SQL语句。事务机制是确保这些SQL语句要么全部成功执行&#xff0c;完成整个逻辑单元&#xff0c;要么一条也不执行。 事务特性&…...

    2024/4/27 5:01:41
  19. 17. STM32——SPI硬件

    STM32——SPISPI协议SPI接口SPI接口框图SPI工作原理时钟信号的相位和极性CPHA 0CPHA 1SPI中断状态标志发送缓存器空闲标志&#xff08;TXE&#xff09;接收缓冲器非空(RXNE)忙BUSY标志SPI引脚配置从设备引脚管理(NSS)①软件模式&#xff1a;②硬件模式&#xff1a;SPI结构体S…...

    2024/4/24 19:21:23
  20. PS2022免安装绿色版

    10月&#xff0c;Adobe更新全系产品至2022版&#xff0c;Adobe旗下的产品深入多媒体领域的方方面面&#xff0c;对于大家来说&#xff0c;用的最多的当属Photoshop。 Photoshop的相关资源&#xff0c;目前在国内主要是由vposy封装制作&#xff0c;它的优点显而易见&#xff0c;…...

    2024/4/20 11:16:22

最新文章

  1. 基于单片机的多功能电子万年历系统

    摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…...

    2024/4/29 1:23:16
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 3d representation的一些基本概念

    顶点&#xff08;Vertex&#xff09;&#xff1a;三维空间中的一个点&#xff0c;可以有多个属性&#xff0c;如位置坐标、颜色、纹理坐标和法线向量。它是构建三维几何形状的基本单元。 边&#xff08;Edge&#xff09;&#xff1a;连接两个顶点形成的直线段&#xff0c;它定…...

    2024/4/27 1:08:47
  4. Linux——gdb

    gdb调试 (1)debug版本: 在编译阶段会加入某些调试信息; 调试信息是在编译的过程中加入到中间文件.o文件的; gcc -c main.c -g:生成包含调试信息的中间文件 gcc -o main main.o 一步执行:gcc -o main main.c -g (1) (2)release版本: 发行版本,没有调试信息; gcc默认生成relea…...

    2024/4/28 8:37:17
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57