ROS getting started

文章目录

  • 前言
  • 一、认识ROS提供的命令行工具
    • nodes
    • topics
    • services
    • parameters
    • actions
    • rqt_console, rqt_graph
    • 批量启动多个节点
    • recorde and play
    • c++基础pub-sub
  • 1.5 ROS2和fastdds
    • 1 改变订阅模式
    • 2 xml配置
    • 3 指定xml位置
    • 4 talker/listener通过发现服务器发送topic
    • 5 ros2 检视
    • 6 远程fastdds程序与ros节点通讯
  • 二、安装
  • 三、catkin编译系统
    • catkin工作空间
  • 四、colcon构建系统
  • 五、c++发布ROS包
  • - 参数
  • - 源码编译安装需要的ros humble的模块 [从ament_cmake开始]
    • 1. Python ament_package 模块安装
    • 2. ament_cmake安装
    • 根据需要进行安装
  • 参考


前言

ROS在Ubuntu的基础上实现了一套机器人操作系统框架。ROS并非是像Linux那样的操作系统,它只是连接了操作系统和你开发的ROS应用程序,所以它也算是一个中间件,基于ROS的应用程序之间建立起了沟通的桥梁,所以也是运行在Linux上的运行时环境,在这个环境上,机器人的感知、决策、控制算法可以更好的组织和运行。


一、认识ROS提供的命令行工具

启动一个节点,ros中一个节点就是一个可执行文件
ros2 run <package_name> <executable_name>

nodes

实际就是一个进程
ros2 node list
ros2 node info <node_name> # 查看节点的通讯方式pub-sub, cli-serv, action, 及其数据类型

topics

DDS中的topic

每种topic都有ROS内置的topic_type,这里(https://docs.ros.org/en/humble/Concepts/Basic/About-Interfaces.html)说明了如何定义ROS支持的数据类型。

ros2 topic list
ros2 topic list -t  # 查看所有topic及其类型
ros2 topic echo <topic_name>  # 打印topic数据
ros2 topic info <topic_name>  # 显示topic的type,pub num and sub num
ros2 interface show <msg_type> # 显示接口信息
ros2 topic pub <topic_name> <msg_type> '<args>'
ros2 topic hz <topic_name>  # 频率

services

ROS2 的 client-serve 通讯模式,类似HTTP/TCP/IP一样

ros2 service list
ros2 service list -t
ros2 service type <service_name>  # node info <node_name>看的更全
ros2 service find <type_name>     # 查看使用该type的name
ros2 interface show <type_name>   # 显示接口信息
ros2 service call <service_name> <service_type> <arguments> # 向某个服务发送请求

parameters

节点配置信息,可以是环境变量

ros2 param list
ros2 param get <node_name> <parameter_name> 
ros2 param set <node_name> <parameter_name> <value>
ros2 param dump <node_name>                   # 转存节点配置文件
ros2 param load <node_name> <parameter_file>  # 加载配置文件
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>  #启动时加载指定的配置文件(inclue read-only)

actions

Actions是ROS2中的通讯类型之一,用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
Actions建立在topics和services之上。它们的功能与服务类似,只是可以取消操作。它们还提供稳定的反馈,而不是返回单个相应的服务。
Actions使用client-server模型,“action client”节点将目标发送到“action serve”节点,该节点确认目标并返回反馈流和结果。
在这里插入图片描述
【客户端的第二次请求似乎有些多余?示例代码看上去像是:client发送请求,serv返回相应,serv返回feedback,最后serv返回result】

ros2 action list
rso2 action list -t
ros2 action info <action_name>
ros2 interface show <action_type>
ros2 action send_goal <action_name> <action_type> <values>
ros2 action send_goal /turtle1/rotate_absolute  trutlesim/action/RotateAbsolute "{theta: -1.5}" --feedback

rqt_console, rqt_graph

rqt_console可看日志
rqt_graph可看所有topic

批量启动多个节点

ros2 launch turtlesim multisim.launch.py

recorde and play

rosbag录制与回放

ros2 bag record <topic_name>
ros2 bag record -o <user_dir> <topic1> [topic2 topic3]
ros2 bag record -a  # 记录所有topic
ros2 bag info <bag_file_name>
ros2 bag play <bag_file_name>

c++基础pub-sub

  1. 利用ros提供的工具在~/ros2_ws目录下创建package
    cd ~/ro2_ws/src && ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_pub_sub --dependencies rclcpp [example_interfaces]
  2. 在生成的src目录下添加源文件publisher.cpp和subscriber.cpp
    https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_publisher/member_function.cpp
    https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_subscriber/member_function.cpp
  3. 修改CMakeLists.txt文件和package.xml文件
    由于在第1步指明了rclcpp依赖所以cma和xml文件应该已经有了该依赖,只需将其他的依赖添加进去即可
    find_package(std_msgs REQUIRED)add_executable(publisher src/publisher.cpp)
    ament_target_dependencies(publisher rclcpp std_msgs)
    add_executable(subscriber src/subscriber.cpp)
    ament_target_dependencies(subscriber rclcpp std_msgs)install(TARGETSsubscriberpublisherDESTINATION lib/${PROJECT_NAME})
    
    <depend>std_msgs</depend>
    
  4. colcon编译,安装,运行
    cd ~/ro2_ws
    colcon build
    source install/setup.bash
    ros2 run cpp_pub_sub subscriber &
    ros2 run cpp_pub_sub publisher
    

1.5 ROS2和fastdds

https://fast-dds.docs.eprosima.com/en/stable/fastdds/ros2/ros2.html

ros2与Fast-DDS之间的接口:https://github.com/ros2/rmw_fastrtps。 ROS 2只允许配置部分QoS策略,而rmw_fastrtps提供了扩展的配置功能,以充分利用Fast DDS中的功能。

设置环境变量

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

1 改变订阅模式

ROS2 的rmw_fastrtps默认使用异步发布方式。通过环境变量RMW_FASTRTPS_PUBLICATION_MODE改变模式

  • ASYNCHRONOUS: 异步发布模式。当发布者调用write操作时,数据先拷贝到队列,后台线程(异步线程)收到队列添加通知。并且在实际发送数据之前将线程的控制权返回给用户。后台线程负责使用队列并将数据发送给每个匹配的读取器。
  • SYNCHRONOUS:同步订阅模式,数据由用户线程直接发送,这意味着在写操作期间发生的任何阻塞调用都会阻塞用户线程,从而阻止应用程序继续其操作。值得注意的是,这种模式通常会在较低的延迟下产生更高的吞吐率,因为线程之间既没有通知也没有上下文切换。
  • AUTO: 让Fast DDS选择发布模式。这意味着使用XML文件中设置的发布模式,或者使用Fast DDS中设置的默认值(FastDDS默认为SYNCHRONOUS)

除了ROS 2的QOS策略外,rmw_fastrtps还提供了两个额外的配置项:

rmw_fastrtps提供的额外配置参数描述ROS2 中的默认值
MemoryManagementPolicyFast DDS为发布者和订阅者的历史记录预分配的内存。当这些历史记录填满时,会进行重新分配以保留更多内存PREALLOCATED_WITH_REALLOC_MEMORY_MODE
PublishModeQosPolicy数据是异步发送还是同步发送ASYNCHRONOUS_PUBLISH_MODE

2 xml配置

在ROS2应用中使用FastDDS的某种特性,XML配置文件能够提供广泛的QOS策略配置支持。

  • 如果rmw_QoS_profile_t(c++ object)中的任何QoS设置为*_SYSTEM_DEFAULT(c++value)以外的值,则XML中的相应值将被忽略。
  • 默认情况下,rmw_fastrtps会覆盖MemoryManagementPolicy和PublishModeQosPolicy的值。这意味着XML中为这两个参数配置的值将被忽略。这两个值会默认重写为:PREALLOCATED_WITH_READLLOC_MEMORY_MODE和ASYNCRONOS_PUBLISH_MODE。
  • 通过将环境变量RMW_FASTPS_USE_QOS_FROM_XML设置为1(其默认值为0),可以避免重写MemoryManagementPolicy和PublishModeQosPolicy。这将使rmw_fastrtps使用XML中为MemoryManagementPolicy和PublishModeQosPolicy定义的值。请记住,在XML中设置此环境变量而不设置这些策略会导致使用Fast DDS中的默认值。这些值与前面提到的rmw_fastrtps默认值不同(请参阅MemoryManagementPolicy和PublishModeQosPolicy)。
  • 设置RMW_FASTRTPS_USE_QOS_FROM_XML(环境变量)生效会覆盖任何对RMW_FASTRTPS_PUBLICATION_MODE的任何配置,使用xml的配置,如果xml每配置该项,则使用fastDDS的默认值
  1. fastdds默认值
  2. rmw_fastrtps默认值
  3. 环境变量
  4. xml
  5. RMW_FASTRTPS_USE_QOS_FROM_XML=<0/1>

真的乱
在这里插入图片描述

3 指定xml位置

使用环境变量

export FASTRTPS_DEFAULT_PROFILES_FILE=<path_to_xml_file>
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
ros2 run <package> <application>

可替代的方法:将 XML 文件放在运行的应用程序目录下,并命名为 DEFAULT_FASTRTPS_PROFILES.xml。

4 talker/listener通过发现服务器发送topic

如果过安装了ros2或者fastrtps会有一个Python脚本:fastdds
该工具可用于启动 fastdds的发现服务器

# 查看帮助
fastdds discovery -h 

让ros node通过发现服务器通讯需要设置环境变量

export ROS_DISCOVERY_SERVER=127.0.0.1:11811

5 ros2 检视

如果设置了ROS_DISCOVERY_SERVER,ros2 topic list -t 命令不会打印出相应的topic,需要以SUPER_CLIENT模式连接到发现服务器

下面的xml配置使得每个新的participant都作为SUPER_CLIENT
super_client_configuration_file.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dds><profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"><participant profile_name="super_client_profile" is_default_profile="true"><rtps><builtin><discovery_config><discoveryProtocol>SUPER_CLIENT</discoveryProtocol><discoveryServersList><RemoteServer prefix="44.53.00.5f.45.50.52.4f.53.49.4d.41"><metatrafficUnicastLocatorList><locator><udpv4><address>192.168.31.18</address><port>60001</port></udpv4></locator></metatrafficUnicastLocatorList></RemoteServer></discoveryServersList></discovery_config></builtin></rtps></participant></profiles>
</dds>

6 远程fastdds程序与ros节点通讯

Fast-DDS & ros2 ros与fastdds通讯

二、安装

一个完整的 ROS 镜像,包含了 ROS 桌面完整版,其中包括了许多常用的工具、库和软件包。

docker pull osrf/ros:humble-desktop-full

ros官方:
在这里插入图片描述
Open Source Robotics Foundation:
在这里插入图片描述

三、catkin编译系统

在这里插入图片描述

catkin工作空间

在这里插入图片描述

tree参看5.

四、colcon构建系统

在这里插入图片描述
Linux version 6.5.0-27-generic (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
Docker version 24.0.2, build cb74dfc
osrf/ros humble-desktop-full imageid:26438fe1f0c9
git clone https://github.com/ros2/examples src/examples -b humble
colcon build --symlink-install 在以上环境下,运行该命令系统死机

目录结构:
current_workspace:
build
install
log
src
package1
package2

colcon build  # 构建当前目录current_workspace下的所有package
colcon test
source install/setup.bash  # 构建好的包添加进环境变量
colcon_cd <some_ros_pacakge>  # 切换到某个包的目录
  • cd ~/ros2_ws/src
  • ros2 pkg create --build-type ament_cmake --license Apache-2.0 <pacakge_name> # 创建包的标准流程
  • ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node <pacakge_name>
  • colcon build --packages-select <my_package>
  • rosdep install -i --from-path src --rosdistro humble -y # 检查依赖
  • ros2 pkg create --build-type ament_cmake --license Apache-2.0 <pacakge_name> --dependencies rclcpp example_interfaces

五、c++发布ROS包

  1. 创建ROS工作空间
    首先,创建一个ROS工作空间,用于存放ROS包和节点

    mkdir -p ~/catkin_ws/src
    # 在~/catkin_ws/src目录下创建一个CMakeLists软连接
    # 后面调用catkin编译的时候用?
    cd ~/catkin_ws/src
    catkin_init_workspace
    
  2. 创建ROS包:
    在刚刚创建的src目录下创建一个ROS包

    cd ~/catkin_ws/src
    catkin_create_pkg my_package roscpp std_msgs
    

    这将创建一个名为"my_package"的包,并添加了roscpp和std_msgs作为依赖项。可以根据需要添加其他依赖项。
    在这里插入图片描述
    ~/catkin_ws/src目录下的内容,用户代码应该放入src目录下,白色的CMakeLists.txt是需要调整的内容

  3. 在上图中显示的src目录下添加源代码文件

    #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 chat = n.advertise<std_msgs::String>("this_is_topic", 1000);ros::Rate loop_rate(10);  // taking into account the calcu time, better than only sleepint count = 0;while(ros::ok()){std_msgs::String msg;msg.data.insert(0, "agc", 3);for (int i = 0; i < msg.data.size(); ++i){ROS_INFO("%d", msg.data[i]);}chat.publish(msg);  // send dataros::spinOnce();loop_rate.sleep();++count;}return 0;
    }
    
  4. 修改白色的CMakeLists.txt
    修改
    #############
    ## Install ##
    #############
    后的内容,使项目能正常编译
    注意target_link_libraries和add_executable

  5. 构建和运行节点
    在~/catkin_ws(工作空间根目录)下运行
    catkin_make
    构建成功后运行:(首先要启动roscore服务)
    source devel/setup.bash
    rosrun my_package 可执行文件名称
    在这里插入图片描述

- 参数

- 源码编译安装需要的ros humble的模块 [从ament_cmake开始]

1. Python ament_package 模块安装

项目地址:https://github.com/ament/ament_package
项目简介:
  包含一个单一的ament Python包,提供了查找和解析package.xml文件的API。

该项目为Python ament_package模块源码,其中包含setup.py文件。

python3 setup.py --help  # 查看帮助
python3 setup.py install
# or
python3 setup.py build # 将模块安装到build目录下,然后再添加

将特定目录(安装的Python模块)添加到 Python 搜索路径的方法:

1.
import sys
sys.path.append("/path/to/acllite")
2.
export PYTHONPATH="$PYTHONPATH:/path/to/lib"

https://blog.csdn.net/Johnor/article/details/135206782

2. ament_cmake安装

https://github.com/ament/ament_cmake/tree/humble
项目简介:
  Ament CMake 是一个用于构建 ROS 2 软件包的工具,它基于 CMake 构建系统,提供了一系列 CMake 宏和函数用于声明依赖项、安装目标文件等,简化了 ROS 2 软件包的构建过程。

依赖:

  • cmake
  • python3
  • pip (用于安装Python模块)
  • python的catkin_pkg模块
  • Python的ament_package模块(地址:https://github.com/ament/ament_package, 步骤1中安装)

相关参考:
https://blog.csdn.net/amuro_ray027/article/details/120201983
https://blog.csdn.net/weixin_34024034/article/details/91800653

  1. cmake ament_cmake_core
    为ament提供所有内置的核心概念,例如环境钩子、资源索引、符号链接安装等
    运行cmake [path/cmakelists.txt] 后会生成cmake_install.cmake文件,该文件用于安装cmake的package
    接着运行make install, 将cmake package复制到/usr/local/share/ament_index/ /usr/local/share/ament_cmake_core
  2. ament_cmake_export_dependencies
    cmake [cmakelists.txt]; make install
  3. ament_cmake
    cmake .. ; make install

根据需要进行安装

如我想安装rosbag2模块,首先需要找到仓库位置https://github.com/ros2/rosbag2,然后切换对应分支。阅读CMakeLists.txt查看该模块需要那些依赖。依次安装依赖

  • find_package(ament_cmake REQUIRED)
  • find_package(ament_index_cpp REQUIRED)
      https://github.com/ament/ament_index/
  • find_package(pluginlib REQUIRED)
  • find_package(rclcpp REQUIRED)
  • find_package(rcpputils REQUIRED)
  • find_package(rcutils REQUIRED)
  • find_package(rmw REQUIRED)
  • find_package(rmw_implementation REQUIRED)
  • find_package(rosbag2_storage REQUIRED)
  • find_package(rosidl_runtime_c REQUIRED)
  • find_package(rosidl_runtime_cpp REQUIRED)
  • find_package(rosidl_typesupport_cpp REQUIRED)
  • find_package(rosidl_typesupport_introspection_cpp REQUIRED)

Ubuntu系统源码安装ros:
http://fishros.org/doc/ros2/humble/Installation/Alternatives/Ubuntu-Development-Setup.html

# rosdep init just fetches that file and writes it into /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init # https://github.com/ros/rosdistro/issues/9721

参考

中国大学MOOC—《机器人操作系统入门》课程讲义

https://docs.ros.org/en/humble/index.html

https://docs.ros2.org/bouncy/api/rclcpp/index.html

http://fishros.org/doc/ros2/humble/index.html

ros2依赖
https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos

ros2bag
https://github.com/ros2/rosbag2

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

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

相关文章

Docker容器的数据管理

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 我们在使用Docker的过程中&#xff0c;往往需要能查看容器内应用产生的数据&#xff0c;或者需要把容器内的数据进行备份&#x…

信创终端操作系统上vmware的命令行操作

原文链接&#xff1a;信创终端操作系统上vmware的命令行操作 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在信创终端操作系统上使用命令行操作VMware的文章。通过命令行管理VMware虚拟机可以提高效率&#xff0c;特别是在需要批量操作或自动化管理时。本文将…

VS2022创建C C++ GTEST工程

原因 需要对带代码进行单元测试&#xff0c;选择在Visual studio 中使用GTEST 框架。 实施 创建一个常规的控制台可执行程序。然后使用NUGET安装包 安装GTEST 头文件和动态库&#xff0c;同时安装GTEST ADAPTER。 安装可能提示找不到包源&#xff0c;此时需要根据提示配置一…

如何使用API快速打造健康医疗系统?

在数字医疗市场&#xff0c;数据是人们经常谈及的一个话题。当前&#xff0c;消费者医疗和健康应用收集的数据越来越多&#xff0c;电子健康记录的实施也创造出了大量有关病人的电子信息。 API接口在智慧医院跨网、跨机构之间的业务协同和数据共享交换中得到数据共享。支撑了医…

Redis从入门到超神-(十二)Redis监听Key的过期事件

前言 试想一个业务场景&#xff0c;订单超过30分钟未支付需要做自动关单处理,修改订单状态&#xff0c;库存回退等&#xff0c;你怎么实现&#xff1f;方案一&#xff1a;可以使用定时任务扫表&#xff0c;通过支付状态和下单时间来判断是否支付过期。但是这样的方案是非常消耗…

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…

protobuf编译之后找不到isStringEmpty方法

原因: 与mysql的jar包冲突了 解决办法&#xff1a; 在MySQL中排除proto-java <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version><scope>runtime</scope>&l…

Webpack 从入门到精通

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、Webpack 简介 二、Webpack 的核心概念 三、Webpack 的安装与配置 安装 Node.js 安装 Webpack 初始…

戴着苹果Vision Pro,如何吃花生米

6月底苹果Vision Pro国内开售&#xff0c;我早早到官网预订了一台。选择必要的配件&#xff0c;输入视力信息&#xff0c;定制符合自己视力的蔡司镜片。确实贵。把主要配件和镜片配齐&#xff0c;要3万6&#xff0c;比Pico、META的眼镜贵一个数量级。 Vision Pro出来后&#x…

Springboot集成Elasticsearch High Level REST Client实现增删改查实战

获取源码&#x1f6a9; 需要完整代码资料&#xff0c;请一键三连后评论区留下邮箱&#xff0c;安排发送&#xff01;&#xff01;&#xff01;&#x1f916; 什么是High Level REST Client&#xff1f; Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…

用python解释进程与协程(python实例二十八)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.创建进程池&#xff0c;异步执行多个任务 3.1 代码构思 3.2 代码示例 3.3 运行结果 4. 模拟协程堵塞 4.1 代码构思 4.2 代码示例 4.3 运行结果 5.总结 1.认识Python Python 是一个高…

Javascript前端面试(七)

JavaScript 部分 1. JavaScript 有哪些数据类型&#xff0c;它们的区别&#xff1f; JavaScript 共有八种数据类型&#xff0c;分别是 Undefined、Null、Boolean、 Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是 ES6 中新增的数据类型&#xff1a; ●Sym…

04-Charles中的Map Remote和Map Local介绍

Charles提供了Map Remote和Map Local两个功能。 Map Remote是将指定的网络请求重定向到另一个网址。Map Local是将指定的网络请求重定向到本地文件。 一、Map Remote 假设代码中调用了接口A&#xff0c;但是接口A的响应结果不能满足需求&#xff1b;此时&#xff0c;有另一个…

SAPUI5基础知识18 - 自定义CSS和主题色

1. 背景 在上一篇博客中&#xff0c;我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中&#xff0c;让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS&#xff0c;全称为级联样式表&#xff08;Cascading Style Sheets&#xff09;&a…

【更新2023】省级农林牧渔业产值面板数据 含分项 1949-2023

省级农林牧渔业产值面板数据是研究农业经济和区域发展的重要资源。这些数据可以被用来分析不同省份间农业产值的时空变化及其影响因素&#xff0c;探讨政策对农业发展的影响&#xff0c;评估农业现代化和可持续发展水平&#xff0c;以及比较不同地区农业产值的竞争力和效率。此…

python学习笔记——字符串

一、创建字符串 1.我们可以使用引号( 或 " )来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。 var1 Hello World! var2 "Runoob" 二、访问字符串中的值 1.Python 访问子字符串&#xff0c;可以使用方括号 [] 来截取字符串。…

在Android上实现汉字笔顺动画效果——HanZiWriter

序&#xff0c;万般皆是命&#xff0c;半点不由人。 Hanzi Writer 是 javascript 免费开源库&#xff0c;根据汉字书写时按照笔画顺序的特征&#xff0c;可以播放正确笔画顺序的描边动画和练习测试。支持简体字和繁体字。可以让全球用户能够通过手绘模仿的方式来学习和练习书写…

Python网络爬虫详解:实战豆瓣电影信息采集

文章目录 前言一、爬虫是什么&#xff1f;二、常用库及其作用1.Requests2.BeautifulSoup3. lxml4. Scrapy5. Selenium6. PyQuery7. Pandas8. JSON9. Time 三、实现步骤步骤一&#xff1a;环境准备步骤二&#xff1a;数据采集步骤三&#xff1a;数据处理步骤四&#xff1a;数据存…

算法日记day 19(找树左下角的值|路径总和)

一、找树左下角的值 题目&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 思路&#xff1a;…