编写 ROS 消息发布订阅器(五)

news2024/10/7 6:41:23

执行命令,指定目录添加cpp文件

cd ~/catkin_ws/src/beginner_tutorials

 如果没有src目录, 就自己创建一个目录叫src

cd src/
vim talker.cpp

 复制代码粘贴:

#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv){
        ros::init(argc, argv, "talker");
        ros::NodeHandle n;
        ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",
1000);
        ros::Rate loop_rate(1);
        int count = 0;
        while (ros::ok()) {
                std_msgs::String msg;
                std::stringstream ss;
                ss << "hello world " << count;
                msg.data = ss.str();
                ROS_INFO("%s", msg.data.c_str());
                chatter_pub.publish(msg);
                ros::spinOnce();
                loop_rate.sleep();
                count+=2;
        }
        return 0;
}

代码解释(可跳过,如果执行跑起来的话):

这是一个 ROS 节点的 C++ 代码,用于向 "chatter" 主题发布消息。以下是代码的详细说明:

  1. #include "ros/ros.h" 和 #include "std_msgs/String.h"

    在代码的开头,我们包含了 ROS C++ 客户端库的头文件 ros/ros.h,以及用于发布字符串消息的消息类型头文件 std_msgs/String.h

  2. int main(int argc, char **argv)

    这是 C++ 程序的主函数。在 ROS 中,每个节点都必须包含一个 main 函数,用于初始化 ROS 节点并执行节点的主要逻辑。

    ```argcargv 参数是传递给节点的命令行参数。在 ROS 中,argc 参数表示命令行参数的数量,argv` 参数是一个字符串数组,包含所有命令行参数的值。

  3. ros::init(argc, argv, "talker")

    ```ros::init函数用于初始化 ROS 节点。在此示例中,我们将argcargv参数传递给ros::init` 函数,以便 ROS 节点可以解析命令行参数并进行必要的初始化。另外,我们将节点的名称设置为 "talker"。

  4. ros::NodeHandle n

    ```ros::NodeHandle类用于创建一个节点句柄,以便节点可以与 ROS 系统进行通信。在此示例中,我们创建了一个名为n` 的节点句柄,用于向 ROS 发布和接收消息,以及订阅 ROS 主题。

  5. ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000)

    ```ros::Publisher类用于创建一个发布者对象,用于向 ROS 主题发布消息。在此示例中,我们创建了一个名为chatter_pub` 的发布者对象,并将其绑定到名为 "chatter" 的主题上。我们还指定了发布队列的大小为 1000 条消息。这意味着,如果发布者的发布速率太快,ROS 将会缓存多达 1000 条未发布的消息。

  6. ros::Rate loop_rate(1)

    ```ros::Rate类用于设置 ROS 节点的主循环的执行频率。在此示例中,我们创建了一个名为loop_rateros::Rate` 对象,将其设置为每秒执行 1 次。

  7. while (ros::ok()) {...}

    在主函数的主循环中,我们使用 while 循环来执行节点的主要逻辑。ros::ok() 函数用于检查节点是否已经被终止,如果节点已经被终止,则跳出循环。

  8. std_msgs::String msg

    ``std_msgs::String类型用于表示 ROS 中的字符串消息。在每次循环中,我们创建了一个名为msgstd_msgs::String` 对象,用于存储要发布的消息。

  9. std::stringstream ss; ss << "hello world " << count; msg.data = ss.str()

    在此示例中,我们使用 std::stringstream 类来格式化要发布的消息。我们首先创建一个名为 ss 的 std::stringstream 对象,然后使用 << 运算符将 "hello world " 和 count 变量的值添加到字符串流中。最后,我们将字符串流中的内容存储到 msg.data 变量中,以便将其发布到 ROS 主题10. ROS_INFO("%s", msg.data.c_str())

    ``ROS_INFO函数用于在 ROS 中输出日志消息。在此示例中,我们使用%s占位符和msg.data.c_str()函数将msg.data` 变量中的字符串消息输出到 ROS 日志窗口中。

  10. chatter_pub.publish(msg)

    chatter_pub 发布者对象的 publish 函数用于将消息发布到 "chatter" 主题上。在此示例中,我们将 msg 变量中的字符串消息发布到 "chatter" 主题。

  11. ros::spinOnce()

    ``ros::spinOnce()函数用于让节点处理等待中的回调函数,例如订阅 ROS 主题时的回调函数。在此示例中,我们没有订阅任何主题,因此ros::spinOnce()` 函数没有任何作用。但是,如果节点需要订阅主题或接收服务请求,则需要在主循环中调用此函数来处理回调函数。

  12. loop_rate.sleep()

    loop_rate 对象的 sleep 函数用于使节点在主循环中按照指定的频率执行。在此示例中,我们将节点的执行频率设置为每秒执行 1 次,因此 loop_rate.sleep() 函数将使节点在每个循环迭代之间休眠 1 秒,以确保节点的执行频率不会超过 1 秒。

  13. count+=2

    在每次循环中,我们将 count 变量的值增加 2,以便在每次循环中输出不同的字符串消息。这个变量的值将用于格式化要发布的消息。

  14. return 0

    主函数的最后一行用于返回程序的退出状态。在此示例中,我们将退出状态设为 0,表示程序正常退出。

综上所述,这个 ROS 节点的主要逻辑是向 "chatter" 主题发布带有计数器的字符串消息。在节点的 main 函数中,我们首先使用 ros::init 函数初始化 ROS 节点,并将节点的名称设置为 "talker"。然后,我们创建了一个名为 chatter_pub 的发布者对象,用于将字符串消息发布到 "chatter" 主题上。接下来,我们使用 ros::Rate 类设置节点的主循环执行频率,并使用 while 循环执行节点的主要逻辑。在每次循环中,我们使用 std::stringstream 类格式化要发布的消息,并将其存储在 std_msgs::String 类型的变量 msg 中。然后,我们使用 ROS_INFO 函数在 ROS 日志窗口中输出字符串消息,并使用 chatter_pub.publish 函数将其发布到 "chatter" 主题上。最后,我们使用 ros::spinOnce 函数处理等待中的回调函数,并使用 loop_rate.sleep 函数使节点在每个循环迭代之间休眠,以确保节点的执行频率不会超过设置的频率。在每个循环迭代中,我们还将 count 变量的值增加 2,以便在每次循环中输出不同的字符串消息。

vim listener.cpp

 复制代码粘贴:

#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg){
        ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv){
        ros::init(argc, argv, "listener");
        ros::NodeHandle n;
        ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
        ros::spin();
        return 0;
}

代码解释(可跳过):

这是一个 ROS 节点的 C++ 代码,用于订阅 "chatter" 主题并输出接收到的消息。以下是代码的详细说明:

  1. #include "ros/ros.h" 和 #include "std_msgs/String.h"

    在代码的开头,我们包含了 ROS C++ 客户端库的头文件 ros/ros.h,以及用于发布字符串消息的消息类型头文件 std_msgs/String.h

  2. void chatterCallback(const std_msgs::String::ConstPtr& msg)

    这是一个回调函数,用于处理接收到的 "chatter" 主题消息。在此示例中,我们创建了一个名为 chatterCallback 的回调函数,该函数接收一个 std_msgs::String 消息类型的指针作为参数。当 "chatter" 主题发布新的消息时,ROS 将调用此回调函数,并将消息指针作为参数传递给函数。

  3. int main(int argc, char **argv)

    这是 C++ 程序的主函数。在 ROS 中,每个节点都必须包含一个 main 函数,用于初始化 ROS 节点并执行节点的主要逻辑。

``argcargv 参数是传递给节点的命令行参数。在 ROS 中,argc 参数表示命令行参数的数量,argv` 参数是一个字符串数组,包含所有命令行参数的值。

  1. ros::init(argc, argv, "listener")

    ``ros::init函数用于初始化 ROS 节点。在此示例中,我们将argcargv参数传递给ros::init` 函数,以便 ROS 节点可以解析命令行参数并进行必要的初始化。另外,我们将节点的名称设置为 "listener"。

  2. ros::NodeHandle n

    ``ros::NodeHandle类用于创建一个节点句柄,以便节点可以与 ROS 系统进行通信。在此示例中,我们创建了一个名为n` 的节点句柄,用于向 ROS 发布和接收消息,以及订阅 ROS 主题。

  3. ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback)

    ``ros::Subscriber类用于创建一个订阅者对象,用于订阅 ROS 主题并接收消息。在此示例中,我们创建了一个名为sub的订阅者对象,并将其绑定到名为 "chatter" 的主题上。我们还指定了订阅队列的大小为 1000 条消息,以及要调用的回调函数chatterCallback`。

  4. ros::spin()

    ``ros::spin()` 函数将使节点进入一个无限循环,等待接收来自 ROS 系统的消息。此函数不会退出,直到节点被终止或出现致命错误。

  5. return 0

    主函数的最后一行用于返回程序的退出状态。在此示例中,我们将退出状态设为 0,表示程序正常退出。

综上所述,这个 ROS 节点的主要逻辑是订阅 "chatter" 主题并输出接收到的消息。在节点的 main 函数中,我们首先使用 ros::init 函数初始化 ROS 节点,并将节点的名称设置为 "listener"。然后,我们创建了一个名为 sub 的订阅者对象,用于订阅 "chatter" 主题并接收消息。我们还指定了订阅队列的大小为 1000 条消息,并将回调函数 chatterCallback 与订阅者对象绑定,以便在收到新消息时自动调用。

在回调函数 chatterCallback 中,我们使用 ROS_INFO 函数将接收到的消息内容输出到 ROS 日志窗口中。当节点收到来自 "chatter" 主题的新消息时,ROS 将自动调用回调函数 chatterCallback 并将消息指针作为参数传递给该函数。在回调函数中,我们使用 msg->data.c_str() 函数获取消息内容,并使用 ROS_INFO 函数在 ROS 日志窗口中输出消息内容。

最后,我们使用 ros::spin() 函数进入一个无限循环,等待接收来自 ROS 系统的消息。此函数将不会退出,直到节点被终止或出现致命错误。在每次循环中,ROS 将检查订阅队列中是否有新的消息,如果有,则自动调用回调函数 chatterCallback 并传递消息指针作为参数。在回调函数中,我们将消息内容输出到 ROS 日志窗口中。

然后编辑CMakeLists.txt 文件,看图命令

 复制粘贴就好了,之前解释过了,指定talker 为节点,位置是src/talker.cpp 。下面的添加链接库的代码

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
#add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
#add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)

 按esc 输入:wq 保存退出

执行命令:

cd ~/catkin_ws/ && catkin_make -j1

然后 测试消息发布器和订阅器(C++)

启动三个终端,分别运行如下代码

roscore
rosrun beginner_tutorials talker
rosrun beginner_tutorials listener

 好了,我们的c++的消息发布器和订阅器代码就写好了

--------------------------------------------分割线----------------------------------------------------------------------------

下面我们开始python 版本的了,上面的c++ 版本,下面是python版本

执行命令,创建在begineer什么的 功能包 里面创建一个scripts文件夹

mkdir ~/catkin_ws/src/beginner_tutorials/scripts

此链接可能会被dns污染,请用其他方法下载这个脚本 

wget https://raw.githubusercontent.com/ros/ros_tutorials/melodic-devel/rospy_tutorials/001_talker_listener/talker.py

 

 你们可以像办法把这个文件烤进来虚拟机这个位置,就是比较麻烦。

执行命令:

chmod +x talker.py

 talker.py 文件代码解释:


import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

这是一个 ROS 节点的 Python 代码,用于发布 "chatter" 主题的字符串消息。以下是代码的详细说明:

  1. import rospy 和 from std_msgs.msg import String

    在代码的开头,我们导入了 ROS Python 客户端库 rospy,以及用于发布字符串消息的消息类型 std_msgs.msg.String

  2. def talker():

    这是一个函数,用于实现节点的主要逻辑。在此示例中,我们创建了一个名为 talker 的函数,用于发布 "chatter" 主题的字符串消息。

  3. pub = rospy.Publisher('chatter', String, queue_size=10)

    ``rospy.Publisher类用于创建一个发布者对象,用于发布 ROS 消息到指定的主题。在此示例中,我们创建了一个名为pub` 的发布者对象,并将其绑定到名为 "chatter" 的主题上。我们还指定了发布队列的大小为 10 条消息。

  4. rospy.init_node('talker', anonymous=True)

    ``rospy.init_node函数用于初始化 ROS 节点。在此示例中,我们将节点的名称设置为 "talker",并将anonymous参数设置为True`,以便在多个节点启动时避免节点名称冲突。

  5. rate = rospy.Rate(10) # 10hz

    ``rospy.Rate类用于控制节点的循环频率。在此示例中,我们创建了一个名为raterospy.Rate` 对象,并将其设置为每秒循环 10 次。

  6. while not rospy.is_shutdown():

    这是一个循环结构,用于实现节点的主要逻辑。在此示例中,我们使用 rospy.is_shutdown() 函数来检查节点是否被终止。

  7. hello_str = "hello world %s" % rospy.get_time()

    在每次循环中,我们创建一个字符串变量 hello_str,用于存储要发布的消息内容。在此示例中,我们将字符串设置为 "hello world",并使用 rospy.get_time() 函数获取当前时间戳,将其添加到字符串末尾。

  8. rospy.loginfo(hello_str)

    ``rospy.loginfo函数用于将消息输出到 ROS 日志窗口中。在此示例中,我们将hello_str变量作为参数传递给rospy.loginfo` 函数,以便将消息内容输出到 ROS 日志窗口中。

  9. pub.publish(hello_str)

    ``pub.publish函数用于将消息发布到 ROS 主题中。在此示例中,我们将hello_str变量作为参数传递给pub.publish` 函数,以便将消息内容发布到 "chatter" 主题中。

  10. rate.sleep()

``rate.sleep函数用于控制节点的循环频率。在此示例中,我们使用rate.sleep` 函数使节点按照我们在第 5 步中设置的频率循环。

  1. if __name__ == '__main__':

    这是 Python 中的一个特殊语句,用于检查当前脚本是否正在作为主程序运行。如果是,则执行以下代码;如果不是,则不执行以下代码。

  2. try: talker() except rospy.ROSInterruptException: pass

    在 if __name__ == '__main__': 语句的后面,我们使用 try 和 except 语句块来捕获可能抛出的 rospy.ROSInterruptException 异常。在此示例中,我们使用 try 语句块调用 talker() 函数,如果出现 rospy.ROSInterruptException 异常,则使用 except 语句块中的 pass 语句来忽略该异常。

综上所述,这个 ROS 节点的主要逻辑是发布 "chatter" 主题的字符串消息。在节点的 talker 函数中,我们首先创建了一个 rospy.Publisher 对象,用于将消息发布到 "chatter" 主题中。然后,我们使用 rospy.init_node 函数初始化 ROS 节点,并将节点的名称设置为 "talker"。接下来,我们使用 rospy.Rate 类控制节点的循环频率,并在循环中使用 rospy.is_shutdown() 函数检查节点是否被终止。在每次循环中,我们创建一个字符串变量 hello_str,用于存储要发布的消息内容,并使用 rospy.loginfo 函数将消息内容输出到 ROS 日志窗口中。然后,我们使用 pub.publish 函数将消息发布到 "chatter" 主题中,并使用 rate.sleep 函数控制节点的循环频率。

在 if __name__ == '__main__': 语句块中,我们使用 try 和 except 语句块来捕获可能抛出的 rospy.ROSInterruptException 异常。在 try 语句块中,我们调用 talker() 函数,以便启动节点的主要逻辑。如果出现 rospy.ROSInterruptException 异常,则使用 except 语句块中的 pass 语句来忽略该异常。

综上所述,这个 ROS 节点将按照我们在第 5 步中设置的频率循环,并在每次循环中发布带有当前时间戳的 "hello world" 字符串消息到 "chatter" 主题,并将消息内容输出到 ROS 日志窗口中。节点将一直运行,直到被终止或出现致命错误。

然后编辑CMakeLists.txt 文件,按图执行命令

复制代码粘贴 

catkin_install_python(PROGRAMS scripts/talker.py
 DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

 然后按esc 输入:wq 保存退出

和刚刚一样继续添加脚本

wget https://raw.githubusercontent.com/ros/ros_tutorials/melodic-devel/rospy_tutorials/001_talker_listener/listener.py

在scripts目录下执行  

 

 执行命令:

chmod +x listener.py 

listener.py 文件代码解释:


import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)

def listener():
    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('chatter', String, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()
 

这是一个 ROS 节点的 Python 代码,用于订阅 "chatter" 主题并输出接收到的消息。以下是代码的详细说明:

  1. import rospy 和 from std_msgs.msg import String

    在代码的开头,我们导入了 ROS Python 客户端库 rospy,以及用于订阅字符串消息的消息类型 std_msgs.msg.String

  2. def callback(data):

    这是一个回调函数,用于处理接收到的 "chatter" 主题消息。在此示例中,我们创建了一个名为 callback 的回调函数,该函数接收一个 std_msgs.msg.String 消息类型的参数 data。当 "chatter" 主题发布新的消息时,ROS 将调用此回调函数,并将消息作为参数传递给函数。

  3. def listener():

    这是一个函数,用于实现节点的主要逻辑。在此示例中,我们创建了一个名为 listener 的函数,用于订阅 "chatter" 主题并输出接收到的消息。

  4. rospy.init_node('listener', anonymous=True)

    ```rospy.init_node函数用于初始化 ROS节点。在此示例中,我们将节点的名称设置为 "listener",并将anonymous参数设置为True`,以便在多个节点启动时避免节点名称冲突。

  5. rospy.Subscriber('chatter', String, callback)

    ```rospy.Subscriber类用于创建一个订阅者对象,用于接收指定主题的 ROS 消息。在此示例中,我们创建了一个名为rospy.Subscriber的订阅者对象,并将其绑定到名为 "chatter" 的主题上。我们还指定了消息类型为std_msgs.msg.String,回调函数为 callback`。

  6. rospy.spin()

    ```rospy.spin函数用于保持节点处于活动状态,以便能够接收 ROS 消息。在此示例中,我们使用rospy.spin` 函数使节点保持活动状态,以便能够接收 "chatter" 主题的消息。

  7. if __name__ == '__main__':

    这是 Python 中的一个特殊语句,用于检查当前脚本是否正在作为主程序运行。如果是,则执行以下代码;如果不是,则不执行以下代码。

  8. listener()

    在 if __name__ == '__main__': 语句块中,我们调用 listener() 函数,以便启动节点的主要逻辑。

综上所述,这个 ROS 节点的主要逻辑是订阅 "chatter" 主题并输出接收到的消息。在节点的 listener 函数中,我们首先使用 rospy.init_node 函数初始化 ROS 节点,并将节点的名称设置为 "listener"。接下来,我们使用 rospy.Subscriber 类创建了一个名为 rospy.Subscriber 的订阅者对象,并将其绑定到名为 "chatter" 的主题上。我们还指定了消息类型为 std_msgs.msg.String,回调函数为 callback。在回调函数 callback 中,我们使用 rospy.loginfo 函数输出接收到的消息内容到 ROS 日志窗口中。最后,我们使用 rospy.spin 函数使节点保持活动状态,以便能够接收 "chatter" 主题的消息。

在 if __name__ == '__main__': 语句块中,我们使用 listener() 函数调用启动节点的主要逻辑。当节点开始运行时,它将自动订阅 "chatter" 主题,并等待接收该主题发布的消息。当 "chatter" 主题发布新的消息时,节点将调用 callback 回调函数,并将消息作为参数传递给函数,函数将消息内容输出到 ROS 日志窗口中。节点将一直运行,直到被终止或出现致命错误。

 编辑CMakeLists.txt 文件添加内容

catkin_install_python(PROGRAMS scripts/talker.py scripts/listener.py
 DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

 

 然后按esc 然后输入:wq 保存退出

执行命令:

cd ~/catkin_ws/ && catkin_make -j1 

 然后分别新建三个终端,分别执行命令:

roscore
rosrun beginner_tutorials talker.py
rosrun beginner_tutorials listener.py 

效果:

最后创建虚拟机快照,以后出问题,恢复到这个的快照。ok

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++/R 期末冲刺3h

C 1. 基础程序 #include "iostream" // C头文件 #include "stdio.h" // C 头文件 //using namespace std; // 命名空间// main() 是程序开始执行的地方int main() {std::cout << "Hello, World!" << "\n";return 0; …

【数据结构】线性结构 之 顺序表

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;数据结构与算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 顺序表概念及结构 静态代码实现&#xff1a; 动态代码实现&#xff1a; SeqList.h文件 SeqLi…

使用VitePress和Github搭建个人博客网站,可以自动构建和发布

之前我们写过一篇关于如何自动构建和发布个人博客的文章&#xff0c;当时是使用VuePress和GitLab。GitLab持续集成部署CI/CD初探&#xff1a;如何自动构建和发布个人前端博客 现在换了Vue3和Vite&#xff0c;使用VitePress在Github上又搭建了一个博客。博客地址&#xff1a; …

博弈Ai官网ChatGPT能力真实测评

链接&#xff1a;https://chat.bo-e.com/&#xff08;基于ChatGPT4和3.5研发的智能聊天机器人国产镜像&#xff09; 一&#xff0c;博弈Ai的UI设计样式 1、博弈Ai&#xff08;ChatGPT&#xff09;白天模式 2、博弈Ai&#xff08;ChatGPT&#xff09;黑天模式 3、博弈Ai&#x…

五、c++学习(加餐1:汇编基础学习)

经过前面几节课的学习&#xff0c;我们在一些地方都会使用汇编来分析&#xff0c;我们学习汇编&#xff0c;只是学习一些基础&#xff0c;主要是在我们需要深入分析语法的时候&#xff0c;使用汇编分析&#xff0c;这样会让我们更熟悉c编译器和语法。 从这节课开始&#xff0c…

【003hive基础】hive的数据类型

文章目录 一.数据类型1. 基础数据类型2. 复杂数据类型 二. 显式转换与隐式转换三. hive的读时模式 一.数据类型 1. 基础数据类型 2. 复杂数据类型 array: 有序相同数据类型的集合。 arrays(1, 2)map : key必须是基本数据类型&#xff0c;value不限。 map(‘a’, 1, ‘b’, 2)s…

线性回归、正规方程和梯度下降法

一、线性回归简介 1.定义与公式 线性回归是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。 特点&#xff1a;只有一个自变量的情况称为单变量回归&#xff0c;多余一个自变量情况的叫做多元回归 通用公式&#xff1a; y …

javascript基础三:谈谈 JavaScript 中的类型转换机制

一、概述 JS中有六种简单数据类型&#xff1a;undefined、null、boolean、string、number、symbol&#xff0c;以及引用类型&#xff1a;object 但是我们在声明的时候只有一种数据类型&#xff0c;只有到运行期间才会确定当前类型 let name y?allen:1上面代码中&#xff0c…

2023年NOC大赛创客智慧编程赛项Python 复赛模拟题(二)

题目来自:NOC 大赛创客智慧编程赛项Python 复赛模拟题(二) NOC大赛创客智慧编程赛项Python 复赛模拟题(二) 第一题: 编写一个成绩评价系统,当输入语文、数学和英语三门课程成绩时,输出三门课程总成绩及其等级。 (1)程序提示用户输入三个数字,数字分别表示语文、数学、…

ChatGPT-4 镜像网站推荐

文章目录 1. TomChat2. Ai Doge3. 二狗问答4. 小莓用AI5. Ora6. 未知名字7. VIVI-AI8. ATALK9. ChatGPT Web10 AIchatOS 什么是ChatGPT? ChatGPT&#xff0c;全称&#xff1a;聊天生成预训练转换器&#xff08;英语&#xff1a;Chat Generative Pre-trained Transformer&#…

抓取领域相关论文及摘要

抓取规划问题是指确定物体与手指间的一系列接触位置&#xff0c;使得手指能抵抗任意外力且灵活操作物体的能力。传统的基于分析的抓取规划需要根据已知的被抓物体模型根据力闭合的条件判断抓取的好&#xff0c;这种方法只适合对已知的物体进行抓取。 然而日常生活中有很多相似…

MyBatis 中的动态 SQL 是什么?它的作用是什么?

MyBatis 中的动态 SQL 是一种允许在 SQL 语句中根据不同的条件动态生成 SQL 语句的技术。它可以根据不同的条件生成不同的 SQL 语句&#xff0c;从而达到灵活构建 SQL 语句的目的。动态 SQL 可以减少代码的重复度&#xff0c;提高代码的可维护性和可读性。 动态 SQL 使用 OGNL…

如何在MyBatis中处理复杂结果集映射关系

文章目录 前言一、 准备工作二、resultMap处理字段和属性的映射关系三、多对一映射0、级联方式处理映射关系1、使用association处理映射关系2、分步查询解决多对一关系(1) 查询员工信息(2) 根据员工所对应的部门id查询部门信息延迟加载 三、一对多的关系处理0、使用collection来…

6.1 SpringBoot解决跨域,我推荐这2种超实用方案

文章目录 前言一、验证跨域1. 添加index.html2. 增加/auth/test/cors接口3. IDEA启动多个springboot项目4. 验证POST方法5. 验证OPTIONS方法 二、拦截器方案定义拦截器注册拦截器&#xff0c;并指定拦截规则 三、过滤器方案总结最后 前言 在文章【2-2】中&#xff0c;我和你介…

获取企业服务超市企业信息

地址&#xff1a; 服务机构-苏州工业园区企业服务超市 import os from datetime import datetime from urllib import request import pandas as pd import re import requests from lxml import etree from bs4 import BeautifulSoup import csv import codecs# 20230521 根据…

learn_C_deep_13 (深刻理解宏定义)

目录 宏定义 数值宏常量 字符串宏常量 用定义充当注释符号宏 用 define 宏定义表达式 宏定义中的空格 宏定义 数值宏常量 在C语言中&#xff0c;宏定义可以用于定义数值宏常量。数值宏常量是一个值&#xff0c;在宏定义中用一个常量名称来表示&#xff0c;该值在后续的代…

计算机视觉的应用5-利用PCA降维方法实现简易人脸识别模型

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用5-利用PCA降维方法实现简易人脸识别模型&#xff0c;本文将介绍如何使用主成分分析&#xff08;PCA&#xff09;实现简易的人脸识别模型。首先&#xff0c;我们将简要介绍PCA的原理及其在人脸识别中…

26 KVM热迁移虚拟机

文章目录 26 KVM热迁移虚拟机26.1 总体介绍26.1.1 概述26.1.2 应用场景26.1.3 注意事项和约束限制 26.2 热迁移操作26.2.1 前提条件26.2.2 热迁移脏页率预测&#xff08;可选&#xff09;26.2.3 设置热迁移参数&#xff08;可选&#xff09;26.2.4 热迁移操作&#xff08;共享存…

Linux:文本三剑客之awk

Linux&#xff1a;文本三剑客之awk 一、awk编辑器1.1 awk概述1.2 awk工作原理1.3 awk与sed的区别 二、awk的应用2.1 命令格式2.2 awk常见的内建变量&#xff08;可直接用&#xff09; 三、awk使用3.1 按行输出文本3.2 按字段输出文本3.3 通过管道、双引号调用 Shell 命令 一、a…

【模电实验】日光灯电路及功率因数的提高

实验4 日光灯电路及功率因数的提高 一、实验目的 1&#xff0e;理解提高功率因数的意义并掌握其方法。 2&#xff0e;掌握日光灯电路的联接。 二、原理说明 日光灯电路结构及工作原理 日光灯电路如图4-1所示&#xff0c;日光灯由灯管、镇流器和启辉器三部分组成。 &…