<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>一世繁华 - 笔记本</title>
<link>https://blog.hantaotao.top/category/study/</link>
<atom:link href="https://blog.hantaotao.top/feed/category/study/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Sun, 03 Aug 2025 17:56:00 +0800</lastBuildDate>
<pubDate>Sun, 03 Aug 2025 17:56:00 +0800</pubDate>
<item>
<title>《明朝那些事儿》—当年明月 ( Updated: 20250803)</title>
<link>https://blog.hantaotao.top/archives/180/</link>
<guid>https://blog.hantaotao.top/archives/180/</guid>
<pubDate>Sun, 03 Aug 2025 17:56:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[1 朱允炆篇1.1 每逢大事有静气的道衍此人无论碰到什么紧急情况，他总是不慌不忙，悠然自得。道衍，原名姚广孝，被后人称为“黑衣宰相”的存在。后文还会提到，有人造反是为了钱或权，而道衍造反只是为了...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1 朱允炆篇</h1><h2>1.1 每逢大事有静气的道衍</h2><blockquote>此人无论碰到什么紧急情况，他总是不慌不忙，悠然自得。</blockquote><p>道衍，原名姚广孝，被后人称为“黑衣宰相”的存在。后文还会提到，有人造反是为了钱或权，而道衍造反只是为了造反，为了一展心中抱负，不负平生所学。这让他和其他人有很大不同，其他人在造反途中遇到了困阻，可能为了保证现有的钱财或者权力，而选择退缩，而道衍不会，因为造反就是他所追求的，不成功便成仁，他是绝对不会中途而废的。</p><h2>1.2 人生急转的庄得</h2><p>在造反途中，朱棣率领的北军，与守军南军对峙。前一刻斩杀了北军大将的庄得，还会来得及体验欣喜之情，就在下一刻的两军冲突中死于乱中之中。<code>他大概不会想到，光荣与死亡原来靠的那么近。</code></p><h2>1.3 朱棣的成功因素</h2><p>第一个因素是永远打不死的朱棣，说来实在让人难以相信，在乱军作战中，说实话将领和普通军士战死的机率其中并没有本质的区别。而朱棣似乎成为了美军大片中永远打不死的超级英雄，他身经百战，冲锋陷阵，却从未负过重伤。当然后期的一个因素，还包括幼稚的朱允炆下的那道“不得伤害我双叔”的命令，不过终究不是核心因素罢了。</p><p>第二个因素是永远刮不停的大风，北方多风沙是正常事情，问题在于刮风的时间和地点，每次都是早不刮、晚不刮，偏偏在两军交战正激烈的时候开始刮风，北方地盘那么大，还偏偏只光顾那么一小片战场，而且每次刮风都是有利于朱棣的，不是把敌军帅旗刮断就是对着敌军猛猛吹，让士兵睁不开眼睛。</p><p>这种种因素让人不禁感叹，这朱棣莫非真不是在天命在身不可？或者他背后有人身怀巫术？但是以他的性格，这事成之后，还不得杀人灭口。</p><h1>2 朱棣篇</h1><h2>2.1 《永乐大典》</h2><p>这本书收录上至先秦，下迄明初各种书籍七八千余种，共计一万一千零九十五册，二万二千八百七十七卷，三亿七千万字。它的内容包括经史子集、天文、地理、阴阳、医术、占卜、释藏、道经、戏剧、工艺、农艺，涵盖了中华民族数千年来的知识财富，它不仅是一部书，而是一座中华文明史上的金字塔。</p><p>但是可惜的是，现存的永乐大典仅有6%，很多册都在历史战乱中丢失了，如果能回到过去，一定一定要多加保存。具体应该怎么做呢？多存档，多备份，多送给各地的人。</p><h2>2.2 解缙的一生</h2><p>解缙终于断绝了所有希望，皇帝不信任他，太子帮不了他，这下子是彻底完了。<br>回望他的一生，少年得志，意气风发，虽经历坎坷，却能够转危为安，更上一层楼，百官推崇，万人敬仰。风光无限。可是后面看不见日光的黑牢，脚上的镣铐和牢房那令人窒息的恶臭，变得一无所有。</p><p>有一个他自己都没有想明白的事情？他自己为什么会失败。从给朱元璋上书开始，朱元璋的不处罚与隐忍让解缙会错了意。纵有才华，但不解风情，不能审度大势与人心，掉入了人心黑暗的陷阱中。应该把解缙和姚广孝做对比。在造反成功后，按功封赏，姚广孝把他得到了金银分为了他的家乡人，也不住在封赐的房屋中，居住于寺庙之中，不过多参与政事，一副功成身退的样子，这不会让朱棣不舒服。但在关键事情上，例如立太子一事，后面总能看到姚广孝的影子，不愧被称为黑衣宰相。</p>
]]></content:encoded>
<slash:comments>6</slash:comments>
<comments>https://blog.hantaotao.top/archives/180/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>SolidWorks体积估算问题</title>
<link>https://blog.hantaotao.top/archives/161/</link>
<guid>https://blog.hantaotao.top/archives/161/</guid>
<pubDate>Thu, 09 Jan 2025 15:07:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[1.场景设置一个装配体由两个部件组成，部件分别为：边长2cm的大正方体、直径1cm的小正方体，密度都是1g/cm3；组合关系是：小正方体位于大正方体中心，即两者为包含（重叠）关系；已知大正方体体...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.场景设置</h1><p>一个装配体由两个部件组成，部件分别为：边长2cm的大正方体、直径1cm的小正方体，密度都是1g/cm3；组合关系是：小正方体位于大正方体中心，即两者为包含（重叠）关系；</p><blockquote>已知大正方体体积为8，质量为8；小正方体体积为1，质量为1，则装配体的体积和质量分别为多少？</blockquote><h1>2.初步实践</h1><p><img src="http://image.hantaotao.top/image/2025/01/01-SW体积估算问题/20250108155543-min.png" alt="20250108155543-min.png" title="20250108155543-min.png"><br>由实践结果可知，通过直接装配，装配体<strong><em>质量相加、体积相加。</em></strong></p><h1>3.后续操作</h1><blockquote>如何得到正确的体积？</blockquote><ul><li>如何两个或多个部件具备完全或不完全重叠关系，则可通过布尔加运算，得到新的装配体，计算新装配体的体积即可。</li></ul><blockquote>如何得到正确的质量？</blockquote><ul><li>如果两个或多个部件具备完全或不完全重叠关系，则可通过布尔减运算得到一个新的零部件，再将新零部件与剩下完整的部件进行组装，再进行质量计算。</li></ul><p>// 以上正确体积与质量计算是我个人想法，可以得到正确结果，但方法可能不是最优。</p>
]]></content:encoded>
<slash:comments>8</slash:comments>
<comments>https://blog.hantaotao.top/archives/161/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>ROS相关基础 （Updated:20241027）</title>
<link>https://blog.hantaotao.top/archives/136/</link>
<guid>https://blog.hantaotao.top/archives/136/</guid>
<pubDate>Thu, 22 Aug 2024 20:58:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[1. linux基础1.1 pwd查看当前所在目录1.2 cd进行目录的切换1.3 mkdir创造文件夹mkdir XXXXXX为创建的文件夹的名字1.4 ls列出当前文件下有的文件或文件夹1....]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1. linux基础</h1><h2>1.1 pwd</h2><p>查看当前所在目录</p><h2>1.2 cd</h2><p>进行目录的切换</p><h2>1.3 mkdir</h2><p>创造文件夹</p><pre><code>mkdir XXX
XXX为创建的文件夹的名字</code></pre><h2>1.4 ls</h2><p>列出当前文件下有的文件或文件夹</p><h2>1.5 touch</h2><p>创建一个文本文件</p><pre><code>touch XXX
XXX为所创建的文件名</code></pre><h2>1.6 mv</h2><p>移动一个文件到另一个文件夹下</p><pre><code>mv XX /XXX
其中XX是文件名字
/XXX是文件的路径</code></pre><h2>1.7 cp</h2><p>复制一个文件到指定路径下</p><pre><code>cp XX XXX/XXXX
其中XX是文件名字
XXX是文件新的路径
XXXX是文件新的名字 如果希望重命令的话，如果不需要，则不需要后面的命令</code></pre><h2>1.8 rm</h2><p>删除文件</p><pre><code>rm XX
XX是文件名字</code></pre><p>如果想要删除文件夹的话，咋需要加-r与斜杠</p><pre><code>rm -r XXX/
其中XXX是文件夹名字</code></pre><h2>1.9 sudo</h2><p>提升用户命令</p><pre><code>sudo apt-get-update</code></pre><h2>1.10 help</h2><p>帮助指令</p><pre><code>--help

例如  sudo --help</code></pre><h2>1.11 clear</h2><p>用于清理终端上信息。<br>或者使用快捷键“ctrl+L”</p><h1>2. 安装g++与python</h1><pre><code>sudo apt-get install g++
sudo apt-get install python</code></pre><h1>3.ROS安装</h1><h2>ubuntu与ros版本对应关系</h2><p>| Ubuntu    | ROS 1.0     | ROS 2.0     |<br>| 16.04 LTS | Kinetic LTS | Ardent      |<br>| 18.04 LTS | Melodic LTS | Dashing LTS |<br>| 20.04 LTS | Noetic LTS  | Foxy LTS    |</p><h2>第1步 添加源</h2><p>使用阿里镜像源，以加快安装速度</p><pre><code>sudo sh -c &#039;. /etc/lsb-release &amp;&amp; echo &quot;deb http://mirrors.aliyun.com/ros/ubuntu/ `lsb_release -cs` main&quot; &gt; /etc/apt/sources.list.d/ros-latest.list&#039;
</code></pre><h2>第2步 设置密钥</h2><pre><code>sudo apt-key adv --keyserver &#039;hkp://keyserver.ubuntu.com:80&#039; --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
</code></pre><h2>第3步 安装</h2><p>对源进行更新</p><pre><code>sudo apt-get update   </code></pre><p>安装ROS</p><pre><code>sudo apt install ros-melodic-desktop-full  </code></pre><p>查看可使用的包，以确定安装成功</p><pre><code>apt-cache search ros-melodic </code></pre><p>安装ros的时候可能出现依赖问题，这个时候可以安装那些依赖包</p><pre><code>sudo aptitude install ros-melodic-desktop ros-melodic-perception ros-melodic-simulators ros-melodic-urdf-sim-tutorial</code></pre><p>可能需要安装aptitude,aptitude 相比于apt更加智能，会进行建议相关</p><pre><code>sudo apt-get install aptitude </code></pre><p>aptitude的一些常用的操作：</p><pre><code>sudo aptitude update                   # 更新软件源
sudo aptitude search  软件名称          #  查看软件
sudo aptitude install 软件名称          #  安装软件
</code></pre><h2>第4步 配置环境</h2><p>rosdep 安装</p><pre><code>sudo apt-get install python-rosdep </code></pre><p>初始化rosdate</p><pre><code>sudo rosdep init
rosdep update  </code></pre><p>初始化环境变量</p><pre><code>echo &quot;source /opt/ros/melodic/setup.bash&quot; &gt;&gt; ~/.bashrc
source ~/.bashrc   </code></pre><p>安装rosdep时可能会出错，如果出错，就运行下面命令</p><pre><code>sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential </code></pre><h2>第5步 验证ROS</h2><p>启动 ros master 即节点管理器</p><pre><code>roscore  </code></pre><p>新开一个终端，启动小海龟仿真器</p><pre><code>rosrun turtlesim turtlesim_node  </code></pre><pre><code>rosrun #功能包 #节点名字</code></pre><p>再新开一个终端，启动小海龟控制节点</p><pre><code>rosrun turtlesim turtle_teleop_key  </code></pre><p>再开一个终端，以查阅节点关系和话题列表</p><pre><code>rqt_graph  </code></pre><h2>一键脚本安装</h2><p>脚本命令待确定</p><pre><code>wget http://fishros.com/install -O fishros &amp;&amp; sudo ./fishros</code></pre><p>按照脚本提示进行安装即可</p><hr><h1>4.ROS相关框架与内容</h1><h2>4.1节点（Node）</h2><ul><li>执行具体任务的进程，独立运行的可执行文件。</li><li>不同节点可使用不同的编程语言，可分布式运行在不同的主机。</li><li>节点在系统中的名称必须是唯一的。</li></ul><h2>4.2 节点管理器（ROS Master）</h2><ul><li>为节点提供命名和注册服务。</li><li>跟踪和记录话题/服务，辅助节点相互查找、建立参数。</li><li>提供参数服务器，节点使用此服务器存储和检索运行时的参数。</li></ul><h2>4.3 话题（Topic）--异步通信机制</h2><ul><li>节点间用来传输数据的重要总线。</li><li>使用<strong>发布/订阅</strong>模型，数据由发布者传输到订阅者，同一个话题的订阅者或发布者可以不唯一。</li></ul><h2>4.4 消息（Message）--话题数据</h2><ul><li>具有一定的类型和数据结构，包括ROS提供的标准类型和用户自定义类型，是节点-话题-节点间传输数据的通道。</li><li>使用百年城语言无关.msg文件定义，编译过程中生成对应的代码文件。</li></ul><p>可以通过下面这张图来理解<strong>话题</strong>和<strong>消息</strong>，话题类似于一个消息驿站，需要投放消息的向里面投放，需要接收消息的，从里面接收；换一个比喻就是冒险者工会。<br><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240811122825-min.png" alt="Pastedimage20240811122825-min.png||600" title="Pastedimage20240811122825-min.png||600"></p><h2>4.5 服务（Service）--同步通信机制</h2><ul><li>使用<strong>客户端/服务端（C/S）</strong> 模型，客户端发送<strong>请求</strong>数据，服务器完成处理后返回<strong>应答</strong>数据。</li><li>使用编程语言无关的.srv文件定义请求和应答数据结构，编译过程中生成对应的代码文件。</li><li><p>（需要区分话题和服务，话题发布出去，并不指定接收与回应，而服务是一对一的，有接收有回应。）<br><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240811123754-min.png" alt="Pastedimage20240811123754-min.png||600" title="Pastedimage20240811123754-min.png||600"></p><h2>4.6 参数（Parameter）--全局共享字典</h2></li><li>可通过网络访问的共享、多变量字典；</li><li>节点使用此服务来存储和检索运行时的参数；</li><li>适合存储<strong>静态、非二进制</strong>的配置参数，不适合存储动态配置的数据。</li><li>（如果需要动态参数，ROS还有另外一个功能是<strong>动态参数配置</strong>，有需要的时候可以进行相关学习。）</li></ul><h2>4.7 文件系统</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240811124717-min.png" alt="Pastedimage20240811124717-min.png||600" title="Pastedimage20240811124717-min.png||600"></p><h3>4.7.1 功能包（Package）</h3><ul><li><p>ROS 软件中基本单元，包含节点源码、配置文件、数据定义等。</p><h3>4.7.2 功能包清单（Package manifest）</h3></li><li><p>记录功能包的基本信息，包含作者信息，许可信息，依赖选项，编译标志等。</p><h3>4.7.3 元功能包（Meta Package）</h3></li><li>组织多喝用于同一目标的功能包。</li></ul><h2>4.8 命令行工具</h2><h3>4.8.1 rosnode（节点工具）</h3><pre><code>    rosnode ping    test connectivity to node
    rosnode list    list active nodes
    rosnode info    print information about node 后面跟节点名字
    rosnode machine    list nodes running on a particular machine or list machines
    rosnode kill    kill a running node 后面跟节点的id号码
    rosnode cleanup    purge registration information of unreachable nodes
</code></pre><h3>4.8.2 rostopic(话题工具)</h3><pre><code>    rostopic bw    display bandwidth used by topic
    rostopic delay    display delay of topic from timestamp in header
    rostopic echo    print messages to screen
    rostopic find    find topics by type
    rostopic hz    display publishing rate of topic    
    rostopic info    print information about active topic
    rostopic list    list active topics
    rostopic pub    publish data to topic
    rostopic type    print topic or field type

Type rostopic &lt;command&gt; -h for more detailed usage, e.g. &#039;rostopic echo -h&#039;</code></pre><h3>4.8.3 rosservice(服务工具)</h3><pre><code>    rosservice args    print service arguments
    rosservice call    call the service with the provided args
    rosservice find    find services by service type
    rosservice info    print information about service
    rosservice list    list active services
    rosservice type    print service type
    rosservice uri    print service ROSRPC uri
</code></pre><h3>4.8.4 rosbag(数据存储、回放及修改)</h3><pre><code>rosbag &lt;subcommand&gt; [options] [args]
---
Available subcommands:
   check      Determine whether a bag is playable in the current system, or if it can be migrated.
   compress      Compress one or more bag files.
   decompress      Decompress one or more bag files.
   decrypt      Decrypt one or more bag files.
   encrypt      Encrypt one or more bag files.
   filter      Filter the contents of the bag.
   fix      Repair the messages in a bag file so that it can be played in the current system.
   help  
   info      Summarize the contents of one or more bag files.
   play      Play back the contents of one or more bag files in a time-synchronized fashion.
   record      Record a bag file with the contents of specified topics.
   reindex      Reindexes one or more bag files.</code></pre><p>举例</p><pre><code>rosbag record -a -O cmd_record</code></pre><p>其中 -a 表示记录所有数据，-O 表示数据存储的格式及名称<br>需要注意的是，默认数据存放的位置，是desktop位置</p><pre><code>rosbag play cmd_record</code></pre><p>即回访记录的数据。</p><h1>5.工作空间与功能包的创建</h1><h2>5.1 工作空间的创建</h2><ul><li>工作空间（workspace）是存放工程开发相关文件的文件夹。</li><li>src： 代码空间（source space）  源文件</li><li>build： 编译空间（build space ）编译过程中的中间文件，一般用不到</li><li>devel： 开发空间（development sapce） 可执行文件，库，脚本等</li><li>install： 安装空间（install space）安装成功的文件所在，devel与install中文件存在重复，在ROS2 中仅保留了install文件夹。</li></ul><p>创建工作空间</p><pre><code>mkdir catkin_ws
cd catkin_wa/
mkdir src
cd src/
catkin_init_workspace    //变化文件夹的属性，使之成为工作空间</code></pre><p>编译工作空间</p><pre><code>cd catkin_ws/     //回到工作空间跟目录
catkin_make  //进行编译，空文件夹也可以，会产生build 与devel 文件夹

catkin_make install   //会产生install文件夹，安装空间，安放可执行文件</code></pre><p>设置环境变量</p><pre><code>source devel/setup.bash</code></pre><p>检查环境变量路径，如有需要</p><pre><code>echo $ROS_PACKAGE_PATH</code></pre><h2>5.2 功能包的创建</h2><pre><code>catkin_create_pkg (package_name) (depend1) (depend2) (depend3) ...    // 创建功能包指令，依次是指定名字，指令需要依赖的库等</code></pre><p>e.g.</p><ul><li><p>创建功能包</p><pre><code>cd catkin_ws/src/     //即功能包一定要放在工作空间的src里面才是可以的。
catkin_create_pkg test_pkg std_msgs rospy rosapp</code></pre><ul><li>编译</li></ul></li></ul><pre><code>cd catkin_ws/       //进入工作空间
catkin_make          //执行编译
source devel/setup.bash          刷新 环境变量，使之生效。</code></pre><h1>6.发布者publisher编程实现</h1><h2>6.1 话题模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240831235803-min.png" alt="Pastedimage20240831235803-min.png||800" title="Pastedimage20240831235803-min.png||800"></p><h2>6.2 创建功能包</h2><pre><code>cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim</code></pre><h2>6.3 创建发布者代码</h2><p>基本过程如下：</p><ul><li>初始化ROS节点；</li><li>向ROS Master注册节点信息，包括发布的话题名和话题中的消息类型；</li><li>创建消息数据；</li><li>按照一定频率循环发布消息。</li></ul><p>参考代码如下：<br>velocity _publisher.cpp</p><pre><code class="lang-c++"># include &lt;ros/ros.h&gt;
# include &lt;geometry_msgs/Twist.h&gt;

int main(int argc, char **argv)
{
    //ROS初始化
    ros::init(argc, argv, &quot;velocity_publisher&quot;);
    
    //创建节点句柄
    ros::NodeHandle n;
    
    //创建一个publisher, 发布名为/turtle1/cmd_vel的topic，消息类型为geometry_msgs::Twist,队列长度10
    ros::Publisher turtle_vel_pub = n.advertise&lt;geometry_msgs::Twist&gt;(&quot;/turtle1/cmd_vel&quot;, 10);
    
    //设置循环频率
    ros::Rate loop_rate(10);
    
    // 声明vel_msg在这里，而不是在循环内部
    geometry_msgs::Twist vel_msg;
    
    int count = 10;
    while(ros::ok())
    {
        // 初始化geometry_msgs::Twist消息的类型
        vel_msg.linear.x = 0.5;
        vel_msg.angular.z = 0.2;
        
        //发布消息
        turtle_vel_pub.publish(vel_msg);
        ROS_INFO(&quot;Publish turtle velocity command[%0.2f m/s, %0.2f rad/s]&quot;,
                 vel_msg.linear.x, vel_msg.angular.z);
        
        //设置循环频率延时
        loop_rate.sleep();
    }
    return 0;
}
</code></pre><h2>6.4 配置发布者代码编译规则</h2><p>配置CmakerLists.txt</p><ul><li>设置需要编译的代码和生成的可执行文件，例如，下面的就是将<strong>velocity_publisher.cpp</strong>这个代码文件编译成<strong>velocity_publisher</strong>这样一个可执行文件；</li><li><p>设置链接库，建立ROS里相关的链接库——。</p><pre><code class="lang-c++">add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})</code></pre></li></ul><h2>6.5 编译并运行发布者</h2><pre><code>cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher</code></pre><hr><h1>7.订阅者Subscriber编程实现</h1><h2>7.1 话题模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240901204706-min.png" alt="Pastedimage20240901204706-min.png||600" title="Pastedimage20240901204706-min.png||600"></p><h2>7.2 创建订阅者代码</h2><p>下面是实现一个订阅者基本过程：</p><ul><li>初始化ROS节点；</li><li>订阅需要的话题；</li><li>循环等待话题消息，接收到消息后进入回调函数；</li><li>在回调函数中完成消息处理。</li></ul><p>下例将订阅/turtle1/pose话题，消息类型tuetlesim::Pose<br>pose_subscriber.cpp</p><pre><code class="lang-c++"># include &lt;ros/ros.h&gt;
# include &quot;turtlesim/Pose.h&quot;

//接收到订阅的消息后，进入消息回调函数，以及时调用处理

void poseCallback(const turtlesim::Pose::ConstPtr&amp; msg)

{
    //将接收到的消息打印出来，以进行排查

    ROS_INFO(&quot;Tuetle pose: x:%0.6f, y:%0.6f&quot;,msg-&gt;x, msg-&gt;y);
}

int main(int argc, char **argv)

{

    //初始化ROS节点

    ros::init(argc, argv, &quot;pose_subscriber&quot;);
    
    //创建节点句柄
    ros::NodeHandle n;

    //创建一个Subscriber，订阅名为/turtle/pose的topic，注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe(&quot;/turtle1/pose&quot;, 10, poseCallback);

    //循环等待回调函数

    ros::spin();
    return 0;
}</code></pre><h2>7.3 配置订阅者代码编译规则</h2><p>CMakerLists.txt</p><pre><code class="lang-c++">add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})</code></pre><h2>7.4 编译并运行订阅者</h2><pre><code>cd ~/catkin_ws
catkin_maker
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber

//为了让海龟动起来，运行键盘控制节点
rosrun turtlesim turtle_teleop_key</code></pre><h1>8.话题消息的定义与使用</h1><h2>8.1 话题模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240903233300-min.png" alt="Pastedimage20240903233300-min.png" title="Pastedimage20240903233300-min.png"></p><h2>8.2 自定义话题消息</h2><p>步骤：</p><ul><li>定义.msg文件；</li><li><p>在package.xml文件中添加功能包依赖；</p><pre><code class="lang-c++">&lt;build_depend&gt;message_generation&lt;/build_depend&gt;
&lt;exec_depend&gt;message_runtime&lt;/exec_depend&gt;</code></pre></li><li><p>在CMakeLists.txt添加编译选项</p><pre><code class="lang-c++">find_package(......  message_generation)

add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

catkin_package(...... message_runtime)</code></pre></li><li>编译生成语言相关文件</li></ul><p>Person.msg(是在节点下创建改文件，对应本课程，就是在/catkin_ws/src/learning_topic/msg话题下创建，以此完成数据接口定义)</p><pre><code class="lang-c++">string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2
</code></pre><h2>8.3 创建发布者代码</h2><ul><li>初始化ROS节点；</li><li>向ROS Master注册节点信息，包括发布的话题名和话题中的消息类型；</li><li>创建消息数据；</li><li>按照一定频率循环发布消息。</li></ul><pre><code class="lang-c++"># include &lt;ros/ros.h&gt;
# include &lt;learning_topic/Person.h&gt;

int main(int argc, char **argv)

{
    //ROS初始化
    ros::init(argc,argv, &quot;person_publisher&quot;);

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个publisher,发布名为/person_info的topic,消息类型为learning_topic::Person, 队列长度10
    ros::Publisher person_info_pub = n.advertise&lt;lerning_topic::Person&gt;(&quot;/person_info&quot;,10);

    //设置循环频率
    ros::Rate loop_rate(1);
    int count = 0;
    while (ros::ok())
    {
        //初始化learning_topic::Person类型的消息
        learning_topic::Person person_msg;
        person_msg.name = &quot;Tom&quot;;
        person_msg.age = 18;
        person_msg.sex  = learning_topic::Person::male;

          //发布消息
        person_info_pub.publish(person_msg);
        ROS_INFO(&quot;Publish Person Info: name:%s age:%d sex:%d&quot;, person_msg.name.c_str(), person_msg.age, person_msg.sex);

        //按照循环频率延时
        loop_rate.sleep();

    }
}
</code></pre><h2>8.4 创建订阅者代码</h2><ul><li>初始化ROS节点；</li><li>订阅需要的话题；</li><li>循环等待话题消息，接收到消息后进入回调函数；</li><li><p>在回调函数中完成消息处理。</p><pre><code class="lang-c++"># include &lt;ros/ros.h&gt;
# include &quot;learning_topic/Person.h&quot;

//接收到订阅的消息后，进入消息回调函数，以及时调用处理
void personinfoCallback(const learning_topic::Person::ConstPtr&amp; msg)
{
    //将接收到的消息打印出来，以进行排查
    ROS_INFO(&quot;Subcribe Person Info: name:%s age:%d sex:%d&quot;, msg-&gt;name.c_str(), msg-&gt;age, msg-&gt;sex);
}

int main(int argc, char **argv)
{
    //初始化ROS节点
    ros::init(argc, argv, &quot;person_subscriber&quot;);

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个Subscriber，订阅名为/person_info的topic，注册回调函数personInfoCallback
    ros::Subscriber person_info_sub = n.subscribe(&quot;/person_info&quot;, 10, personInfoCallback);

    //循环等待回调函数
    ros::spin();

    return 0;
}</code></pre><h2>8.5 配置代码编译规则</h2></li><li>设置需要编译的代码和生成的可执行文件；</li><li>设置链接库；</li><li><p>添加依赖库。<br>CMakeLists.txt</p><pre><code class="lang-c++">add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)

add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)</code></pre></li></ul><h2>8.6 编译并运行发布者和订阅者</h2><pre><code class="lang-c++">cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun learning_topic person_subscriber
rosrun learning_topic person_publisher</code></pre><h1>9.客户端Client编程实现</h1><h2>9.1 话题模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240908124453-min.png" alt="Pastedimage20240908124453-min.png||600" title="Pastedimage20240908124453-min.png||600"></p><h2>9.2 创建功能包</h2><pre><code class="lang-c++">cd ~/catkin_ws/src
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim</code></pre><h2>9.3 创建客户端代码</h2><ul><li>初始化ROS节点；</li><li>创建一个Client实例；</li><li>发布服务请求数据；</li><li>等待Service处理之后的应答结果。</li><li><p>turtle_spawn.cpp</p><pre><code class="lang-c++"># include &lt;ros/ros.h&gt;
# include &lt;turtlesim/Spawn.h&gt;

int main(int argc, char** argv)
{
    //初始化ROS节点
    ros::init(argc, argv, &quot;turtle_spawn&quot;);

    //创建节点句柄
    ros::NodeHandle node;

    //发现/spawn服务后，创建一个服务客户端，连接名为/spawn的service
    ros::service::waitForService(&quot;/spawn&quot;);
    ros::ServiceClient add_turtle = node.serviceClient&lt;turtlesim::Spawn&gt;(&quot;/Spawn&quot;);

    //初始化turtlesim::Spawn的请求数据
    turtlesim::Spawn srv;
    srv.request.x = 2.0;
    srv.request.y = 2.0;
    srv.request.name = &quot;turtle2&quot;;

    //请求服务调用
    ROS_INFO(&quot;Call service to spawn turtlesim[x:%0.6f, y:%0.6f, name:%s]&quot;, srv.request.x, srv.request.y, srv.request.name.c_str());
    add_turtle.call(srv);

    //显示服务调用结果
    ROS_INFO(&quot;Spawn turtle successfully [name:%s]&quot;, srv.response.name.c_str());

    return 0;

}</code></pre><h2>9.4 配置客户端代码编译规则</h2></li><li>设置需要编译的代码和生成的可执行文件；</li><li><p>设置链接库。<br>CmakeList.txt</p><pre><code class="lang-c++">add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})</code></pre></li></ul><h2>9.5 编译并运行客户端</h2><pre><code class="lang-c++">cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscorer
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_spawn</code></pre><h1>10.服务端Server的编程实现</h1><h2>10.1 服务模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240908162131-min.png" alt="Pastedimage20240908162131-min.png||600" title="Pastedimage20240908162131-min.png||600"></p><h2>10.2 创建服务器</h2><ul><li>初始化ROS节点；</li><li>创建Service实例；</li><li>循环等待服务请求，进入回调函数；</li><li><p>在回调函数中完成服务功能的处理，并反馈应答数据。<br>turtle_command_servicer.cpp</p><pre><code class="lang-c++"># include&lt;ros/ros.h&gt;
# include&lt;geometry_msgs/Twist.h&gt;
# include&lt;std_srvs/Trigger.h&gt;

ros::Publisher turtle_vel_pub;
bool pubCommand = false;

//service回调函数，输入参数req，输出参数res
bool commandCallback(std_srvs::Trigger::Request &amp;req, std_srvs::Trigger::Response &amp;res)
{
    pubCommand = !pubCommand;

    //显示请求数据
    ROS_INFO(&quot;Publish turtle velocity command [%s]&quot;, pubCommand==true?&quot;YES&quot;:&quot;NO&quot;);

    //设置反馈数据
    res.success = true;
    res.message = &quot;Change turtle command state!&quot;;
    return true;
}

int main(int argc, char** argv)
{
    //ROS初始化
    ros::init(argc, argv, &quot;turtle_command_server&quot;);

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个名为/tutle_command的server，注册回调函数commandCallback
    ros::ServiceServer command_service = n.advertiseService(&quot;/turtle_command&quot;, commandCallback);

    //创建一个Publisher，发布名为/turtle1/cmd_vel的topic，消息类型为geometry_msgs::Twist,队列长度为10
    turtle_vel_pub = n.advertise&lt;geometry_msgs::Twist&gt;(&quot;/turtle1/cmd_vel&quot;, 10);

    //循环等到回调函数
    ROS_INFO(&quot;Ready to receive turtle command.&quot;);

    //设置循环的频率
    ros::Rate loop_rate(10);

    while(ros::ok())
    {
        //查看一次回调函数队列
        ros::spinOnce();

        //如果标志为true，则发布速度指令
        if(pubCommand)
        {
            geometry_msgs::Twist vel_msg;
            vel_msg.linear.x = 0.5;
            vel_msg.angular.z = 0.2;
            turtle_vel_pub.publish(vel_msg);
        }

        //按照循环频率延时
        loop_rate.sleep();
    }

    return 0;
}</code></pre></li></ul><h2>10.3 配置服务器代码编译规则</h2><ul><li>设置需要编译的代码和生成的可执行文件；</li><li><p>设置链接库。</p><pre><code class="lang-c++">add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})
</code></pre></li></ul><h2>10.4 编译并运行服务器</h2><pre><code class="lang-c++">cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_command_server
rosservice call /tuetle_command&quot;{}&quot;</code></pre><h1>11.服务数据的定义和使用</h1><h2>11.1 服务模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20240908183749-min.png" alt="Pastedimage20240908183749-min.png||800" title="Pastedimage20240908183749-min.png||800"></p><h2>11.2 自定义服务数据</h2><ul><li><p>定义srv文件<br>Person.srv   （使用三个）</p><pre><code class="lang-c++">string name
uint8 age
uint8 sex

uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result</code></pre></li><li><p>在package.xml中添加功能包依赖</p><pre><code class="lang-c++">&lt;build_depend&gt;message_generation&lt;/build_depend&gt;
&lt;exec_depend&gt;message_runtime&lt;/exec_depend&gt;</code></pre></li><li><p>在CMakeList.txt添加编译选项</p><pre><code class="lang-c++">find_package(... message_generation)

add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)

catkin_package(... message_runtime)</code></pre></li><li>编译生成语言相关文件</li></ul><h2>11.3 创建服务器代码</h2><ul><li>初始化ROS节点</li><li>创建Server实例</li><li>循环等待服务请求，进入回调函数</li><li><p>在回调函数中完成服务功能的处理，并反馈应答数据。</p><pre><code class="lang-c++">/*
改例程将用于执行/show_person服务，服务数据类型learning_service::Person
*/
# include&lt;ros/ros.h&gt;
# include &quot;learning_service/Person.h&quot;

//service回调函数，输入参数req，输出参数res
bool personCallback(learning_service::Person::Request &amp;req, learning_service::Person::Response &amp;res)
{
    //显示请求数据
    ROS_INFO(&quot;Person: name:%s age:%d sex:%d&quot;, req.name.c_str(), req.age, req.sex);

    //设置反馈数据
    res.result = &quot;OK&quot;;
    return true;
}

int main(int argc, char** argv)
{
    //ROS初始化
    ros::init(argc, argv, &quot;person_server&quot;);

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个名为/show_person的server，注册回调函数personCallback
    ros::ServiceServer person_service = n.advertiseService(&quot;/show_person&quot;, personCallback);

    //循环等到回调函数
    ROS_INFO(&quot;Ready to show person information.&quot;);
    ros::spin();
    return 0;
}</code></pre></li></ul><h2>11.4 创建客户端代码</h2><ul><li>初始化ROS节点</li><li>创建一个Client实例</li><li>发布服务请求数据</li><li><p>等待server处理之后的应答结果<br>person_client.cpp</p><pre><code class="lang-c++">/*
该例程将请求/show_person服务，服务数据类型learning_service::Person

*/

# include &lt;ros/ros.h&gt;
# include &quot;learning_service/Person.h&quot;

int main(int argc, char** argv)
{
    //初始化ROS节点
    ros::init(argc, argv, &quot;person_client&quot;);
    
    //创建节点句柄
    ros::NodeHandle node;

    //发现/show_person服务后，创建一个服务客户端，连接名为/show_person的service
    ros::service::waitForService(&quot;/show_person&quot;);
    ros::ServiceClient person_client = node.serviceClient&lt;learning_service::Person&gt;(&quot;/show_person&quot;);

    //初始化learning_service::Person的请求数据
    learning_service::Person srv;
    srv.request.name = &quot;Tom&quot;;
    srv.request.age = 20;
    srv.request.sex = learning_service::Person::Request::male;

    //请求服务调用
    ROS_INFO(&quot;Call service to show person[name:%s, age:%d, sex:%d]&quot;, srv.request.name.c_str(), srv.request.age, srv.request.sex);
    person_client.call(srv);
 
    //显示服务调用结果
    ROS_INFO(&quot;Show person result: %s&quot;, srv.response.result.c_str());

    return 0;
}
</code></pre></li></ul><h2>11.5 配置服务器/客户端代码编译规则</h2><ul><li>设置需要编译的代码和生成的可执行文件；</li><li>设置链接库；</li><li><p>添加依赖项。<br>CMakeLists.txt</p><pre><code class="lang-c++">add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)

add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)</code></pre></li></ul><h2>11.6 编译并运行客户端和服务端</h2><pre><code class="lang-c++">cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun learning_service person_server
rosrun learning_service person_client</code></pre><hr><h1>12、参数的使用与编程方法</h1><h2>12.1 参数模型</h2><p><img src="http://image.hantaotao.top/image/2024/ROS/1025/Pastedimage20241006213515-min.png" alt="Pastedimage20241006213515-min.png||800" title="Pastedimage20241006213515-min.png||800"></p><h2>12.2 创建功能包</h2><pre><code class="lang-c++">cd ~/catkin_ws/src/
catkin_create_pkg learning_parameter roscpp rospy std_srvs</code></pre><h2>12.3 参数命令行使用</h2><p>rosparam</p><ul><li><p>列出当前多有参数</p><pre><code>rosparam list</code></pre></li><li><p>显示某个参数值</p><pre><code>$ rosparam get param_key</code></pre></li><li><p>设置某个参数值</p><pre><code>$ rosparam set param_key param_value</code></pre></li><li><p>保存参数到文件</p><pre><code>$ rosparam dump file_name</code></pre></li><li><p>从文件读取参数</p><pre><code>$ rosparam load file_name</code></pre></li><li><p>删除参数</p><pre><code>$ rosparam delete param_key</code></pre></li></ul><p>YAML 参数文件（以小海龟仿真器为例）</p><pre><code class="lang-c++">background_b: 255
background_g: 86
background_r: 69
rosdistro: &#039;melodic&#039;
roslaunch:
    uris:[host_hcx_vpc_43763:&#039;http://hcx-vpc:43763/&#039;}
rosversion: &#039;1.14.3&#039;
run_id: 077058de-a38b-11e9-818b-000c29d22e4d</code></pre><p>用以重新刷新</p><pre><code class="lang-c++">rosservice call /clear &quot;{}&quot;</code></pre><h2>12.4 编程方法</h2><p><strong>如何获取/设置参数</strong></p><ul><li>初始化ROS节点；</li><li>get函数获取参数；</li><li>set函数设置参数。</li></ul><p>设置/读取海归例程中的参数<br>parameter_config.cpp</p><pre><code class="lang-c++">#include &lt;string&gt;
#include &lt;ros/ros.h&gt;
#include &lt;std_srvs/Empty.h&gt;

int main(int argc, char **argv)
{
    int red, green, blue;

    //ros初始化
    ros::init(argc, argv, &quot;parameter_config&quot;);
    
    //创建节点句柄
    ros::NodeHandle node;
    
    //读取背景颜色参数
    ros::param::get(&quot;/background_r&quot;, red);
    ros::param::get(&quot;/background_g&quot;, green);
    ros::param::get(&quot;/background_b&quot;, blue);
    
    ROS_INFO(&quot;Get Background Color[%d, %d, %d]&quot;, red, green, blue);
    
    //设置背景颜色参数
    ros::param::set(&quot;/background_r&quot;, 0);
    ros::param::set(&quot;/background_g&quot;, 0);
    ros::param::set(&quot;/background_b&quot;, 0);
    
    ROS_INFO(&quot;Set Background Color[0, 0,0]&quot;);
    
    //读取背景颜色参数
    ros::param::get(&quot;/background_r&quot;, red);
    ros::param::get(&quot;/background_g&quot;, green);
    ros::param::get(&quot;/background_b&quot;, blue);
    
    ROS_INFO(&quot;Re-get Background Color[%d, %d, %d]&quot;, red, green, blue);
    
    //调用服务，刷新背景颜色
    ros::service::waitForService(&quot;/clear&quot;);
    ros::ServiceClient clear_background = node.serviceClient&lt;std_srvs::Empty&gt;(&quot;/clear&quot;);
    std_srvs::Empty srv;
    clear_background.call(srv);
    
    sleep(1);
    
    return 0;
    
}</code></pre><h2>12.5 配置代码编译规则</h2><ul><li>设置需要编译的代码和生成可执行文件；</li><li><p>设置链接库；</p><pre><code class="lang-c++">add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})</code></pre></li></ul><h2>12.6 编译并运行发布者</h2><pre><code>$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_parameter parameter_config</code></pre><h1>13.ROS中坐标系管理系统</h1><h2>13.1 机器人中的坐标变换</h2><p>通过“广播”与“监听”的方式实现的。</p><pre><code class="lang-c++">$ sudo apt-get install ros-melodic-turtle-tf
$ roslaunch turtle_tf turtle_tf_demo.launch
$ rosrun turtlesim turtle_teleop_key
$ rosrun tf view_frames</code></pre><h1>14.tf坐标系广播与监听的编程实现</h1><h2>14.1 创建功能包</h2><pre><code>$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf roscpp rospy tf turtlesim</code></pre><h2>14.2 创建tf广播器代码</h2><ul><li>定义TF广播器（TransformBroadcaster）</li><li>创建坐标变化值</li><li>发布坐标变化（sendTransform）</li></ul><p>turtle_tf_broadcaster.cpp</p><pre><code>/*
该例程产生tf数据，并计算、发布turtle2速度指令
*/

# include &lt;ros/ros.h&gt;
# include &lt;tf/transform_broadcaster.h&gt;
# include &lt;turtlesim/Pose.h&gt;

std::string turtle_name;

void poseCallback(const turtlesim::PoseConstPtr&amp; msg)
{
    //创建tf广播器
    static tf::TransformBroadcaster br;
    
    //初始化tf数据
    tf::Transform transform;
    transform.setOrigin(tf::Vector3(msg-&gt;x, msg-&gt;y, 0.0));
    tf::Quaternion q;
    q.setRPY(0,0,msg-&gt;theta);
    transform.setRotation(q);

    //广播world与海龟坐标系之间的tf数据
    br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),&quot;world&quot;,turtle_name));
}
int main(int argc,char**argv)
{
    //初始化ROS节点
    ros::init(argc,argv,&quot;my_tf_broadcaster&quot;);

    //输入参数作为海龟的名字
    if (argc  !=2)
    {
        ROS_ERROR(&quot;need turtle name as argument&quot;);
        return -1;
    }

    turtle_name = argv[1];

    //订阅海龟的位姿话题
    ros::NodeHandle node;
    ros::Subscriber sub = node.subscribe(turtle_name+&quot;/pose&quot;,10,&amp;poseCallback);
    
    //循环等到回调函数
    ros::spin();
    return 0;
};
</code></pre><h2>14.3 创建tf监听器代码</h2><p>turtle_tf_listener.cpp</p><pre><code class="lang-c++">#include &lt;ros/ros.h&gt;
#include &lt;tf/transform_listener.h&gt;
#include &lt;geometry_msgs/Twist.h&gt;
#include &lt;turtlesim/Spawn.h&gt;

int main(int argc, char** argv)
{
    //初始化ROS节点
    ros::init(argc, argv, &quot;my_tf_listener&quot;);

    //创建节点句柄
    ros::NodeHandle node;

    //请求产生turtle2
    ros::service::waitForService(&quot;/spawn&quot;);
    ros::ServiceClient add_turtle = node.serviceClient&lt;turtlesim::Spawn&gt;(&quot;/spawn&quot;);
    turtlesim::Spawn srv;
    add_turtle.call(srv);
    
    //创建发布turtle2速度控制指令的发布者
    ros::Publisher turtle_vel =  node.advertise&lt;geometry_msgs::Twist&gt;(&quot;/turtle2/cmd_vel&quot;, 10);
    
    //创建tf的监听器
    tf::TransformListener listener;

    ros::Rate rate(10.0);
    while (node.ok())
    {
        //获取turtle1与turtle2坐标系之间的tf数据
        tf::StampedTransform transform;
        try
        {
            listener.waitForTransform(&quot;/turtle2&quot;, &quot;/turtle1&quot;, ros::Time(0), ros::Duration(3.0));
            listener.lookupTransform(&quot;/turtle2&quot;, &quot;/turtle1&quot;, ros::Time(0), transform);
        }
        catch (tf::TransformException &amp; ex)
        {
            ROS_ERROR(&quot;%s&quot;, ex.what());
            ros::Duration(1.0).sleep();
            continue;
        }
            
        //根据turtle1与turtle2坐标系之间的位置关系，发布turtle2的速度控制指令
        geometry_msgs::Twist vel_msg;
        vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),
                                        transform.getOrigin().x());
        vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +
                                      pow(transform.getOrigin().y(), 2));
        turtle_vel.publish(vel_msg);

        rate.sleep();
    }
        
    return 0;
};
</code></pre><h2>14.4 配置tf广播器与监听器代码编译规则</h2><ul><li>设置需要编译的代码和生成的可执行文件；</li><li><p>设置链接库。<br>CMakeList.txt</p><pre><code>add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES])</code></pre><h2>14.5 编译并运行</h2><pre><code>cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_tf turtle_tf_broadcaster__name:=turtle1_tf_broadcaster /turtlel
rosrun learning_tf turtle_tf_broadcaster__name:=turtle2_tf_broadcaster/turtle2
rosrun learning_tf turtle_tf_listener
rosrun turtlesim turtle_teleop_key</code></pre></li></ul><h1>15. launch启动文件的使用方法</h1><ul><li><p>launch文件：通过XML文件实现多节点的配置和启动</p><h2>15.1 launch文件语法</h2><pre><code>&lt;launch&gt;
  &lt;node pkg=&quot;turtlesim&quot; name=&quot;sim1&quot; type=&quot;turtlesim_node&quot;/&gt;
  &lt;node pkg=&quot;turtlesim&quot; name=&quot;sim2&quot; type=&quot;turtlesim_node&quot;/&gt;
&lt;/launch&gt;</code></pre></li><li><p>launch文件中的根元素采用<code>&lt;launch&gt;</code>标签定义<br>语法命令：</p><pre><code>启动节点   
&lt;node pkg=&quot;package-name&quot; type=&quot;executable-name&quot; name=&quot;node-name&quot;/&gt;

pkg:节点所在功能包名称
type:节点的可执行文件名称
name:节点运行时的名称

此外还有其它属性：output respawn required ns args</code></pre></li></ul><p>参数设置</p><ul><li><p><code>&lt;param&gt;</code> 设置ROS系统运行中的参数，存储在参数服务器中</p><pre><code>&lt;param name=&quot;output_frame&quot; value=&quot;odom&quot;/&gt;

name:参数名
value：参数值</code></pre></li><li><p><code> &lt;rosparam&gt;</code>  加载参数文件中的多个参数：</p><pre><code>&lt;rosparam file= &quot;params.yaml&quot; command=&quot;load&quot; ns=&quot;params&quot;/&gt;</code></pre></li><li><p><code>&lt;arg&gt;</code> launch文件内部的局部变量，仅限于launch文件使用</p><pre><code>&lt;arg name=&quot;arg-name&quot; default=&quot;arg-value&quot;/&gt;

name:参数名
value:参数值

调用
&lt;param name=&quot;foo&quot; value=&quot;$(arg arg-name)&quot;/&gt;
&lt;node name=&quot;node&quot; pkg=&quot;package&quot; type=&quot;type&quot; args=&quot;$(arg arg-name)&quot;/&gt;</code></pre></li><li><p><code>&lt;remap&gt;</code> 重映射 重映射ROS计算资源的命名</p><pre><code>&lt;remap from=&quot;/turtlebot/cmd_vel&quot; to=&quot;/cmd_vel&quot;/&gt;

from:重命名
to:映射之后的命名</code></pre></li><li><p><code>&lt;include&gt;</code> 嵌套 包含其它launch文件，类似C语言中的头文件包含</p><pre><code>&lt;include file=&quot;$(dirname)/other.launch&quot;/&gt;

file:包含的其它launch文件路径</code></pre><h2>15.2 运行相关</h2></li><li><p>创建功能包</p><pre><code>catkin_create_pkg learning_launch</code></pre></li><li>可以创建一个文件夹，例如命名为<code>launch</code>来存放launch文件，之后<code>catkin_make</code>来进行编译。</li><li><p>编译完成之后，进行启动</p><pre><code>roslaunch xxx(功能包名字) xxx(launch文件)

e.g. 
roslaunch learning_launch simple.launch</code></pre><hr><h1>问题发现与解决</h1><h2>1.解决每次打开ubuntu软件商店程序出现Unable to download updates from extensions.gnome.org</h2><pre><code>sudo add-apt-repository ppa:gnome-shell-extensions/ppa
sudo apt-get update
sudo apt-get install gnome-shell-extensions</code></pre></li></ul>
]]></content:encoded>
<slash:comments>3</slash:comments>
<comments>https://blog.hantaotao.top/archives/136/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>《乌合之众》— [法]古斯塔夫·勒庞 （Updated：20240805）</title>
<link>https://blog.hantaotao.top/archives/132/</link>
<guid>https://blog.hantaotao.top/archives/132/</guid>
<pubDate>Sun, 28 Jul 2024 18:52:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[继《娱乐至死》之后，再读《乌合之众》，我相信是十分合适的，至少从阅读顺序上是十分合适的，从“表象”到“本质”。不过，值得一提的是，相比于《娱乐至死》，《乌合之众》行文可谓是严谨且富有秩序了，逻辑...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p><img src="https://image.hantaotao.top/image/2024/reading/WHZZ/368af53647d13b994086dd4b0ae7c62f.jpg" alt="368af53647d13b994086dd4b0ae7c62f.jpg" title="368af53647d13b994086dd4b0ae7c62f.jpg"><br>继《娱乐至死》之后，再读《乌合之众》，我相信是十分合适的，至少从阅读顺序上是十分合适的，从“表象”到“本质”。<br>不过，值得一提的是，相比于《娱乐至死》，《乌合之众》行文可谓是严谨且富有秩序了，逻辑关系清晰，实在是好读太多！</p><h1>第一卷 群体心理</h1><h2>第1章 群体的一般特征</h2><ul><li><p>1 群体是个活的生物</p><blockquote>不管他们是谁，不管他们是干什么的，也不管他们因为什么凑在一起，只要他们凑在一起，就是一个群体。</blockquote></li></ul><blockquote>在现代心理学看来，群体一旦形成，就立即有了群体的特点，这种特点与其中任何一个人的特点都不同，却和每一个群体的特点没什么区别。<br>所有的群体都是一样的，群体就像一个活的生物，它有自己的感情，有自己的思想，这种群体中共同的感情和思想，就是所谓的“群体心理”。<br>“群体心理”是不可靠的，是暂时的，一旦构成群体的人各自离散，每个人就又立刻恢复到了自己以前的状态。但在群体之中，他的个性却消失了不见了，这时候他的思想、感情所表达与群体的思想感情完全一致。</blockquote><p>或可理解为<strong>同化</strong>。</p><ul><li><p>2 构成群体的条件</p><blockquote>群体中的人有两个共同的特点：首先是每一个人个性消失，其次是他们的感情与思想都在关注同一件事。</blockquote></li><li><p>3 群体的相同与不同</p><blockquote>所有群体都有一些共同的特点，不管群体是由什么人组成的，所有的群体都有着一致性。<br>除此之外，不同的群体还有不同的附带特点。构成群体的人员不同，其附带的特征也就有所不同。</blockquote></li><li><p>4 群体共性的研究方法</p><blockquote>没有办法对群体强弱程度不同的组织做出全面的研究，我们能做的，最多只是研究那些成熟的群体——也可称之为完全组织化阶段的群体。</blockquote></li></ul><p>（20240728）</p><ul><li><p>5 群体共同的心理特征</p><blockquote>构成这个群体的人，不管他是谁，不管他们的生活方式有多大区别，不管他的职业是什么，不管他是男是女，也不管他的智商是高是低，只要他们是一个群体，那么他们就拥有一个共同心理——集群心理。<br>当他们成为群体中一员的时候，他们的感情、思维和行为与他们单独一个人的时候迥然不同。<br>他们在群体中的思维观念或者感情，在他们单独一个人的时候是绝无可能出现的，即使出现，也绝不会形成具体的行动。</blockquote></li><li><p>6 群体质变的原因</p><blockquote>无意识主宰者有机体的生活，而且在有机体的智力活动中，这种力量也起着决定性的作用。<br>如果说，我们的意识是浮在海面上可见的冰山的话，那么，潜意识才是沉陷于暗黑海洋之中的巨大冰体。</blockquote></li></ul><blockquote>同一种族的所有人，都有一个普遍的性格特征，这是智力上的悬殊差异或后天教育的效果无法弥补的。<br>而支配这种普遍性格特征的，正是我们的无意识，同一种族中的大多数普通人在同种程度上都具备这种普遍特征。</blockquote><ul><li><p>7 被抹平的才智差别</p><blockquote>群体只有很普通的品质。<br>群体只有很普通的智慧。<br>群体也只有最基本的智能。<br>群体同事也只具有最低甚至更低层次的智力。</blockquote></li></ul><blockquote><strong>群体只能从事最低级的劳动，而涉及普遍利益的决定，只能由杰出人士组成的决策中心来做出。</strong></blockquote><ul><li><p>8 第一个原因：本能</p><blockquote>第一个原因：本能的力量，而激发一个人最原始本能的决定性因素是数量。</blockquote></li></ul><blockquote>单独一个人必须要为他的行为承担责任——法律上的和道德上的。<br>但是，群体则不然，群体不需要承担任何责任，群体就是法律，群体就是道德，群体的行为自然是合理的。</blockquote><ul><li><p>9 第二个原因：传染</p><blockquote>群体情绪的相互传染——对群体的特点形成起着决定性的作用，决定着群体行为选择的倾向。</blockquote></li></ul><blockquote><p>个人的情绪迅速地传染了另外一些人。有的人很容易让其他人受到感染，有的人则不然。有的情绪特别容易在群体中传染开来，而另外一些情绪却没有什么效果。</p><p>感性的、本能的情绪特别容易传染，而理性的、而冷静的情绪在群体中不起丝毫作用。</p><p>并不是每个人都必然被群体情绪所传染——但如果他没有感受到这种情绪的话，他就会变成群体感情的敌对方。<br>被传染了的群体以他们完全非理性的力量主宰着这个世界。他们尽可以为所欲为，直到他们在行动中的群体不断分化、消散，这种极端情绪才会小时。</p></blockquote><p>(20240730)</p><ul><li><p>10 第三个原因：暗示</p><blockquote>我们的潜意识就像是潘多拉的盒子，一旦被打开，就会释放出太多本能性的冲动力量，而最终，却不明原因地被永久地封印于我们心灵的深处。</blockquote></li></ul><blockquote><p>长时间融入群体行动的个人，尽管他看起来并没什么根本性的变化，但随着时间的推移，他不久就会表现为——或者是在群体发挥催眠力量的有效影响下，或者是由于另外一些我们也许永久也无法弄清楚的原因——他让自己进入了一种特殊的存在状态。</p><p>个体中的人丧失了对自己行为辨别的能力，无论他正在做什么或是准备做什么，他自己根本没有能力控制，也缺乏认知的意识。<br>正如受到催眠的患者，群体中的人理智的力量与自控的能力遭到了毁灭性的破坏，而另外一些能力却得到了不可思议的强化。</p><p>群体只接受暗示力量的影响。<br>如果有谁想让群体冷静下来，或是改弦易辙，那只有使用不同的暗示。</p></blockquote><ul><li><p>11 野蛮的玩偶</p><blockquote>群体中的人做事时有明确的目标，但是他们却不知道自己在做什么。<br>这就像活动的生物知道自己在做什么，但构成这些行为本身的生物细胞却不知道自己在做些什么。</blockquote></li></ul><blockquote><strong>群体中的人不过是尘沙中的一粒微粒，他们只能任凭无意识的浪潮吹拂席卷，把他们带到任何一个地方。</strong></blockquote><ul><li><p>12 群体的行为</p><blockquote>在群体之中，绝对不存在理性的人。因为正如我们前面所说，群体能够消灭个人的独立意识，独立的思考能力。事实上，早在他们独立意识丧失之前，他们的思想与感情就已经被群体同化。</blockquote></li><li><p>13 群体的创造者</p><blockquote>群体往往会构成骚乱的理由，但群体却更多的表现为一个英雄主义的群体。<br>“我们经常会见到的那种令人无限景仰 利他主义行为，赴汤蹈火，慨然就义，为一种教义或观念而将个人的生死置之度外，或是愿意以自己的生命为代价追求它的纯洁性。这种情况最为常见地发生于一个群体之中，一个孤零零的个人愿意为了某一教义付出一切的事情，在现实中是很难见到的。”、</blockquote></li></ul><p><strong>某些观念一旦与我们的思维习惯相抵触，我们就很难接受。</strong></p><ul><li><p>15 群体的特征之一：冲动、易变和急躁</p><blockquote>孤立的个人具有住在自己反应行为的能力，群体则缺乏这种能力。</blockquote></li><li><p>16 群体极端表现（上）</p><blockquote>随着外界刺激因素的变化、群体的兴奋方式和兴奋程度不断发生变化，它们会服从种种原始的冲动，诸如豪爽的、残忍的、勇猛的或是懦弱的。<br>所有的这些冲动总是趋向一个计算，表现得极为强烈。<br>不要说个人利益，即便是生死安危，这些在独立的个人看来是再重大不过的事情，也难以与群体的原始冲动情绪相提并论。</blockquote></li><li><p>17 群体的极端表现（下）</p><blockquote>群体从一个极端走到另一个极端，往往用不了多少时间。</blockquote></li></ul><blockquote>群体，处于冲动状态之时，从不吝啬自己的 生命。</blockquote><ul><li><p>18 群体没有任何长远打算</p><blockquote>群体的兴许是极端情绪化的，它们易于被最为矛盾的情感所激发；但与此同时，它们又总是如同牵线的木偶一样，受到当前刺激因素的影响。</blockquote></li></ul><blockquote>群体一如狂风中席卷的落叶，随风飘零，任意西东，随着飘忽不定的气流向着任何一个方向飞舞，但他们最终要落回到地面上——解散后的群体中的每一个人终归要回到他们初始的生活状态中。</blockquote><ul><li><p>19 群体不承认障碍</p><blockquote>群体没有负罪意识，群体天然合理，他们无论做任何事情都是合乎正义的，他们的数量决定了这一点。</blockquote></li><li><p>20 引发冲动的导火索</p><blockquote>所有的群体都是盲动的，急躁的，冲动易变的。但是，不同群体的情绪冲动程度却有着明显的差异。</blockquote></li><li><p>21 群体特征之二：易受暗示与轻信</p><blockquote>群体相信一切不可能的事情，相信一切不合逻辑的事情，相信一切不可清理的事情，相信一切不存在的事情，唯独不相信现实生活的日常逻辑。<br>群体会相信子虚乌有的一切，诸如刀枪不入，诸如神怪显灵，诸如预言谶语，诸如一切与精神力量相关的事情。但凡这类不合逻辑的事情，总是能够获得他们几乎疯狂的虔信。</blockquote></li><li><p>22 群体在等待，永远在等待</p><blockquote>群体永远迷走于无意识的暗黑地带，如同一只被解除封印的低智商魔灵，随时听命于一切暗示，而对于理性的影响却无动于衷。客观来说，这只不过是一种低级生物特有的激情表达方式，并无任务不妥之处。</blockquote></li></ul><blockquote>群体却终究失去了他们一切的批判能力。<br>除了极端盲目与更为极端的轻信，群体没有别的选择。</blockquote><hr><h2>第2章 群体的情感和道德观</h2><ul><li><p>1 群体是用形象来思维的</p><blockquote>群体惯于把歪曲性的想象力与因为这种想象所引发的幻觉，事实混为一谈。<br>群体无法辨别真实与幻觉，只是因为群体根本没有能力去区别主管与客观。</blockquote></li></ul><p>（20240731）</p><ul><li><p>2 群体观察能力的缺失</p><blockquote>一旦墓地一边有二十个女人进入了痉挛状态，墓地另一边就会有更多的人这样。</blockquote></li></ul><p><strong>群体幻觉，不外如是。</strong></p><ul><li><p>5 群体中的智力泯灭</p><blockquote>一旦人的智力品质泯灭，独立思考能力被严重消耗的时候，此时的判断力和逻辑都任由暗示与传染的作用引导，转向一个共同的趋势。这样一来，暗示的方向就会立即成为判断的结果，它又反过来进一步吞噬残存的智力品质，这就构成了群体智力泯灭的惊人机制。</blockquote></li></ul><blockquote>个人智力泯灭存在着以下四个阶段：<br>第一个阶段是自我意识模糊；<br>第二个阶段是独立思考能力下降。<br>第三个阶段是判断力与逻辑在暗示与传染的作用下趋同一致；<br>第四个阶段是残存的智力品质被彻底吞噬。</blockquote><ul><li><p>6 群体的谎言（上）</p><blockquote>当个体集结到一起之后，群体的谎言就成为了自然而然的事情。</blockquote></li><li><p>7 群体的谎言（下）</p><blockquote>谎言的传播会经历如下一套机制：<br>第一个阶段是谎言的制造阶段；<br>第二个阶段是谎言的被肯定阶段；<br>第三个阶段是全面的谎言扩散，这时整个群体都将成为说谎者。</blockquote></li><li><p>9 群体只会撒谎</p><blockquote>群体的证词毫无意义，他们只会撒谎。<br><strong>被越多的人证明的事件，往往就错的最荒谬。那些受到最严重质疑的事情，往往就是观察者人数最多的事件；反过来，如果一件事情同事被数千个目击者证实，这通常也就是说，真相与公认的记述相去甚远。</strong></blockquote></li></ul><p><strong>乌合之众</strong>。<br>（20240801）</p><ul><li><p>10 群众杜撰的历史（上）</p><blockquote>无论发生过怎样的历史事件，总会因为群体的以讹传讹而变得众说纷纭，当时间推移，当历史传承到需要记载下来的那一刻时，它就早已丧失了它的本来面貌。<strong>像这样的历史被记载下来，恐怕也只是一种纯粹想象的产物。</strong></blockquote></li><li><p>11 群众杜撰的历史（中）</p><blockquote>群体依靠想象和杜撰来创造英雄。</blockquote></li><li><p>12 群众渡船的历史（下）</p><blockquote>数千年后，未来的饱学之士面对这些互相矛盾、众说纷纭的记载时，恐怕能够得出的唯一结论就是——这些所谓的英雄或暴君，从来就没有真实地存在过，他们只是人们为了满足心理需要而杜撰出来的产物。</blockquote></li><li><p>13 群体的极端感情（上）</p><blockquote><p>当教皇乌尔班二世站在克列芒教堂前，于紫红色丝绒铺就的高台上激情地演讲时，无数耳闻异教徒暴行的人们开始踊跃地加入十字军。他们来自欧洲的各个地方，甚至包括最偏僻、最遥远的角落。然而这成千上万的人却并不都是战士，他们中的绝大多数人是忠实的信徒、冒险者、穷人、酒徒、浪荡子、瘸子、哑巴、老人甚至还有妇女和儿童。</p><p>这些人之所以会如此忘我地投身到那场战争中去，并不全是因为对财富的渴求，与宗教信仰的联系也不多。</p><p>唯一的原因是他们渴望融入群体。</p><p>只有身处群体之中，这些傻瓜、低能儿和心怀妒忌的人才能拜托自己卑微无能的感觉。</p><p>只有身处群体之中，他们才能感觉到一种残忍、短暂但又巨大的力量。</p></blockquote></li><li><p>14 群体的极端感情（下）</p><blockquote><p>我们常常会谈到“法不责众”，和它字面意思不同的是，这个词说不是法律的管辖权，而是指群体的自我心理暗示。</p><p>这是一种非常卑微的心理安全感。首先，他们认为自己不可能受到惩罚，而且人越多，这种信念就越坚强。</p><p>然后，他们会因为人多势众而产生一种强烈的力量感，这会让群体表现出一些孤立的个人不可能有的情绪和行动。</p><p>不幸的是，群体的这种夸张倾向，常常作用于一些恶劣的感情，他们是原始人的本能隔代遗传的残留。</p></blockquote></li></ul><blockquote><strong>最卑劣的行为总是像有毒的杂草一样生长在群体中。</strong></blockquote><ul><li><p>15 打动群体的东西</p><blockquote>群体易于爆发狂暴而极端的感情，也最容易为狂暴而极端的感情所打动。当他们被打动之后，就会像我们前文中说的，汇成一道毁灭性的洪流，摧毁一切阻挡他们的障碍。</blockquote></li><li><p>16 群体的夸张妨碍智力（上）</p><blockquote>我们常常认为人群总要比个人聪明，事实上，这一点是绝无可能的。<br>当个人汇集成群体时，绝不会有集思广益这样的事情发生，相反，群体的叠加只能增加他们的愚蠢，智力会大幅度下降。<br><strong>相比于个人，群体不存在思考的智力优势。</strong></blockquote></li><li><p>19 群体的偏执与专横（下）</p><blockquote>我们常说，一个民族会有自己的民族性格，却很少有人真正理解民族性格的含义，它其实是指支配人们感情和思想的基本种族观念。</blockquote></li></ul><blockquote>一个民族固然可以拥有感性气质，这在一定程度上可以促进艺术与文学的发展。但是这种情绪化的民族性格却万万不能过于严重，否则一切善恶标准，是非观念都将会被轻易地抹杀。<br>假如一个民族过分地严谨而理性，最严重的后果无非是精神领域的空虚；但如果一个民族只按照情绪的指令来行事，那么简直无异于灾难的后果。</blockquote><ul><li><p>20 群体渴望强权</p><blockquote><strong>群体随时会反抗软弱可欺者，而对强权低声下气！</strong></blockquote></li><li><p>21 群体的保守本能</p><blockquote>群体可能会渴望着改朝换代，为这样的变革，他们甚至不惜发动暴力革命，然而<strong>革命并非为了改变深层的东西，只是群体发泄情绪的手段而已。</strong></blockquote></li><li><p>22 群体的道德（上）</p><blockquote>如果我们把道德定义为持久地尊重一定地社会习俗，不断抑制私心的冲动，那么很明显，群体不具备任何道德。<br>之所以这么说，是因为群体既多变，又容易冲动，因此他们很难遵守我们对道德的定义。<br>假如我们改变一下道德的定义，把它定义成某些一时之间表现出来的品质，比如舍己为人、自我牺牲、不计名利、勇于献身和对平等的渴望等等，那么我们就可以说，群体常常会表现出很高的道德境界。</blockquote></li><li><p>23 群体的道德（上）</p><blockquote>当群体以名誉、光荣和爱国主义作为号召时，最有可能对群体中的个人产生印象，甚至达到让他慷慨赴死的地步。</blockquote></li><li><p>24 群体的道德净化作用</p><blockquote>当个人融入群体之后，往往会表现出崇高的道德水平，即使在一群罪大恶极的坏蛋中间，也经常会出现这样的情况。<br>恶棍们仅仅因为是群体中的医院，便会暂时地表现出严格的道德纪律。</blockquote></li></ul><p>（20240802）</p><hr><h2>第3章 群体的观念、推理与想象力</h2><ul><li><p>1 群体只接受简单观念</p><blockquote>简单地说，群体能够接受的观念有两类。<br>第一类是时尚的观念。<br>第二类是基本观念。</blockquote></li></ul><blockquote>无论为群体提供上述观念中的哪一种，他们都必须是绝对的、毫不妥协的、不容置疑的。<br>最重要的一点是，他们必须是最简单明了的。<br>正如我们前面所说，群体是用形象来思考的，并且容易夸张，容易陷入极端。正因为如此，想要某一种观念对群体产生有效的影响，它就必须披上形象化的外衣。</blockquote><ul><li><p>2 如何让群体接受新观念</p><blockquote>只有简单而明了的观念，才能被群体所接受，然而并不是所有的观念都是简单明了的。<br>想让它更容易被群体接受，就要对其来一番彻底的改造，使其更加通俗易懂。特别使那些高深莫测的哲学或科学观念，以群体低劣的智力水平是根本无法接受的，因此，对它的改造也就来得更深刻。<br>尽管随着种族间理性程度和聪明才智的不同，这种改造有的时候大一些，有的时候小一些，但是无论如何，改造的方向都必须是低俗化和简单化。<br>之所以这样，是因为从社会的角度看，观念从来不存在等级制度。我们从来没发现哪种观念会比另一种高明，这是因为不管观念刚出现时多么伟大或正确，只要它一进入群体的治理范围，它那些高深或伟大的成分，便会被立即剥夺殆尽。</blockquote></li></ul><p>文中举例：17世纪，彼得大帝在俄罗斯进行变革——刮胡子为因子。</p><ul><li><p>3 群体难于被动摇</p><blockquote>旧观念很难被消除，对待同一个明显的道理，有理性的人或许会接受，但是换成缺乏理性的人，则很快会被他无意识的自我带回原来的观点。</blockquote></li></ul><blockquote>群体很容易处在旧观念的影响之下。<br>因为它们已经变成了一种情感。这种挂呢喃，才是影响着我们言行举止最隐秘的动机。</blockquote><p><strong>犹如潜意识，不知有没有“群体潜意识”这一说。</strong></p><blockquote>这就意味着，只要观念能够深入到群体的头脑中，并且产生一系列效果时，和它对抗就是徒劳的。<br>这就导致了一个社会学现象：所有的群体都很难被动摇。</blockquote><ul><li><p>4 群体的伪推理能力</p><blockquote>群体推理的特点，是把彼此不同，只是表面相似的事物搅在一起，并且立刻把具体的事物普遍化。因此不妨这样说，它们并不推理或只会错误地推理，并且绝不会受到推理过程的影响。<br>这样看起来，只要能够为群体提供这样的论证，那么也就等于操纵了群体。</blockquote></li></ul><blockquote><p>在群体的讲演中，即使有二十本真知灼见的著作，也比不上能够号召起投保风暴的话语。</p><p>**群体没有推理能力，因此它也无法表现出任何批判精神；也就是说，它不能辨别真伪或对任何事物形成正确的判断。群体所接受的判断，仅仅是强加给它们的判断，而绝不是经过讨论采纳的判断。</p></blockquote><ul><li><p>5 群体的想象力（上）</p><blockquote>在历史上，表象总是比真相起着更重要的作用，而不是显示的因素总是比现实的因素更重要。</blockquote></li><li><p>6 群体的想象力（下）</p><blockquote><strong>群体没有理想的思维过程，虚构的因素对它们的影响，几乎比现实因素的影响还要大，它们对于这两者，有着不加区分的明显倾向。</strong></blockquote></li><li><p>7 掌握群体的想象力（上）</p><blockquote><strong>想要领导群体，就要在它们的想象力上下大功夫。</strong></blockquote></li><li><p>8 掌握群体的想象力（下）</p><blockquote>第一，采取的形式必须是令人吃惊的鲜明形象。<br>第二，一定不要做任何多余的解释，只要再列出几个不同寻常或神奇的事实就足够了。</blockquote></li></ul><blockquote>影响民众想象力的并不是事实本身，而是它们发生和引起注意的方式。只有对他们及逆行浓缩加工，它们才会形成令人瞠目结舌的惊人形象。</blockquote><p>(20240803)</p><h2>第4章 群体信仰所采取的宗教形式</h2><ul><li><p>1 群体的偶像崇拜（上）</p><blockquote>偶像崇拜有着非常简单的特点，有五大标志来供我们辨认。<br>第一，偶像总是凌驾于信徒之上，处于高高在上的地位，这一点有着决定性的作用。<br>第二，信徒总是盲目服从偶像的命令。<br>第三，信徒没有能力，也不愿意对偶像规定的信条进行讨论。<br>第四，信徒有着狂热的信念，希望把偶像的信条广加传播。<br>第五，信徒倾向于把不接受它们的任何人视为仇敌。</blockquote></li><li><p>2 群体的偶像崇拜（下）</p><blockquote>群体的信念有着盲目服从，残忍的偏执以及要求狂热的宣传等等这些宗教感情固有的特点，因此可以说，它们的一切信念都具有宗教的形式，受到某个群体拥戴的英雄，在这个群体看来就是一个真正的神。</blockquote></li><li><p>3 如何建立偶像崇拜</p><blockquote>第一，要对群体的想象力善加利用，为群体提供一个鲜明的形象，使之产生幻想。<br>第二，当群体开始沉湎于妄想中时，要果断而大胆地对其进行洗脑，以夸大其词、言之凿凿、不断重复的方式来煽动群众的情绪。<br>第三，当群众开始陷入狂热之后，则要以领导者的面目出现，为它们指出方向，用信念来激励它们，使得它们重新开始想入非非，并在其中找到属于自己的幸福。</blockquote></li><li><p>4 偶像崇拜不会消亡</p><blockquote>偶像崇拜这种形式并不会真正地消亡，无论时代进步到何种程度，即使不再有圣坛于雕像存在，也会有新的形式来代替它。民众的迷信于崇拜，不会有丝毫的减少。</blockquote></li><li><p>5 观念</p><blockquote>任何一桩惨案，总是群众所为！<br>无论是圣巴托洛谬的大屠杀，还是惨烈的宗教战争，并不完全是国王们所为，就是恐怖统治不完全是罗伯斯比尔、丹东或圣鞠斯特所为一样。<br>在这些事件的深处，统治者的权利并不全是永远存在，有的只是永恒的群体宣泄。</blockquote></li></ul><p>（20240804）</p><hr><h1>第二卷 群体的意见与信念</h1><h2>第1章 群体的意见与信念中的间接因素</h2><ul><li><p>1 群众运动的导火索</p><blockquote>群体意见和信念形成因素：间接因素和直接因素。</blockquote></li></ul><blockquote><p>间接因素是这样的东西，它能够使群体接受某些信念，并使其再也难以接受别的信念。它在很长的一段事件里煽动着群体，是他们的情绪开始酝酿。</p><p>直接因素是指这样一些因素，随着上述上期性准备工作的延续，它们能够成为实际说服群体的资源。</p></blockquote><ul><li><p>2 第一条导火索：民族</p><blockquote>每个民族都有它独有的特点。<br>这种特点又形成了它的民族性格。<br>民族性格不仅不会被改变，而且还具有巨大的力量。</blockquote></li><li><p>3 第二条导火索：传统</p><blockquote>过去的观念、欲望和感情，构成了传统。<br>每个民族都拥有自己的传统，因此也可以说，传统是民族的特性之一。这种东西很难发生改变，而且对我们的生活发生着巨大的影响。<br>传统不仅稳定，而且支配着人们的行动，尤其当它们形成群体时更是如此。</blockquote></li></ul><blockquote>如果一个民族使自己的习俗变得过于牢靠，它便不会再发生变化，中国是这方面的典型，它死气沉沉的固有习俗，使得整个国家没有任何改进的能力。</blockquote><p>本书首版1895年，彼时中国（清政府）在于日本甲午战争中战败，被迫签订马关条约。<br>因而，八国联军一一种蛮横的姿态摧毁了旧中国，在苦痛中，无数仁人志士，穷则思变，寻找出路。</p><ul><li><p>4 第三条导火索：时间</p><blockquote>时间是世界万物的真正创造者。<br>时间也是世界万物的唯一毁灭者。</blockquote></li></ul><blockquote>时间引起一切信仰的诞生、成长和死亡。它们因为时间而获得力量，同事也因为时间而失去力量。<br>群体的意见和信念由时间酝酿起来，或者它至少为它们准备了生长的土壤。一些观念可实现于一个时代，却不能实现与另一个时代，原因就在这里。<br><strong>时间把各种信仰和思想的碎屑堆积成山，从而使某个时代能够诞生它的观念。这些观念的出现并不像掷骰子一样全凭运气，它们都深深根植于漫长的过去。当它们开火结果时，是时间为它们做好了准备。如想了解它们的起源，就必须回顾既往。</strong></blockquote><ul><li><p>5 第四条导火索：政治和社会制度</p><blockquote>几乎所有人都认为，制度能够改革社会的弊端。<br>各种社会学说都有同样的看法，改进制度与统治可以为国家带来进步，社会变革可以用各种命令来实现。</blockquote></li></ul><blockquote><p>然，<strong>制度与制度之间，根本不存在好与坏的区别。</strong><br>制度与制度之间，根本不存在好与坏的区别。<br>观念，感情和习俗是相当稳定的东西，绝不随着法典改写而被一并改写。<br>制度和政府都是民族的产物，这就决定了它绝不可能创造某个时代，只能被这个时代所创造。</p><p>制度无法解决现实中存在的问题，临租的幸福也不能到制度中去寻找。<br>制度与一个民族的伟大以及另一个民族的衰败都是毫不相干的。各民族都是受自己的性格支配的，凡是与这种性格不合的模式，都不过是意见借来的圈套，一种暂时的伪装。<br>尽管道理是这样的，但民众认识不到这一点，他们将不满归结于某种制度，又将希望寄托于某种制度，就像对待圣人的遗骨一样对待未实行的制度，赋予这些制度创造幸福的超自然力量。<br>正因为如此，为强行建立某些制度而进行的血腥战争和暴力革命一直都在发生，而且还会继续发生，看不到一丝停止的迹象。</p></blockquote><p>（20240805）</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.hantaotao.top/archives/132/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>《娱乐至死》— 尼尔·伯茨曼（ Updated：20240727）</title>
<link>https://blog.hantaotao.top/archives/131/</link>
<guid>https://blog.hantaotao.top/archives/131/</guid>
<pubDate>Wed, 17 Jul 2024 23:20:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[序言乔治·奥威尔《一九八四》，1949年所著小说，描述了未来（老大哥）独裁统治下的恐怖场景。奥尔德斯·赫胥黎《美丽新世界》，1932年所著小说，以讽刺手法描述了他心目中的未来世界。奥威尔害怕的是...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>序言</h1><p><img src="https://image.hantaotao.top/image/2024/reading/amusingourselvestodeath/resize,m_mfit,h_750,w_750" alt="resize,m_mfit,h_750,w_750" title="resize,m_mfit,h_750,w_750"><br>乔治·奥威尔《一九八四》，1949年所著小说，描述了未来（老大哥）独裁统治下的恐怖场景。<br>奥尔德斯·赫胥黎《美丽新世界》，1932年所著小说，以讽刺手法描述了他心目中的未来世界。</p><p>奥威尔害怕的是那些强行禁书的人，赫胥黎担心的是失去任何禁书的理由，因为再也没有人读书。<br>奥威尔害怕的是剥夺我们信息的人，赫胥黎担心的是人们在汪洋如海的信息中变得被动且自私。<br>奥威尔害怕的是真理被隐瞒，赫胥黎担心的是真理被淹没在无聊琐碎的世事中。<br>奥威尔害怕的是我们的文化成为受制文化，赫胥黎担心的是我们的文化成为充满感感官刺激、欲望和无规则游戏的庸俗文化。</p><p>在《一九八四》中人们受制于痛苦，而在《美丽新世界》中，人们由于享乐主义失去了自由。简而言之，奥威尔担心我们憎恨的东西会毁掉我们，而赫胥黎担心的 是，我们将毁灭于我们所热爱的东西。</p><p>而《娱乐至死》，则显著支持赫胥黎的观点：“人们将毁灭于我们所热爱的东西。”这本书将逐渐阐述此观点。奶头乐.娱乐至死。</p><p>从今天开始，将正式开始阅读《娱乐至死》。</p><h1>第一部分</h1><h2>第1章 媒介即隐喻</h2><blockquote><p>信息是关于这个世界的明确具体的说明，但是我们的媒介，包括那些使会话得以实现的符号，却没有这个功能。它们更像是一种隐喻。</p><p>隐喻是一种通过把一事物和其他事物做比较来揭示该事物实质的方法。</p><p>如果事物总是不同于它的表象，如果微生物不可见地隐藏于我们的皮肤内外，如果隐形世界控制了有形世界，那么本我、自我和超我是否也可能不可见地隐藏在某个地方？</p></blockquote><p>（20240717）</p><h2>第2章 媒介即认识论</h2><blockquote>认识论是一门有关知识的起源和性质的复杂而晦涩的学问。和本书有关的是认识论对于真理的定义以及这些定义的来源所表现出来的兴趣。</blockquote><p>以此来论证：<strong>对于真理的认识是同表达方式密切相连的，真理不能，也从来没有毫无修饰地存在。它必须穿着某种合适的外衣出现，否则就可能得不到承认，这也正说明了”真理“是一种文化偏见。</strong></p><blockquote>每一种思想的新工具的诞生都会达到某种平衡，有得必有失，虽然这种平衡并不是绝对的。</blockquote><p>旧时代是电视取代了印刷术，新时代是短视频等新媒体对于广播电视等旧媒体的取代，然而一味的批评短视频毫无意义，事物的两面性不可忽略。短视频的兴起为广大普通人民提供了一个展现自我、得以发声的平台，哪怕这平台是被监管的。新媒体对旧媒体的冲击不可忽视。<br>（20240718）</p><h2>第3章 印刷机统治下的美国</h2><blockquote><p>探索印刷机作为一种象征和认识论，是怎样使公众变得严肃而理性的，而今日的美国又是怎样远远背离这一切的。</p><p>很多这样的演讲厅起源于“学园运动”——一种成人教育形式。据说这个运动是由一个新英格兰的农民发起的，其目的是传播知识、推行普通学校、设立图书馆以及建立演讲厅。1835年前，在美国的15个州里有3000多个演讲厅，但大多数都是在阿勒格尼山东部。到了1840年，一些边远地区，比如艾奥瓦州和明尼苏达州，也出现了演讲厅。</p><p>印刷术影响着人们说话的方式。</p></blockquote><p>这一章节中，也介绍了书籍、印刷术在美国的发展历时，巍为可观，这也许就是造就了美国开放自主的文化底蕴之一。<br>（20240719）</p><h2>第4章 印刷机统治下的思想</h2><p>我的理解，这本书里的“印刷机”或者“印刷术”应从广义上进行理解，例如，传统的、理性的、富有逻辑的，等。同理“电视机”也应该从广义上进行理解，例如：富有娱乐性的。</p><blockquote>林肯和道格拉斯（那个时候）都不是总统候选人，在他们进行辩论的时候，他们甚至还不是美国参议院候选人。但是他们的听众并不特别关心他们的政治级别，这些人把这样的场合作为政治教育的一部分，他们认为这是社会生活的组成部分，而且他们早已习惯这种极为耗时的演讲。</blockquote><p>如今年代，title貌似已经成为话语重量的代名词。</p><blockquote>资本主义被证明是一种理性而开明的经济生活制度，宗教迷信遭到猛烈攻击，王权的神圣遭到挑战，人们认识到社会需要不断进步，普及教育势在必行。</blockquote><p>所以，究竟什么是资本主义？我们从小被教育，资本主义代表着剥削，是负面的代名词；这是被动接受的教育显性或隐形告诉我们的，但实际上我们从未全面的调查了解过“究竟什么是资本主义？”，不了解事情的全面性就不具备发言权。有记忆以来，仅在大学时行驶过一次选举权，然后还不是自己的意愿，被指派投票：<strong>被代表的人们，真的有过当家做主吗？</strong></p><blockquote>在《理性时代》一书中，潘恩大力抨击《圣经》和后来的所有基督教神学。关于耶稣，潘恩承认他是一个德高望重、亲切和蔼的人，但那些关于他神性的故事却被潘恩斥为荒诞不经的。作为一个理性主义折，潘恩是对《圣经》进行了细致的文本分析才得出这样的结论。他写道：“所有的教堂，不论是犹太教、基督教或土耳其教，在我看来都只不过是人的发明，是为了吓唬和奴役人类、垄断权力和利益而建立的。”</blockquote><p>也许，一切的开始都是好的，例如制度或其初衷，然而随着时间推移、条件的改变，事情的发展并不如初衷那般，变了味。</p><blockquote><p>如果只拘泥于耳熟能详的专门术语，就会丧失对事物进行宏观而认识的能力，即使在熟悉的领域里也一样。</p><p>公众人们被人熟悉，是因为他们的文字，而不是因为他们的外貌，甚至不是因为他们的演讲术。我们完全可以相信，美国的前15位总统如果走在街上，没有人会认出他们是谁。那个时期的著名律师、牧师和科学家也是如此。想到那些人就是想到他们的著作，他们的社会地位、观点和知识都是在印刷文字中得到体现的。</p></blockquote><p>这里的印刷文字，即他们的著作，他们的思想，他们的文化；因为印刷术这里被代指为富有逻辑的、严密的思考之后的呈现以文字的结果。</p><blockquote>对于印刷术统治美国人思想的那个时期，我给了它一个名称，叫“阐释年代”。阐释是一种思想的模式，一种学习的方法，一种表达的途径。所有成熟华语所拥有的特征，都被偏爱阐释的印刷术发扬光大；富有逻辑的复杂思维，高度的理性和秩序，对于自相矛盾的憎恶，超常的冷静和客观以及等待受众反应的耐心。到了19世纪末期，由于某些我急于解释的原因，“阐释年代”开始逐渐褪去，另一个时代出现的早期迹象已经显现。这个新的时代就是“娱乐业时代”。</blockquote><p>（20240720）</p><h2>第5章 躲猫猫的世界</h2><blockquote><p>交通和通讯可以彼此脱离，空间不再是限制信息传播的、不可避免的障碍。</p><p>电报摧毁了关于信息的原有定义，并赋予公众话语一种崭新的含义。</p><p>我们匆匆地建立起了从缅因州通往德克萨斯州的磁性电报，但是缅因州和德克萨斯州可能并没有什么重要的东西需要交流......我们满腔热情地在大西洋下开通隧道，把新旧两个世界拉近几个星期，但是到达美国人耳朵里的第一条新闻可能却是阿德雷德公主的百日咳。</p></blockquote><p>这算是守旧派的经典发言吗？明确的需求产生新的技术，但是相应的新的技术可产生新的需求，习惯了过去，并不是拒绝新技术的理由，哪怕这新技术的用途一时不是那么明显。</p><blockquote>在信息的海洋里，却找不到一点儿有用的信息。<br>但我们生活中的大多数新闻都是不起作用的，至多是为我们提供一点二谈资，却不能引导我们采取有益的行动。这正是电报的传统：通过生产大量无关的信息，它完全改变了我们所称的“信息——行动比”。</blockquote><p>这句话用来形容现在这个时代倒也是挺适合的，在信息的海洋里，眼花缭乱，但少了这些信息，人们是否就因此而寸步难行？还是说，正因为人们的精力被这纷繁的信息所消耗，阶级才得以固化？</p><blockquote><p>电报对公众话语的贡献就是使它变得无聊而且无能。还不知这些，电报还使公众话语变得散乱无序。用刘易斯.芒福德的话来说就是，它带给我们的是支离破碎的时间和被割裂的注意力。<strong>电报的主要力量来自它传播信息的能力，而不是收集信息，解释信息或分析信息。</strong></p><p>电报只适合于传播转瞬即逝的信息，因为会有更多更新的信息很快取代他们。这些信息后浪推前浪地进出于人们的意识，不需要并不容你稍加思索。<br>电报式华语不允许人们进行历时的回顾，也不鼓励深入的分析。对于电报来说，智力就是知道很多事情，而不是理解它们。</p><p><strong>过去人们是为了解决生活中的问题而搜寻信息，现在是为了让无用的信息派上用场而制造问题。</strong></p><p>19世纪末20世纪初以电报和摄影为中心的交流媒介创造了躲猫猫的世界，但在电视出现之前，没有人想要生活在那个世界里。<br>所有这些电子技术的合力迎来了一个崭新的世界—躲猫猫的世界。在这个世界里，一会儿这个，一会儿那个突然进入你的视线，然后又很快消失。这是一个没有连续性、没有意义的世界，一个不要求我们也不允许我们做任何事的世界，一个像孩子们玩的躲猫猫游戏那样完全独立鼻塞的世界，但和躲猫猫一样，也是其乐无穷的。</p></blockquote><p>这个“<strong>其乐无穷</strong>”感觉像是图穷匕见。</p><blockquote><p>如果我们中的某些人不能适应这个时代的模式，那么在我们看来，是这些人不合时宜，行为乖张，而绝不是这个时代有什么问题。</p><p>本书后面的一个目标是要让电视认识论再次进入人们的视线。我要用具体的实例来证明，电视的思维方式和印刷术的思维方式是格格不入的；电视对话会助长语无伦次和无聊琐碎；“严肃的电视”这种表达方式是自相矛盾的；电视只有一种不变的声音—娱乐的声音。</p></blockquote><p>（20240721）</p><h1>第二部分</h1><h2>第6章 娱乐业时代</h2><blockquote><p>当然，和大脑一样，每种技术也有自己内在的倾向。在它的物质外壳下，它常常表现出要派何种用场的倾向。只有那些对特技的历时一无所知的人，才会相信技术是完全中立的。</p><p>我们的问题不在于电视为我们展示具有娱乐性的内容，而在于所有的内容都以娱乐的方式表现出来，这就完全是另一回事了。<br>尽管有时主题是严肃的，而意义是无法理解的。</p></blockquote><p>（20240722）</p><h2>第7章 “好......现在”</h2><blockquote><p>“好......现在”常被用于广播和电视的新闻节目，目的在于指出我们刚刚看到的东西同我们将要看到或听到的东西毫无关系。</p><p>观众还知道，有的新闻不管看上去有多严重（例如，在作者写作本文时，一个海军陆战队的将军宣称美国和俄罗斯之间的核战争无法避免），它后面紧跟着播放的一系列广告就会在瞬间消解它的重要性，甚至让它显得稀松平常。</p><p>无法察觉谎言的社会是没有自由的。</p><p>公众沉醉于现代科技带来的种种娱乐消遣中，对于自相矛盾这种东西早已失去了感知能力，为了这样的公众，处心积虑掩盖事实显然是多此一举的。</p></blockquote><p>恰如<strong>互联网没有记忆</strong>一般。<br>（20240723）</p><h2>第8章 走向伯利恒</h2><p>伯利恒，即基督耶稣和大卫王的出生之地，宗教色彩浓郁。</p><blockquote>在这些节目中，传教士是头号人物，上帝只能充当配角。</blockquote><blockquote><p>电视最大的长处是它让具体的形象进入我们的心里，而不是让抽象的概念留在我们的脑海中。</p><p>汉娜·埃伦萨在反思了大众文化的产物后，写了这样一段话：“这种在世界上独一无二的状况可以称为“大众文化”‘它的倡导者既不是大众也不是艺人，而是那些试图用曾经是文化中真实可信的东西来娱乐大众的人，或是那些试图证明《哈姆雷特》和《窈窕淑女》一样有趣，一样具有教育意义的人。大众教育的危险在于它可能真的变成一种娱乐。有很多过去的伟大作家经过了几个世纪的销声匿迹，如今又重新回到了人们的视野，但我们不知道，他们作品的娱乐版还能否留在人们心里。”</p><p>真正的危险不在于宗教已成为电视节目的内容，而在于电视节目可能会成为宗教的内容。</p></blockquote><p>（20270726）</p><h2>第9章 伸出你的手投上一票</h2><blockquote><p>一个40岁的美国人在他的生活中已经观看了超过100万条电视广告，在他收到第一张退休金支票前，海会看另外1万条广告。所以，我们可以推断，电视广告已经深刻的影响了美国人的思维习惯。</p><p>广告商需要知道的不是产品有什么好处，而是购买者有什么问题。于是，企业开支的重心从产品开发转向了市场调查。电视广告把企业从生产有价值的产品引向了设法使消费者感觉产品有价值，这意味着企业的业务已经成为一种伪疗法，消费成了信赖心里表演疗法的病人。</p></blockquote><p>十分讽刺。</p><blockquote><p>贾维茨和拉姆齐·克拉克一样相信理性的重要，但他更加相信参议院位置的重要性。他清楚地认识到我们处在一个怎样的时代。他明白，在一个电视和其他视觉媒介占重要地位的世界里，“政治知识”意味着图像，而不是文字。最后的结果也证明了他是有远见的，他以纽约州历史上最多的选票赢得了席位。</p><p>这就是所有成功的电视广告的经验：它们给我们一个口号，一个象征或一个为观众创造出引人注目的形象的焦点。</p><p>我们常常把票投给那些性格，家庭生活和风格在电视屏幕上表现出色的人。</p></blockquote><blockquote><p>人们常常以自己形象塑造上帝。</p><p>特伦斯·莫兰认为，在一个本身结构就是偏向图像和片段的媒介里，我们注定要丧失历史的视角。他说，没有连续性和语境，“零星破碎的信息无法汇集成一个连贯而充满智慧的载体”。我们不是拒绝记忆，我们也没有认为历时不值得记忆，问题的症结在于我们已经被改造的不会记忆了。</p></blockquote><p>恰如<strong>互联网没有记忆</strong>一般，颇为讽刺。</p><blockquote>《权利法案》规定政府不得限制信息和民众意见的流动。</blockquote><p>实名羡慕！</p><h2>（20240726）</h2><h2>第10章 教育是一种娱乐活动</h2><blockquote>约翰·杜威曾经说过，课程的内容是学习过程中最不重要的东西。我们这里也许可以借用他的观点作为指导。他在《经验与教育》中写道：“<strong>也许人们对于教育最大的错误认识是，一个人学会的只有他当时正在学习的东西。其实，伴随学习的过程形成持久的态度......也许比拼写课或地理历时课程更为重要......因为这些态度才是在未来发挥重要作用的东西。</strong>”</blockquote><p>这句话真实太经典了，换一种角度来说，学习的结果固然重要，但是相对于结果来说，学习过程中所展现出的态度与方法更为重要！当然，前提是正向的态度与方法。</p><blockquote><p>电视对教育的主要贡献是它提出了教学和娱乐不可分的理念。<br>教育学家认为获得知识是一件困难的事情，因为其中必然有各种约束的介入。他们认为学习是付出代价的，耐力和汗水必不可少；个人的兴趣要让位于集体的利益。<br>西塞罗说过，教育的目的是让学生们摆脱现实的奴役，而现在的年轻人正竭力做着相反的努力——为了适应现实而改变自己。</p><p>电视提供了一个诱人而富有创意的不同选择，我们也许可以说，电视提出了三条戒律并由此形成了教育的哲学。</p><p>其一：<strong>你不能有前提条件。</strong></p><blockquote>每一个电视节目都应该是独立完整的，观众在观看节目的时候不需要具备其他知识，我们不能说学习是循序渐近的，也不能强调知识的积累需要一定的基础。（这句话的理解需要从广义上进行理解，在电视节目中偶的一个小知识点也算是一种广义上学习。）</blockquote><p>其二：<strong>你不能令人困惑。</strong></p><blockquote>在电视教学中，让观众心生困惑就意味着低低收视率，遇到难题的学习者必然要转向其他频道。这就意味着电视节目中不能有任何需要记忆。学习、运用甚至忍受的东西，也就是说，任何信息、故事或观点都要以最易懂的方式出现，因为对于电视来说，最重要的学习者的满意程度，而不是学习者的成长。</blockquote><p>其三：<strong>你应该躲避瘟神一样避开阐述。</strong></p><blockquote>在电视教学的所有敌人中，包括连续性和让人困惑的难题，没有哪一个比阐述更可怕。</blockquote><p>如果要给这样一种没有前提条件、没有难题，没有阐述的教育取一个名字，那这个只能是“娱乐”。</p><p>霍特—莱因哈特—温斯顿出版公司的贾尼斯·特雷比·理查兹强调说：“研究表明，当信息通过戏剧化的方式表现出来时，学习的效果最明显，电视在这方面可以比任何其他媒介都做得更好。”（maybe 存疑）<br>教育部的官员认为，把电视、铅字和电视这三种媒介结合在一起，能够培养高层次的思维能力。</p></blockquote><p>（20240727）</p><h2>第11章 赫胥黎的警告</h2><blockquote><p>有两种方法可以让文化精神枯萎，一种是奥威尔式的——文化成为一个监狱，另一种是赫胥黎式的——文化成为一场滑稽戏。</p><p>赫胥黎告诉我们，在一个科技发达的时代里，造成精神毁灭的敌人更可能是一个满面笑容的人，而不是那种一眼看上去就让人新生怀疑和仇恨的人。</p><p>如果人民蜕化为被动的观众，而一切公共事物形同杂耍，那么这个民族就会发现自己危在旦夕，文化灭亡的命运就在劫难逃。</p><p>美国正在进行一个世界上最大规模的试验，其目的是让人们投身于电视插头带来的各种娱乐消遣中，这个试验在19世纪中期进行得缓慢而谨慎，到了现在，20世纪的下半叶，已经通过美国和电视之间的亲密关系进入了成熟阶段。<br>   那些讨论这个问题的人必须常常提高他们的嗓门才能引起注意，甚至达到声嘶力竭的程度，因此他们被人斥为“懦夫”“社会公改害”或“悲观主义者”。他们之所以遭人误解，是因为他们想要被人关注的东西看上去是丝毫无害的。</p><p>赫胥黎试图在《美丽新世纪》中告诉我们，人们感到痛苦的不是他们用笑声代替了思考，而是他们不知道自己为什么以及为什么不再思考。</p></blockquote><p>全书完。<br>（20240727）</p><h1>小结</h1><p>这本书看的有点不适应，可能是长久受到论文的毒害了，开头先阐明研究对象，方法和结果，之后进行研究过程的详细论述，最后再做总结。而这本书的篇幅语句上，可能是由于为了更加清晰讲明自己的观点，有很多重复论述。<br>不过瑕不掩瑜，盛名已久，自有可取之处。</p><p>将“电视”这一概念理解为“新媒体”也许更为合适，尤其为短视频。</p><p>新事物的兴起必然会带来对旧事物的冲击，通过影视视频的学习已经成了一种共识，然而这在电视刚刚兴起的年代，是难以置信的，是不可接受的，是认为对书本学习的一种侵犯。伯茨曼着重提醒人们，需要小心视频对于人们思想的毒害，因为视频的本质属性，会让观众免于思考且轻易接受所听到、看到的事物，这对于思考力、判断力是一种损害。伯茨曼甚至说，如果人们不加以认识与控制，在这糖衣炮弹中，终将导致文化的毁灭。</p><p>影视节目、短视频等创造内容，为了使之受欢迎，总会以吸引人注意力的方式加以呈现，一个视频，首先进入人们脑中的是呈现的方式，其次是视频的内容，最后内容的准确性往往是被忽略的。短视频会给人们带来短暂的欢愉，一直刷一直快乐，在算法营造的信息茧房中，更为如此，然仔细思考所得，实际上并不什么，顶多是为在于他人茶余饭后的闲谈中增添了一点谈资。</p><p>正如文中提到，为了能够持续吸引眼球，使观众不划走到下一个视频，短视频的语言内容往往是简单的、直接的且具有吸引力的，人们不用思考就可获取内容，“复杂的东西简单描述”，然而在短视频的海洋中，有多少创作者会对自己产出的内容准确性去做判断，更多的人都是在追热点，只要是人们感兴趣的话题都是可以创作的内容，而内容是不是自己所了解的则无关紧要，因为可以抄袭或转述别人的，哪怕是随口驺的，甚至有意营造的谣言。然而，又因营造方式的简易化，人们不加以思考的接受了视频所呈现的内容，这是致命的。</p><p>短视频的兴起带给人们的另一影响还在于注意力的长时间集中困难与延时满足的废弃。三五分钟的视频，现在都可称为是长视频了，8~15秒是认为短视频最佳的时长，看完15秒的视频，就会跳到下一个，前后内容的逻辑性自然是没有的，一旦习惯在15秒内了解完毕一件事，又有多少心思去用在上下文富有逻辑的大著作上，想必是定然没有的！另外一方面，15秒的短视频观看过程中自然是放松的，欢愉的，然而系统知识的获取总是循序渐进的，在学习的前期一开始总是伴随着困惑，不提快乐，能不痛苦就算是好事了；在短视频中，人们习惯了不感兴趣就划走的当下，又有多少毅力去度过让自己不快的开始？想必是很难的。</p><p>此外，短视频的受众逐渐低龄化是不可忽视的现象。从最终的成年人，到学生，再到学龄前的孩子，都是短视频的受众。我曾经在列车上或在餐厅中见过很多家长为了不让孩子哭闹，在孩子面前防止一台手机，播放着抖音或快手。孩子确实不闹腾了，然而这种方法潜移默化的影响众多家长应该是思考不到的。上文中对于成年人的注意力影响与毅力影响对于孩子来说是更为显著的，尤其是从小就习惯了在短视频中获取快乐，习惯了在短视频中感到不开心就切换到下一个；那在之后的生活学习中，不习惯学习的课本是不是可以扔掉换另一本，不喜欢面前的老师是不是可以换换换，不喜欢眼前的生活是不是可以轻易结束开始下一段？万事开头难，对于成长在习惯了短视频中孩子来说，万事开头更是难上加难，因为开头的不顺总是要坚持度过的。</p><p>如果一直批判短视频的坏事显然是不合理的，短视频的兴起为广大劳动群众提供了一个放松的平台，一个消磨时间的平台，一个表达自我分享生活的平台，一个养家糊口的平台，甚至是一个声张正义的平台！这都是客观存在的，那究竟如何看待短视频，重点是区分群体，再理性看待。（不再展开阐述）</p><p>世界广阔，我们终会找到属于自己的生活方式，哪怕习惯深陷泥潭的人，也会有那么一天幡然醒悟，轻盈上阵，奋然前行。<br>（20240727）</p>
]]></content:encoded>
<slash:comments>2</slash:comments>
<comments>https://blog.hantaotao.top/archives/131/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>松弛因子调整相关</title>
<link>https://blog.hantaotao.top/archives/127/</link>
<guid>https://blog.hantaotao.top/archives/127/</guid>
<pubDate>Thu, 04 Jul 2024 13:48:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[松弛因子怎么来的。首先是动量方程松弛因子/[速度松弛因子]。因为求解[线性方程组](现在一般都是松弛迭代法，松弛迭代法自带一个松弛因子可以调节方程组收敛速度，用到[动量方程组]上的就是动量松弛因...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h2>松弛因子怎么来的。</h2><p>首先是动量方程松弛因子/[速度松弛因子]。因为求解[线性方程组](现在一般都是松弛迭代法，松弛迭代法自带一个松弛因子可以调节方程组收敛速度，用到[动量方程组]上的就是动量松弛因子    。相应的，湍流涡粘度模型会引入两个变量，也会有两个相应的松弛因子。</p><p>以[动量因子](为例，该因子在CFD中一般是这样存在的：<br><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113336.png" alt="Pasted image 20231010113336.png" title="Pasted image 20231010113336.png"></p><p>上面这个方程是网格   动量方程线性化以后的表达式。   表示某相邻网格，   代表线性化系数，  代表某速度，    代表网格体积，   代表除了速度项以外的所有项。这些系数实际上不是毫无关系的，在稳态情况下，运用[质量守恒方程，有C与F点的系数关系：</p><p><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113357.png" alt="Pasted image 20231010113357.png" title="Pasted image 20231010113357.png"></p><p>很特殊的是[压力松弛因子]，是SIMPLE算法才有的。[SIMPLE类算法]在求解质量-动量方程组时，是按压力/速度增量（  ′, ′ ）求解的。本来这两增量关系按上面动量方程应该是：</p><p><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113411.png" alt="Pasted image 20231010113411.png" title="Pasted image 20231010113411.png"></p><p>但这个有个问题，   ′ 和   ′ 都是求解变量，求到这一步时都不知道。Patankar的[标准SIMPLE算法]在这个地方直接舍去了   ′ 这一项。因为修正项最后都是零，取多少值只会影响收敛路径，不影响收敛结果。取消掉相邻点速度项以后，用压力增量代表速度增量，代入[质量方程]，就能求出压力增量。但是由于把速度丢了一截，会导致这么搞出来的压力修正量要比真正的大一截。Patnkar解决方法是把求出来的压力修正量乘以一个0~1之间的常数去近似真值。这也是为什么要用增量而不是速度压力本身直接求解的原因。这个常数在SIMPLE类算法里称作压力松弛因子    。</p><h2>压力松弛因子与动量松弛因子的关系。</h2><p>在SIMPLE里，引入压力松弛以后有：</p><p><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113428.png" alt="Pasted image 20231010113428.png" title="Pasted image 20231010113428.png"></p><p>得：<br><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113437.png" alt="Pasted image 20231010113437.png" title="Pasted image 20231010113437.png"></p><p>做一个假设，即某点的速度可以由其余点按动量系数加权而来：<br><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113447.png" alt="Pasted image 20231010113447.png" title="Pasted image 20231010113447.png"></p><p>结合式（2）并代入式（5），得：</p><p><img src="http://image.hantaotao.top/image/2024/松弛因子调整相关/Pastedimage20231010113457.png" alt="Pasted image 20231010113457.png" title="Pasted image 20231010113457.png"></p><h2>松弛因子的取值。</h2><p>由于这动量和压力两个松弛因子有一定关系，只要决定动量迭代的因子就行了。可是超松弛迭代因子何时取最佳值，数学上没有结论。对于CFD问题，一般压力0.2或者0.3，动量0.7或0.8都行，没什么特别的要求。相应的[湍流模型]的两方程松弛因子 ,也是取程序默认值就行了。</p><h2>结论</h2><p><strong>结论：没有规则，不用注意，用默认值。计算不收敛改模型参数或者网格绝对比你动松弛因子强。</strong>//最关键的是这个结论。</p><p>原文链接：<code>`</code><br><a href="https://blog.hantaotao.top/go/aHR0cHM6Ly93d3cuemhpaHUuY29tL3F1ZXN0aW9uLzQzNDA1MjM2NA" pjax="no" target="_blank">(39 封私信 / 85 条消息) fluent松弛因子的调节规则是什么？ - 知乎 (zhihu.com)</a></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.hantaotao.top/archives/127/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>UUV操纵性判定</title>
<link>https://blog.hantaotao.top/archives/116/</link>
<guid>https://blog.hantaotao.top/archives/116/</guid>
<pubDate>Sat, 29 Jun 2024 13:31:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[1、操纵性绪论UUV的操纵性是指借助其操作装置（推进器、舵、翼等）来改变或保持其运动速度、位置和姿态的性能，主要包括UUV稳态航行时的平衡状态，保持航行状态的性能（运动稳定性）和改变航行状态的性...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1、操纵性绪论</h1><blockquote>UUV的操纵性是指借助其操作装置（推进器、舵、翼等）来改变或保持其运动速度、位置和姿态的性能，主要包括UUV稳态航行时的<strong>平衡状态</strong>，保持航行状态的性能（<strong>运动稳定性</strong>）和改变航行状态的性能（<strong>机动性</strong>）。</blockquote><h1>2、平衡状态</h1><p>UUV为安全起见，会留有一定储备浮力，一般为排水量的2%，在水下稳态航行时为了平衡掉这部分正浮力，需要UUV有一定负的纵倾角，计算式如下：<br><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831153028.png" alt="Pasted image 20230831153028.png" title="Pasted image 20230831153028.png"></p><h1>3、运动稳定性</h1><blockquote>UUV在某一平衡运动状态下，收到外界干扰后随着时间推移，回到原来的平衡运动状态的能力。若可以回到原状态，则说明是稳定的，反之是不稳定的。从运动空间上看，可以分为<strong>垂直面运动稳定性</strong>和<strong>水平面运动稳定性</strong>，从运动学观点来看，可以分为<strong>静稳定性</strong>和<strong>动稳定性</strong>。</blockquote><h2>3.1 垂直面运动稳定性</h2><h3>3.1.1 静稳定性</h3><p><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831153917.png" alt="Pasted image 20230831153917.png" title="Pasted image 20230831153917.png"></p><h3>3.1.2 动稳定性</h3><p>参照这篇文章</p><pre><code>[什么是飞机的静稳定性和动稳定性 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/82594255)</code></pre><p>动稳定性指的运动的过程，如果是逐渐收敛的则是动稳定的，如果是稳态震荡，则是中性动稳定的，如果震荡幅度越来越大，则是动不稳定的。用PID的观点来理解，P（静稳定性）运动快慢，D（动稳定性）运动趋势，I稳态误差。<br><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831155738.png" alt="Pasted image 20230831155738.png" title="Pasted image 20230831155738.png"></p><p>此外，就文献里所说，静稳定的条件达成比动稳定性苛刻；因此，要尽可能至少达成动稳定性。</p><h2>3.2 水平面运动稳定性</h2><h3>3.2.1 静稳定性</h3><p><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831160231.png" alt="Pasted image 20230831160231.png" title="Pasted image 20230831160231.png"></p><h3>3.2.2 动稳定性</h3><p><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831160434.png" alt="Pasted image 20230831160434.png" title="Pasted image 20230831160434.png"></p><h1>4、机动性</h1><blockquote>机动性指的是改变运动状态的能力，一般分为<strong>垂直面机动性</strong>和<strong>水平面机动性</strong>。</blockquote><h2>4.1 垂直面机动性</h2><p><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831161846.png" alt="Pasted image 20230831161846.png" title="Pasted image 20230831161846.png"></p><h2>4.2 水平面机动性</h2><p><img src="https://image.hantaotao.top/image/2024/Pastedimage20230831162343.png" alt="Pasted image 20230831162343.png" title="Pasted image 20230831162343.png"></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.hantaotao.top/archives/116/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>结构密封相关</title>
<link>https://blog.hantaotao.top/archives/62/</link>
<guid>https://blog.hantaotao.top/archives/62/</guid>
<pubDate>Fri, 15 Dec 2023 18:25:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[一、O圈密封O圈密封大致可分为 轴向密封与径向密封。1.1 轴向密封定义：轴向密封是密封特征分布在沿轴方向，效果是限制流体径向运动。如下图所示，红圈是密封件，箭头表示流体运动方向。下图是类似端盖...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>一、O圈密封</h1><p>O圈密封大致可分为 <strong>轴向密封</strong>与<strong>径向密封</strong>。</p><h2>1.1 轴向密封</h2><blockquote>定义：<strong>轴向密封是密封特征分布在沿轴方向，效果是限制流体径向运动。</strong></blockquote><p>如下图所示，红圈是密封件，箭头表示流体运动方向。下图是类似端盖的密封。<br><img src="https://s11.ax1x.com/2023/12/15/pi41vkV.png" alt="pi41vkV.png" title="pi41vkV.png"></p><h2>1.2 径向密封</h2><blockquote>定义：<strong>径向密封是密封特征分布在沿径的方向的，效果是限制流体沿着轴向运动。</strong></blockquote><p>如下图所示，红圈是密封件，箭头表示流体运动方向。下图是类似对轴的密封。</p><p><img src="https://s11.ax1x.com/2023/12/15/pi41XT0.png" alt="pi41XT0.png" title="pi41XT0.png"></p><h2>1.3 材料相关</h2><p><strong>丁腈橡胶</strong>：其温度范围是-40~120℃，耐油，经常和PTEF+青铜材料搭配使用，性价比高。</p><p><strong>氟橡胶</strong>：耐温-20~250℃，耐油，耐腐蚀，一般要求高的工况是使用氟橡胶搭配PTFE碳纤维。</p><h1>二、格莱圈密封</h1><blockquote><strong>孔用旋转格莱圈由一个低摩擦的填充聚四乙烯密封环和O型圈组成，用于有旋转或摆动运动的杆、轴、旋转接头等处，属于外周密封，是一种可受两侧压力或交变压力作用的双向作用的旋转密封圈。</strong></blockquote>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.hantaotao.top/archives/62/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>转动惯量计算相关</title>
<link>https://blog.hantaotao.top/archives/56/</link>
<guid>https://blog.hantaotao.top/archives/56/</guid>
<pubDate>Fri, 15 Dec 2023 18:13:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[在Starccm+中进行物理运动相关计算时，需要输入相对于质心与指定参考系的转动惯量，记录如下：转动惯量与惯性张量惯性张量是一个二阶张量，即是一个3阶矩阵。这个惯性张量的计算矩阵可以计算空间中任...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<blockquote>在Starccm+中进行物理运动相关计算时，需要输入相对于质心与指定参考系的转动惯量，记录如下：</blockquote><h1>转动惯量与惯性张量</h1><p><strong>惯性张量</strong>是一个二阶张量，即是一个3阶矩阵。<br><img src="https://s11.ax1x.com/2023/12/15/pi418WF.png" alt="pi418WF.png" title="pi418WF.png"><br>这个惯性张量的计算矩阵可以计算空间中任意一点。其中惯性张量中矩阵对角元素即<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mrow><mi>x</mi><mi>x</mi></mrow></msub></math>、<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mrow><mi>y</mi><mi>y</mi></mrow></msub></math>、<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mrow><mi>z</mi><mi>z</mi></mrow></msub></math>就是绕着x、y和z轴的<strong>转动惯量</strong>。而<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mfenced><mrow><mi>i</mi><mo>&#x2260;</mo><mi>j</mi></mrow></mfenced></math>则称之为惯性积。</p><h1>转动惯量的计算</h1><h2>转动惯量的定义</h2><p>指的是刚体绕轴旋转时惯性的度量，用字母I或者J来表示，在经典力学里，转动惯量又称之为质量惯性矩，简称惯矩，单位是kg.m2.<br>转动惯量的描述是刚体质量对于转轴的集中度，质量越集中，转动惯量越小。</p><h2>转动惯量的计算</h2><p><img src="https://s11.ax1x.com/2023/12/15/pi41Gz4.png" alt="pi41Gz4.png" title="pi41Gz4.png"></p><p>也就是<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>I</mi><mo>=</mo><mi>m</mi><mo>&#xB7;</mo><msup><mi>r</mi><mn>2</mn></msup></math>理解上就是某质点绕着某条轴渲染而产生的转动惯量。其中转动半径 r 就是该质点到该轴的距离，从表达式上来看，根据勾股定理，可以分解成投影到另外两个面上的距离的平方和。</p><h1>惯性积的计算</h1><h2>惯性积的定义</h2><p>质量元素与至各平面的垂直距离的乘积。<br>惯性积反应了刚体的质量分布相对于坐标轴（坐标平面）的对称度，对称性越好，惯性积越趋于0.</p><h2>惯性积的计算</h2><p><img src="https://s11.ax1x.com/2023/12/15/pi413JU.png" alt="pi413JU.png" title="pi413JU.png"></p><h1>总结</h1><p>上面的文字对转动惯量与惯性积的定义、物理含义及计算方法做了说明。然后，在实际计算过程中，针对特定的物理模型，可以使用SW的统计功能，直接计算得到。</p><p>参考资料链接：</p><pre><code>[空间刚体转动惯量 - JadeCicada - 博客园 (cnblogs.com)](https://www.cnblogs.com/butterflybay/p/13245828.html)
[刚体转动的惯性张量和转动惯量的区别和联系_beidou111的博客-CSDN博客](https://blog.csdn.net/weixin_43940314/article/details/123995079)</code></pre>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.hantaotao.top/archives/56/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
<item>
<title>NACA翼型理论与生成方式</title>
<link>https://blog.hantaotao.top/archives/32/</link>
<guid>https://blog.hantaotao.top/archives/32/</guid>
<pubDate>Thu, 14 Dec 2023 17:50:00 +0800</pubDate>
<dc:creator>小韩</dc:creator>
<description><![CDATA[0- 简介NACA翼型是美国国家航空咨询委员会（NACA）开发的一系列翼型。每个翼型的代号由“NACA”这四个字母与一串数字组成，将这串数字所描述的几何参数代入特定方程中即可得到翼型的精确形状。...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>0- 简介</h1><p><strong>NACA翼型</strong>是美国国家航空咨询委员会（NACA）开发的一系列翼型。每个翼型的代号由“NACA”这四个字母与一串数字组成，将这串数字所描述的几何参数代入特定方程中即可得到翼型的精确形状。</p><p><img src="https://s11.ax1x.com/2023/12/14/pihsUWd.png" alt="pihsUWd.png" title="pihsUWd.png"><br><img src="https://s11.ax1x.com/2023/12/14/pihsJoD.png" alt="pihsJoD.png" title="pihsJoD.png"></p><h2>0.1 NACA四位翼型</h2><p>NACA XYZZ</p><p>X ——相对弯度</p><p>Y ——最大弯度位置</p><p>ZZ——相对厚度</p><p>例如：NACA 2412表示翼型的相对弯度为2%，最大弯度位置在弦长的0. 4，相对厚度为12%</p><p><strong>弦长：</strong> 从前缘到后缘的距离就是弦长。<br>相对厚度是指：最大厚度相对于弦长的比值。</p><p><strong>对称翼型：NACA 00XX</strong><br>有现成的试验数据的翼型有6%、8%、9%、10%、12%、15%、18%、21%、24%；翼型顶部较小，中部靠前端较大，相对厚度为零，中轴线无偏移，翼型结构对称，相对厚度为设定参量。</p><p>例如在进行艉舵的设计时，随着翼型相对厚度的增大升力系数逐渐减小，为获得较大的艉舵升力性能采用较小的NACA翼型，同时为减小舵面阻力，舵面底部可以采用NACA0012，上部采用NACA0010.</p><h1>1-翼型生成相关</h1><p>在航空或者水下领域，NACA翼型因具有良好的流体性能，使用较为广泛。具体到水下机器人领域，在设计天线、舵叶及桨叶时会使用到NACA翼型。<br>具体到生成方式上，我常用两种方式：</p><h2>1.1 Profile翼型生成软件</h2><p>经常和航模打交道的人应该对Profile很熟悉，在软件里面可以直接生成翼型，后面导入到三维设计软件中即可。</p><h2>1.2 Matlab程序生成</h2><p>翼型生成程序如下：</p><pre><code class="lang-matlab">% NACA four digit airfoil generation code.

% Input four digit from command line, eg. &quot;0012&quot;

clear

s=input(&#039;\nInput four digit mumber of the NACA airfoil:\n?&#039;,&#039;s&#039;);

t=str2num(s(length(s)-1))/10 + str2num(s(length(s)))/100;    % thickness

p=str2num(s(length(s)-2))/10;     % max camber position

m=str2num(s(length(s)-3))/100;    % max camber

if p==0                     % To avoid p=0

    p=0.0001;

end

x=0:0.001:1;

for i=1:length(x)

    yt(i)=(t/0.2)*(0.2969*x(i)^0.5-0.1260*x(i)-0.3516*x(i)^2 + 0.2843*x(i)^3-0.1015*x(i)^4);

        % thickness distribution

    if x(i)&lt;=p

        yc(i)=m/p^2*(2*p*x(i)-x(i)^2);  % center line (front half)

    else

        yc(i)=m/(1-p)^2*((1-2*p) + 2*p*x(i)-x(i)^2);  % center line (rear half)

    end

    if i==1

        theta=pi/2;

    else

        theta=atan((yc(i)-yc(i-1))/(x(i)-x(i-1)));

    end

    xu(i)=x(i)-yt(i)*sin(theta);        % upper surface

    yu(i)=yc(i) + yt(i)*cos(theta);

    xl(i)=x(i) + yt(i)*sin(theta);        % lower surface

    yl(i)=yc(i)-yt(i)*cos(theta);

end

% plot airfoil

 plot(xu,yu,&#039;b-&#039;,xl,yl,&#039;b-&#039;,x,yc,&#039;k-.&#039;);

 grid on;

 axis equal;

% output airfoil data

 filename=[&#039;NACA&#039;,s,&#039;.dat&#039;];

 fid=fopen(filename,&#039;w&#039;);

 fprintf(fid,&#039;   x_u      y_u      x_l      y_l\n&#039;);

 for i=1:length(x)

     fprintf(fid,&#039;%8.4f %8.4f %8.4f %8.4f\n&#039;,xu(i),yu(i),xl(i),yl(i));

 end

 fclose(fid);</code></pre><p>运行之后，在输入框中输入想要的翼型，例如：0012，结果如下，同时会在程序保存位置生成.dat文件。<br><img src="https://s11.ax1x.com/2023/12/14/pihs8eK.png" alt="pihs8eK.png" title="pihs8eK.png"></p><p>在生成的.dat文件中，是翼型曲线的坐标数据，翼型曲线是对称图形，故一个x坐标会对应两个y值，目的是讲该翼型坐标数据导入到三维建模软件中处理，这里以sw为例。</p><p>但sw不能直接导入.dat文件，可以导入.dwg文件，因而需要Auto CAD进行处理。</p><p><strong>具体步骤菜操作如下：</strong></p><ul><li>先将.dat文件导入到excel，“数据”——“自文本/文件”——切换到”显示所有文件“——选择生成的.dat文件，导入皆可<br><img src="https://s11.ax1x.com/2023/12/14/pihs1L6.png" alt="pihs1L6.png" title="pihs1L6.png"></li><li>对导入的数据进行处理，因为后面要在CAD中输入多组坐标进行绘图。对在excel中的数据，仅保留x 与 y的一组坐标，再将X列和Y列合并成”坐标值“列，在坐标第一行旁边的单元格位置中输入： =A2&","&B2，”坐标值“列中就出现一对坐标值，后面下拉生成剩下的单元格。<br><img src="https://s11.ax1x.com/2023/12/14/pihslsx.png" alt="pihslsx.png" title="pihslsx.png"></li><li>复制生成的坐标数据，在CAD中使用样条曲线曲线命令（直线或者多线段也可），选择命令后，下方的对话框中会出现提示输入坐标点命令，之后将复制的坐标数据粘贴进去，即生成翼型的一半。<br><img src="https://s11.ax1x.com/2023/12/14/pihsGdO.png" alt="pihsGdO.png" title="pihsGdO.png"></li><li>对翼型进行对称处理，并<strong>根据需要进行移动或放大</strong>，目前该翼型弦长为1，其实坐标点是0，0.<br><img src="https://s11.ax1x.com/2023/12/14/pihstFe.png" alt="pihstFe.png" title="pihstFe.png"></li><li>保存文件，打开sw，选定需要绘制翼型的平面。”插入“——”DWG文件“选择该文件即可。如果只有一个翼型可以直接拉伸，如果是多翼型，可以选择放样凸台命令生成。<br><img src="https://s11.ax1x.com/2023/12/14/pihsNJH.png" alt="pihsNJH.png" title="pihsNJH.png"></li></ul><blockquote>记录结束，很多地方不尽完善，以后有机会再完善，若有疑问可评论或邮件联系，谢谢。</blockquote>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.hantaotao.top/archives/32/#comments</comments>
<wfw:commentRss>https://blog.hantaotao.top/feed/category/study/</wfw:commentRss>
</item>
</channel>
</rss>