ROS笔记之visualization_msgs-Marker学习

ROS笔记之visualization_msgs-Marker学习

在这里插入图片描述

code review!

文章目录

  • ROS笔记之visualization_msgs-Marker学习
    • 一.line_strip例程
    • 二.line_list例程一
    • 二.line_list例程二
    • 二.TEXT_VIEW_FACING例程
    • 三.附CMakeLists.txt和package.xml
    • 五.关于odom、base_link和map坐标系
    • 六.关于visualization_msgs/Marker 的 frame_locked
    • 七.visualization_msgs/Marker 的 lifetime
    • 八.visualization_msgs/Marker 的action
    • 九.visualization_msgs/Marker消息的一些重要字段
    • 十.visualization_msgs/Marker 的 Line Strip 和 Line List
    • 十一.visualization_msgs::MarkerArray详解
    • 十一.visualization_msgs::MarkerArray例程一
    • 十二.visualization_msgs::MarkerArray例程二

一.line_strip例程

运行
在这里插入图片描述

main.cc

#include <geometry_msgs/Point.h>
#include <ros/ros.h>
#include <visualization_msgs/Marker.h>int main(int argc, char **argv) {ros::init(argc, argv, "marker_publisher");ros::NodeHandle nh;ros::Publisher marker_pub = nh.advertise<visualization_msgs::Marker>("visualization_marker", 10);// 创建一个Line Stripvisualization_msgs::Marker line_strip;line_strip.header.frame_id = "base_link";line_strip.header.stamp = ros::Time::now();line_strip.ns = "line_strip";line_strip.action = visualization_msgs::Marker::ADD;line_strip.type = visualization_msgs::Marker::LINE_STRIP;line_strip.pose.orientation.w = 1.0;line_strip.scale.x = 0.1; // 线宽度line_strip.color.r = 1.0; // 线颜色为红色line_strip.color.a = 1.0; // 不透明度为1.0// 添加线段的点geometry_msgs::Point point1;point1.x = 0.0;point1.y = 0.0;point1.z = 0.0;line_strip.points.push_back(point1);geometry_msgs::Point point2;point2.x = 1.0;point2.y = 1.0;point2.z = 0.0;line_strip.points.push_back(point2);geometry_msgs::Point point3;point3.x = 2.0;point3.y = -1.0;point3.z = 0.0;line_strip.points.push_back(point3);while (ros::ok()) {// 发布Line List消息marker_pub.publish(line_strip);ros::spinOnce();}return 0;
}

二.line_list例程一

运行
在这里插入图片描述

main.cc

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>int main(int argc, char** argv)
{ros::init(argc, argv, "line_list_publisher");ros::NodeHandle nh;ros::Publisher marker_pub = nh.advertise<visualization_msgs::Marker>("visualization_marker", 10);// 创建Line List消息visualization_msgs::Marker line_list;line_list.header.frame_id = "map";  // 设置坐标系line_list.header.stamp = ros::Time::now();line_list.ns = "line_list";line_list.action = visualization_msgs::Marker::ADD;line_list.type = visualization_msgs::Marker::LINE_LIST;line_list.scale.x = 0.1;  // 设置线段宽度line_list.color.r = 0.0;line_list.color.g = 1.0;line_list.color.b = 0.0;line_list.color.a = 1.0;// 添加线段1的顶点geometry_msgs::Point p1, p2;p1.x = 0.0;p1.y = 0.0;p1.z = 0.0;p2.x = 1.0;p2.y = 0.0;p2.z = 0.0;// 添加线段2的顶点geometry_msgs::Point p3, p4;p3.x = 1.0;p3.y = 1.0;p3.z = 0.0;p4.x = 0.0;p4.y = 1.0;p4.z = 0.0;// 添加线段1的两个顶点line_list.points.push_back(p1);line_list.points.push_back(p2);// 添加线段2的两个顶点line_list.points.push_back(p3);line_list.points.push_back(p4);ros::Rate rate(10);  // 发布频率为10Hzwhile (ros::ok()) {// 发布Line List消息marker_pub.publish(line_list);ros::spinOnce();rate.sleep();}return 0;
}

二.line_list例程二

运行
在这里插入图片描述

main.cc

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>int main(int argc, char** argv)
{ros::init(argc, argv, "line_list_publisher");ros::NodeHandle nh;ros::Publisher marker_pub = nh.advertise<visualization_msgs::Marker>("visualization_marker", 10);// 创建Line List消息visualization_msgs::Marker line_list;line_list.header.frame_id = "map";  // 设置坐标系line_list.header.stamp = ros::Time::now();line_list.ns = "line_list";line_list.action = visualization_msgs::Marker::ADD;line_list.type = visualization_msgs::Marker::LINE_LIST;line_list.scale.x = 0.1;  // 设置线段宽度line_list.color.r = 0.0;line_list.color.g = 1.0;line_list.color.b = 0.0;line_list.color.a = 1.0;// 添加线段的顶点geometry_msgs::Point p1, p2, p3, p4;p1.x = 0.0;p1.y = 0.0;p1.z = 0.0;p2.x = 1.0;p2.y = 0.0;p2.z = 0.0;p3.x = 1.0;p3.y = 1.0;p3.z = 0.0;p4.x = 0.0;p4.y = 1.0;p4.z = 0.0;// 添加线段的顶点到Line List消息中line_list.points.push_back(p1);line_list.points.push_back(p2);line_list.points.push_back(p2);line_list.points.push_back(p3);line_list.points.push_back(p3);line_list.points.push_back(p4);line_list.points.push_back(p4);line_list.points.push_back(p1);ros::Rate rate(10);  // 发布频率为10Hzwhile (ros::ok()) {// 发布Line List消息marker_pub.publish(line_list);ros::spinOnce();rate.sleep();}return 0;
}

二.TEXT_VIEW_FACING例程

运行
在这里插入图片描述

main.cc

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>int main(int argc, char** argv)
{ros::init(argc, argv, "text_marker_publisher");ros::NodeHandle nh;ros::Publisher marker_pub = nh.advertise<visualization_msgs::Marker>("visualization_marker", 10);// 创建Marker消息visualization_msgs::Marker text_marker;text_marker.header.frame_id = "map";  // 设置坐标系text_marker.header.stamp = ros::Time::now();text_marker.ns = "text_marker";text_marker.action = visualization_msgs::Marker::ADD;text_marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING;text_marker.pose.position.x = 1.0;  // 设置文字位置text_marker.pose.position.y = 1.0;text_marker.pose.position.z = 0.0;text_marker.pose.orientation.w = 1.0;text_marker.scale.z = 0.5;  // 设置文字大小text_marker.color.r = 0.0;  // 设置颜色为红色text_marker.color.g = 1.0;text_marker.color.b = 1.0;text_marker.color.a = 1.0;text_marker.text = "Hello, RViz!";  // 设置要显示的文字内容ros::Rate rate(10);  // 发布频率为10Hzwhile (ros::ok()) {// 发布Marker消息marker_pub.publish(text_marker);ros::spinOnce();rate.sleep();}return 0;
}

三.附CMakeLists.txt和package.xml

文件结构
在这里插入图片描述

附CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(ros_templete)  # Replace with your package namefind_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)catkin_package(INCLUDE_DIRS src/incCATKIN_DEPENDS roscpp std_msgs
)include_directories(${catkin_INCLUDE_DIRS}src/inc
)add_executable(visualization_nodesrc/cc/main.cc
)target_link_libraries(visualization_node${catkin_LIBRARIES}
)install(TARGETS visualization_nodeRUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

附package.xml

<?xml version="1.0"?>
<package format="2"><name>ros_templete</name><version>0.0.0</version><description>>ROS package for handling messages</description><maintainer email="user@todo.todo">user</maintainer><license>TODO</license><build_export_depend>message_generation</build_export_depend><exec_depend>message_runtime</exec_depend><build_depend>newrizon_msgs</build_depend><build_export_depend>newrizon_msgs</build_export_depend><exec_depend>newrizon_msgs</exec_depend><buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>std_msgs</build_depend><!-- 添加其他功能包的依赖项,如果需要的话 --><exec_depend>roscpp</exec_depend><exec_depend>std_msgs</exec_depend><!-- 添加其他功能包的依赖项,如果需要的话 -->
</package>

五.关于odom、base_link和map坐标系

在ROS中,odombase_linkmap是常见的坐标系(frame)用于机器人定位和导航。

  1. odom(odometry)坐标系:odom坐标系是机器人的里程计坐标系,表示机器人相对于起始位置的运动。odom坐标系通常由里程计传感器(如编码器)提供的运动信息计算得出,并且在运动过程中会累积误差。因此,odom坐标系相对于真实世界可能存在一些漂移或误差。在机器人导航中,通常使用odom坐标系作为局部坐标系。

  2. base_link坐标系:base_link坐标系是机器人的本体坐标系(或称为机器人坐标系),它是与机器人自身的物理结构对应的坐标系。base_link坐标系通常位于机器人的底盘或底座的几何中心,用于表示机器人的位置和姿态。它是机器人的本体参考坐标系,与机器人的移动无关。

  3. map坐标系:map坐标系是全局地图坐标系,表示机器人所在的全局环境或地图。map坐标系的原点通常是事先设定好的参考点,可以是某个固定的地标或起始位置。map坐标系提供了一个固定的参考框架,用于定位和导航机器人在全局环境中的位置。

在机器人导航中,通常会使用传感器数据(如激光雷达、视觉传感器等)来感知周围环境,并使用算法(如SLAM)来建立地图并定位机器人。通过将base_link坐标系相对于odom坐标系的运动与地图进行对齐,可以得到机器人在全局环境中的位置估计,即机器人在map坐标系中的位姿。

总结:

  • odom坐标系是机器人的里程计坐标系,相对于起始位置的运动。
  • base_link坐标系是机器人的本体坐标系,与机器人的移动无关。
  • map坐标系是机器人所在的全局地图坐标系,提供了固定的参考框架用于定位和导航机器人在全局环境中的位置。

六.关于visualization_msgs/Marker 的 frame_locked

在RViz中,visualization_msgs/Marker消息的frame_locked字段用于指定Marker是否锁定其坐标系框架。

frame_locked字段设置为true时,表示Marker的坐标系框架将被锁定,即Marker将始终在其指定的坐标系中显示,无论相机如何移动或旋转。

frame_locked字段设置为false时,表示Marker的坐标系框架将与相机坐标系相对,即Marker将随着相机的移动和旋转而相应地调整其位置和姿态。

以下是一个示例,展示了如何设置frame_locked字段:

visualization_msgs::Marker marker;
// 设置其他字段
marker.frame_locked = true;  // 锁定Marker的坐标系框架
marker_pub.publish(marker);

在上述示例中,我们创建了一个visualization_msgs::Marker对象,并设置了其他字段。然后,我们将frame_locked字段设置为true,以锁定Marker的坐标系框架。最后,我们使用marker_pub.publish(marker)将Marker发布到visualization_marker话题上。

通过设置适当的frame_locked值,可以控制Marker在RViz中是否锁定其坐标系框架。这可以影响Marker的位置和姿态如何与相机的移动和旋转相对应。

请注意,默认情况下,frame_locked字段的值为false,这意味着Marker的坐标系框架将与相机坐标系相对。如果需要固定Marker在其指定的坐标系中显示,可以将frame_locked字段设置为true

总结起来,通过设置frame_locked字段,您可以控制Marker是否锁定其坐标系框架,以便在RViz中根据需要调整Marker的位置和姿态。

七.visualization_msgs/Marker 的 lifetime

在RViz中,visualization_msgs/Marker消息的lifetime字段用于指定Marker的显示时间。lifetime字段是一个rospy.Duration类型的值,表示Marker在RViz中显示的持续时间。

当发布一个Marker消息时,RViz将根据lifetime字段的值来确定Marker的显示时间。一旦超过指定的持续时间,RViz将自动将Marker从显示中移除。

以下是一个示例,展示了如何设置lifetime字段:

visualization_msgs::Marker marker;
// 设置其他字段
marker.lifetime = ros::Duration(5.0);  // 设置显示时间为5秒
marker_pub.publish(marker);

在上述示例中,我们创建了一个visualization_msgs::Marker对象,并设置了其他字段。然后,我们使用ros::Duration类创建一个持续时间为5秒的ros::Duration对象,并将其赋值给lifetime字段。最后,我们使用marker_pub.publish(marker)将Marker发布到visualization_marker话题上。

通过设置适当的lifetime值,可以控制Marker在RViz中显示的持续时间。一旦超过指定的时间,RViz将自动将Marker从显示中移除。

请注意,如果将lifetime字段设置为0,表示Marker应该一直保持显示,直到通过发布DELETE操作或DELETEALL操作来明确删除它。这对于需要手动控制Marker的显示和隐藏非常有用。

总结起来,lifetime字段允许您控制在RViz中显示Marker的持续时间,使您能够根据需要定制Marker的显示时间。

八.visualization_msgs/Marker 的action

在ROS中,visualization_msgs/Marker消息的action字段用于指定在RViz中如何处理Marker。action字段的值可以是以下几种之一:

  • visualization_msgs::Marker::ADD:将Marker添加到可视化工具中。如果指定的id在可视化工具中已经存在,将替换现有的Marker。
  • visualization_msgs::Marker::DELETE:删除指定id的Marker。如果指定的id在可视化工具中不存在,操作被忽略。
  • visualization_msgs::Marker::DELETEALL:删除所有属于该命名空间(ns字段)的Marker。

通过使用不同的action值,可以在RViz中动态地添加、更新或删除Marker。

以下是一些示例,展示了如何使用不同的action值操作Marker:

  1. 添加一个新的Marker:
visualization_msgs::Marker marker;
// 设置其他字段
marker.action = visualization_msgs::Marker::ADD;
marker_pub.publish(marker);
  1. 更新现有的Marker:
visualization_msgs::Marker marker;
// 设置其他字段
marker.action = visualization_msgs::Marker::ADD;  // 使用ADD操作确保更新现有Marker
marker_pub.publish(marker);
  1. 删除特定id的Marker:
visualization_msgs::Marker marker;
marker.id = 1;  // 要删除的Marker的id
// 其他字段可以为空,因为删除操作不需要其他信息
marker.action = visualization_msgs::Marker::DELETE;
marker_pub.publish(marker);
  1. 删除所有属于特定命名空间的Marker:
visualization_msgs::Marker marker;
marker.ns = "my_namespace";  // 要删除的Marker所属的命名空间
// 其他字段可以为空,因为删除操作不需要其他信息
marker.action = visualization_msgs::Marker::DELETEALL;
marker_pub.publish(marker);

在上述示例中,我们创建了一个visualization_msgs/Marker对象,并设置了其他字段,然后将action字段设置为适当的值。最后,我们使用marker_pub.publish(marker)将Marker发布到visualization_marker话题上,以便在RViz中执行所需的操作。

请注意,当使用DELETE或DELETEALL操作删除Marker时,只需设置idns字段即可。其他字段可以为空,因为删除操作不需要这些信息。

通过使用适当的action值,您可以根据需要在RViz中添加、更新或删除Marker,从而实现对可视化对象的动态控制。

九.visualization_msgs/Marker消息的一些重要字段

下面是visualization_msgs/Marker消息的一些重要字段:

  • header:消息的头部信息,包括frame_id和timestamp等。
  • ns:命名空间,用于将Marker分组。
  • id:Marker的唯一标识符,用于标识不同的Marker。
  • type:Marker的类型,指定要显示的形状。可以使用visualization_ms- gs/Marker消息定义的常量来设置,如visualization_msgs::Marker::S- PHERE表示球体。
  • action:Marker的操作类型,指定在RViz中如何处理该Marker。常见的- 操作类型包括ADD、DELETE和DELETEALL。
  • pose:Marker的位姿,指定Marker在三维空间中的位置和方向。
  • scale:Marker的尺寸,用于控制Marker的大小或线宽等属性。
  • color:Marker的颜色,可以设置RGBA值来指定颜色和不透明度。
  • points:用于线条和多边形等形状的点列表。每个点由geometry_msgs/- Point消息表示。
  • text:用于文本形状的字符串内容。
  • lifetime:Marker的生命周期,用于控制Marker在RViz中的显示时间。

十.visualization_msgs/Marker 的 Line Strip 和 Line List

在RViz中,visualization_msgs/Marker消息类型可用于可视化各种图形对象,包括线条(Line Strip)和线段列表(Line List)。这些对象用于在3D环境中呈现线条或连接多个线段。

  • Line Strip(线条):Line Strip由一系列连接的线段组成,线段之间按照顺序连接。在RViz中,它们通常用于表示路径、轨迹或连续的线条。每个线段都由两个点定义,相邻线段之间共享一个点。

  • Line List(线段列表):Line List由多个独立的线段组成,每个线段由两个点定义。在RViz中,它们通常用于表示离散的线段集合,每个线段之间都是独立的。可以使用Line List来可视化多个不相连的线段。

十一.visualization_msgs::MarkerArray详解

visualization_msgs::MarkerArray是ROS中的消息类型,用于在RViz中发布多个Marker的数组。

visualization_msgs::MarkerArray消息由以下字段组成:

  • markersstd::vector<visualization_msgs::Marker>):包含多个visualization_msgs::Marker对象的数组。每个Marker对象都描述了一个可视化元素,如点、线、箭头、文本等。

通过使用visualization_msgs::MarkerArray消息,您可以同时发布多个Marker,并在RViz中以数组的形式显示它们。

以下是一个示例,展示了如何创建和使用visualization_msgs::MarkerArray消息:

#include <ros/ros.h>
#include <visualization_msgs/MarkerArray.h>int main(int argc, char** argv)
{ros::init(argc, argv, "marker_array_publisher");ros::NodeHandle nh;ros::Publisher marker_array_pub = nh.advertise<visualization_msgs::MarkerArray>("marker_array_topic", 10);visualization_msgs::MarkerArray marker_array;// 创建第一个Markervisualization_msgs::Marker marker1;// 设置marker1的各种字段marker_array.markers.push_back(marker1);// 创建第二个Markervisualization_msgs::Marker marker2;// 设置marker2的各种字段marker_array.markers.push_back(marker2);// 发布MarkerArraymarker_array_pub.publish(marker_array);ros::spin();return 0;
}

在上述示例中,我们包含了所需的头文件和ROS节点的初始化。然后,我们创建了一个ros::Publisher对象来发布visualization_msgs::MarkerArray消息。接下来,我们创建了一个visualization_msgs::MarkerArray对象,并向其中添加两个visualization_msgs::Marker对象。每个Marker对象可以设置其字段,例如typeposescale等。最后,我们使用marker_array_pub.publish(marker_array)MarkerArray消息发布到marker_array_topic话题上。

通过发布visualization_msgs::MarkerArray消息,RViz将会显示数组中的每个Marker,并根据各自的参数进行渲染和显示。

总结起来,visualization_msgs::MarkerArray消息允许您在RViz中同时发布和显示多个Marker。您可以通过填充markers字段来创建Marker数组,并通过发布MarkerArray消息将其发送到适当的话题上。

十一.visualization_msgs::MarkerArray例程一

运行
在这里插入图片描述

main.cc

#include <ros/ros.h>
#include <visualization_msgs/MarkerArray.h>int main(int argc, char** argv)
{ros::init(argc, argv, "marker_array_publisher");ros::NodeHandle nh;ros::Publisher marker_array_pub = nh.advertise<visualization_msgs::MarkerArray>("marker_array", 10);// 创建MarkerArray消息visualization_msgs::MarkerArray marker_array;// 创建第一个Markervisualization_msgs::Marker marker1;marker1.header.frame_id = "map";marker1.header.stamp = ros::Time::now();marker1.ns = "marker_array";marker1.id = 1;marker1.type = visualization_msgs::Marker::SPHERE;marker1.pose.position.x = 1.0;marker1.pose.position.y = 2.0;marker1.pose.position.z = 0.0;marker1.pose.orientation.w = 1.0;marker1.scale.x = 0.5;marker1.scale.y = 0.5;marker1.scale.z = 0.5;marker1.color.r = 1.0;marker1.color.g = 0.0;marker1.color.b = 0.0;marker1.color.a = 1.0;marker_array.markers.push_back(marker1);// 创建第二个Markervisualization_msgs::Marker marker2;marker2.header.frame_id = "map";marker2.header.stamp = ros::Time::now();marker2.ns = "marker_array";marker2.id = 2;marker2.type = visualization_msgs::Marker::CUBE;marker2.pose.position.x = -1.0;marker2.pose.position.y = 2.0;marker2.pose.position.z = 0.0;marker2.pose.orientation.w = 1.0;marker2.scale.x = 0.5;marker2.scale.y = 0.5;marker2.scale.z = 0.5;marker2.color.r = 0.0;marker2.color.g = 1.0;marker2.color.b = 0.0;marker2.color.a = 1.0;marker_array.markers.push_back(marker2);ros::Rate rate(1);  // 发布频率为1Hzwhile (ros::ok()) {// 发布MarkerArray消息marker_array_pub.publish(marker_array);ros::spinOnce();rate.sleep();}return 0;
}

十二.visualization_msgs::MarkerArray例程二

运行
请添加图片描述

main.cc

#include <ros/ros.h>
#include <visualization_msgs/MarkerArray.h>
#include <visualization_msgs/Marker.h>int main(int argc, char** argv)
{ros::init(argc, argv, "marker_publisher");ros::NodeHandle nh;ros::Publisher marker_array_pub = nh.advertise<visualization_msgs::MarkerArray>("marker_array", 10);ros::Publisher marker_pub = nh.advertise<visualization_msgs::Marker>("marker", 10);// 创建MarkerArray消息visualization_msgs::MarkerArray marker_array;// 创建第一个Markervisualization_msgs::Marker marker1;marker1.header.frame_id = "map";marker1.header.stamp = ros::Time::now();marker1.lifetime = ros::Duration();  // 设置持久化属性为falsemarker1.ns = "marker1";marker1.id = 1;marker1.type = visualization_msgs::Marker::SPHERE;marker1.pose.position.x = 1.0;marker1.pose.position.y = 2.0;marker1.pose.position.z = 0.0;marker1.pose.orientation.w = 1.0;marker1.scale.x = 0.5;marker1.scale.y = 0.5;marker1.scale.z = 0.5;marker1.color.r = 1.0;marker1.color.g = 0.0;marker1.color.b = 0.0;marker1.color.a = 1.0;// 创建第二个Markervisualization_msgs::Marker marker2;marker2.header.frame_id = "map";marker2.header.stamp = ros::Time::now();marker2.lifetime = ros::Duration();  // 设置持久化属性为falsemarker2.ns = "marker2";marker2.id = 2;marker2.type = visualization_msgs::Marker::CUBE;marker2.pose.position.x = -1.0;marker2.pose.position.y = 2.0;marker2.pose.position.z = 0.0;marker2.pose.orientation.w = 1.0;marker2.scale.x = 0.5;marker2.scale.y = 0.5;marker2.scale.z = 0.5;marker2.color.r = 0.0;marker2.color.g = 1.0;marker2.color.b = 0.0;marker2.color.a = 1.0;marker_array.markers.clear();marker_array.markers.push_back(marker1);marker_array.markers.push_back(marker2);ros::Rate rate(1);  // 发布频率为1Hzwhile (ros::ok()) {// 发布MarkerArray消息marker_array_pub.publish(marker_array);// 发布单个Marker消息marker_pub.publish(marker1);ros::spinOnce();rate.sleep();}return 0;
}

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

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

相关文章

TCP / UDP 概念 + 实验(计网自顶向下)

Github源码 moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 暂定打算分2步走&#xff0c;前置是中科大对应计网黑书的视频 第1步完成14个Wire…

设置Ubuntu 20.04的静态IP地址(wifi模式下)

一、引言 自己家用的Ubuntu的&#xff0c;重启后ip地址经常会改变&#xff0c;这个时候就需要我们手动配置静态IP了。 二、优点 给Ubuntu设置一个静态IP地址有以下几个好处&#xff1a; 持久性&#xff1a;静态IP地址是固定不变的&#xff0c;与设备的MAC地址绑定。这意味着…

【广州华锐视点】VR飞行员驾驶模拟实训系统

VR飞行员驾驶模拟实训系统是一种基于虚拟现实技术的航空装备仿真测试技术&#xff0c;可以用于飞行员、乘务员和机务人员的训练。该系统可以模拟真实的飞行环境&#xff0c;包括天气、地形、飞机性能等&#xff0c;使被试者能够在虚拟环境中进行飞行操作&#xff0c;从而提高其…

SSH安全登录远程主机

SSH服务器简介 SSH即Security SHell的意思&#xff0c;它可以将连线的封包进行加密技术&#xff0c;之后进行传输&#xff0c;因此相当的安全。 SSH是一种协议标准&#xff0c;其目的是实现安全远程登录以及其它安全网络服务。 SSH协定&#xff0c;在预设的状态下&#xff0c;…

11月14号|Move生态Meetup相约浪漫土耳其

Move是基于Rust编程语言&#xff0c;由Mysten Labs联合创始人兼CTO Sam Blackshear在Meta的Libra项目中开发而来&#xff0c;旨在为开发者提供比现有区块链语言更通用的开发语言。Sam的目标是创建Web3的JavaScript&#xff0c;即一种跨平台语言&#xff0c;使开发人员能够在多个…

C++设计模式_17_Mediator 中介者

Mediator 中介者也是属于“接口隔离”模式。 文章目录 1. 动机 (Motivation)2. 模式定义3. 结构(Structure)4. 要点总结5. 其他参考 1. 动机 (Motivation) 在软件构建过程中&#xff0c;经常会出现多个对象互相关联交互的情况&#xff0c;对象之间常常会维持一种复杂的引用关系…

HCIA数据通信——基础设备配置

想了想&#xff0c;为了方便回顾复习&#xff0c;将理论和实践结合起来才是正确的&#xff0c;不然一边理论&#xff0c;又单独做实验这样不方便。 因此之前的文章都删了&#xff0c;还是以华为从头开始吧&#xff01;实验与理论应用结合起来做。 一&#xff0c;查看设备信息 …

解密Kubernetes:探索开源容器编排工具的内核

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【人脸检测 FPS 1000+】ubuntu下libfacedetection tensorrt部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

《SpringBoot项目实战》第一篇—接口参数的一些弯弯绕绕

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址&#xff1a;summo-springboot-interface-demo 前言 大家好&#xff01;…

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具&#xff0c;可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月&#xff0c;就有一个新版本&#xff0c;其官网是&#xff1a; https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…

Harmony 个人中心(页面交互、跳转、导航、容器组件)

个人中心 前言正文一、创建工程二、登录① 更换启动页面② 拓展修饰符③ 页面跳转④ 等待进度条 三、导航栏四、首页① 轮播图② 网格列表 五、我的① 带参数跳转 六、源码 前言 今天是1024&#xff0c;祝各位程序员们&#xff0c;钱多事少离家近&#xff0c;不秃也强bug黄。在…

mac系统u盘启动盘制作教程,更新至macOS Sonoma 14

mac系统怎么制作装系统的u盘,如果您要在多台电脑上安装 macOS&#xff0c;而又不想每次都下载安装器&#xff0c;这时可引导安装器就会很有用。一起来看苹果电脑u盘启动盘制作教程吧。 Macos系统安装包合集包揽macos 10.15&#xff0c;macos 11和苹果最新系统等多个版本 1、A…

H5游戏分享-全民找房祖名qmxzfzm

H5游戏分享-全民找房祖名qmxzfzm 一开始就比较简单 后面就会越来越难&#xff0c;而且也有时间限制 游戏的源码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,ini…

嵌入式实时操作系统的设计与开发(消息)

消息 从概念上讲&#xff0c;消息机制和邮箱机制很类似&#xff0c;区别在于邮箱一般只能容纳一条消息&#xff0c;而消息则会包含一系列的消息。 系统定义了一个全局变量g_msgctr_header&#xff0c;通过它可以查找到任一已创建的消息容器。 每一个消息容器都可以根据其参数…

C++之左值、右值、std::forward、std::move总结(二百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Android Studio 导出 jar

AS版本&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

react-高阶组件

一、什么是高阶组件 高阶组件&#xff08; Higher-Order Component&#xff0c;HOC &#xff09;是一个以组件作为参数&#xff0c;返回一个新组件的函数。 高阶组件最大的特点就是复用组件逻辑高阶组件本身并不是 React 的 API&#xff0c;而是React组件的一种设计模式&…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径&#xff0c;到拼雷达、算力&#xff0c;再到如今的性价比之争&#xff0c;自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年&#xff0c;黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…

windows下-mysql环境配置,以及使用navicat可视化数据库,便捷撰写sql语句。

文章目录 MySQL 连接到本地MySQL 下载MySQL连接基本SQL操作语句创建并查看数据库删除数据库修改数据库插入、删除、修改数据 图形化界面展示数据库 Navicat 基础操作连接本地的mysql数据库撰写sql语句 MySQL 连接到本地 MySQL 下载 直接系统自带应用商城下载&#xff0c;安装最…