diff --git a/site/assets/images/social/reference/software/changelog.png b/site/assets/images/social/reference/software/changelog.png index 99f3efa..e69de29 100644 Binary files a/site/assets/images/social/reference/software/changelog.png and b/site/assets/images/social/reference/software/changelog.png differ diff --git a/site/assets/images/social/reference/software/product-specs.png b/site/assets/images/social/reference/software/product-specs.png index e69de29..38c9bc1 100644 Binary files a/site/assets/images/social/reference/software/product-specs.png and b/site/assets/images/social/reference/software/product-specs.png differ diff --git a/site/search/search_index.json b/site/search/search_index.json index a80e317..0a30bed 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"PlanktoScope Documentation","text":"

Welcome to the documentation for the PlanktoScope project! Here are some quick links to help you navigate the documentation depending on what you what you want to do:

  1. \"I want to get a PlanktoScope!\"
  2. \"I want to learn how to operate a PlanktoScope!\"
  3. \"I want to fix something which isn't working on my PlanktoScope!\"
  4. \"I want to get involved in the PlanktoScope community!\"
  5. \"I want to study the design of the PlanktoScope!\"
"},{"location":"#what-is-planktoscope","title":"What is PlanktoScope?","text":"

Plankton are living things which drift with the water currents in our world's oceans, rivers, and lakes. Lots of plankton are very small - so small that we need tools called microscopes in order for us to see them. One type of plankton is phytoplankton: plant-like plankton which take a huge amount of carbon dioxide from the air and become the food for all other life in the water - like the grasses of the sea. Because of this, plankton are very important to the health of our planet.

But there\u2019s still a lot we don\u2019t know about what\u2019s happening with groups of plankton and how they\u2019re changing: most tools would be too hard and expensive for us to use to get much detail about how every group of plankton is changing across an entire ocean. If we can make tools which give detailed information and which everyone can use - everywhere, all the time - then we can learn more about how the oceans will change because of things people and companies are doing.

The PlanktoScope is a low-cost, open-source, and portable microscope designed to take detailed photos of tiny plankton from lots of water, so that we can count the different kinds of plankton in the water.

"},{"location":"#what-is-the-planktoscope-project","title":"What is the PlanktoScope project?","text":"

The PlanktoScope project is a community project to develop the PlanktoScope as a tool and to help people use it for a variety of purposes around the world. It is part of a broader movement toward making scientific tools more accessible and affordable, while also empowering citizen scientists, educators, and researchers to study and monitor aquatic ecosystems.

"},{"location":"#who-are-planktoscopes-for","title":"Who are PlanktoScopes for?","text":"

We want the PlanktoScope to be a tool which is easy to use for anyone who's interested in the tiny things which live in our oceans, and for anyone who cares about the health of our oceans - not just scientists, but also sailors, marine farmers, makers, fishing communities, and students. However, we still need to make many improvements to the PlanktoScope in order to reach this goal. Most of the people who currently enjoy using PlanktoScopes have some experience with using microscopes, a tolerance for handling software problems, and a sense of adventure for trying out new technologies which are still in development.

We also want PlanktoScopes to be easy to use for people around the world. Currently, the PlanktoScope software's user interface and documentation are all in English; we will need software and translation help to support other languages. The PlanktoScope community mainly works in English, though we also have active community members whose primary languages are French and Japanese.

We are excited about the possibility of using PlanktoScopes for measuring things besides plankton - for example, counting and identifying microplastics, or monitoring suspended cell cultures, or even detecting parasites in certain diseases. However, we have not yet developed or assessed the PlanktoScope as a tool which people could use for these other purposes.

If you want to help to improve the PlanktoScope, to build a PlanktoScope community in a non-English language, or to explore new uses for PlanktoScopes, please get involved in our global community!

"},{"location":"faq/","title":"Frequently Asked Questions","text":"

This FAQ has been compiled to answer common questions about the PlanktoScope project and how you can get involved. We hope you find it useful and we look forward to working with you to advance our knowledge of the oceans!

"},{"location":"faq/#can-i-purchase-a-planktoscope","title":"Can I purchase a PlanktoScope?","text":"

You can purchase a PlanktoScope - either as a kit of parts to assemble yourself or as a fully preassembled device - from a small business called FairScope, which was started by the inventor of the PlanktoScope in order to make PlanktoScopes easier to obtain. For more information, please refer to our page on how to obtain a PlanktoScope.

"},{"location":"faq/#where-do-i-get-support-or-find-the-necessary-tools-to-build-planktoscope","title":"Where do I get support or find the necessary tools to build PlanktoScope?","text":"

To find the necessary tools and knowledge to produce the PlanktoScope, consider visiting a Fablab or Hackspaces in your region. These organizations often have a culture of openness and may be willing to support you with your project.

And if you have specific questions or problems, you can always report them in the Slack Channel and in the best case you will find someone there who can support you.

"},{"location":"community/","title":"The PlanktoScope Community","text":"

PlanktoScope is a completely open platform. The core of the PlanktoScope project is a basis in an evolving network of designers and users collaborating to increase the impact and availability of the tools. Building a community of users will enable PlanktoScope to grow with capabilities not yet imagined.

For around $800, and with parts freely available in most parts of the globe, any person with the desire to engage can begin building a PlanktoScope. This website contains the information needed to assemble, test, and begin collecting data on your PlanktoScope.

"},{"location":"community/#engage-on-github","title":"Engage on GitHub","text":"

Feel free to visit the GitHub and engage if you want.

GitHub is a web-based platform that is widely used in the PlanktoScope Community for version control and collaboration. It allows members to easily share, track, and manage code and other project files. The platform is built around the Git version control system, which allows multiple contributors to work on the same codebase simultaneously while keeping a record of every change made.

In the PlanktoScope Community, members can use GitHub to collaborate on the development of the Planktoscope project. They created a central repository where they can share and track the code, documentation, and other project files.

"},{"location":"community/#chat-on-slack","title":"Chat on Slack","text":"

The community is using Slack to communicate.

Slack is a communication and collaboration tool that is widely used in the PlanktoScope Community. It allows members to communicate and work together in real-time, providing a central hub for all conversations related to Planktoscope project. The platform offers features such as direct messaging, group channels, video conferencing, and file sharing, making it easy for members to stay informed and on the same page.

The PlanktoScope community has created a dedicated Slack workspace for the community members to share their findings, ask for help, and discuss project-related topics.

"},{"location":"community/#classify-on-ecotaxa","title":"Classify on EcoTaxa","text":"

To join EcoTaxa, you just need to create an account.

EcoTaxa is a web-based platform that enables researchers, educators, and citizen scientists to identify, classify and share images of microorganisms. The platform is designed to support biodiversity research and education by providing a user-friendly interface for browsing and analyzing images of microorganisms, as well as a collaborative environment for sharing images and data. EcoTaxa allows users to upload their own images, and the platform's machine learning algorithms can automatically identify and classify the organisms in the images.

The platform also offers a variety of tools for analyzing and visualizing data, including image annotation, statistical analysis, and data export. Additionally, EcoTaxa has a community feature where researchers can share their findings, and have a discussion on the data, and contribute to the knowledge base. Overall, EcoTaxa is a valuable resource for anyone interested in microorganism biodiversity research and education.

"},{"location":"community/code-of-conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"community/code-of-conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"community/code-of-conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

Examples of unacceptable behavior include:

"},{"location":"community/code-of-conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"community/code-of-conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"community/code-of-conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at < thibaut at fairscope.com > . All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"community/code-of-conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"community/code-of-conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"community/code-of-conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"community/code-of-conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"community/code-of-conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"community/code-of-conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"},{"location":"community/license/","title":"Our work is fully open source","text":"

That's the headline, yes.

"},{"location":"community/license/#hardware-files","title":"Hardware files","text":"

We released our hardware files (everything in the hardware directory) under a CERN OHL-S license.

"},{"location":"community/license/#software-source","title":"Software source","text":"

Our source code (everything in the directories flows and scripts) is released under a GPL-3.0 license.

"},{"location":"community/license/#everything-else-documentation-pictures-etc","title":"Everything else (documentation, pictures, etc...)","text":"

Everything else is released under a Creative Commons CC-BY-SA license.

"},{"location":"community/trainings/","title":"Trainings","text":"

The success of the PlanktoScope community depends on the people who generously share their knowledge and expertise about its production and use with others, helping to promote its widespread adoption and use. By actively participating in the community and sharing their insights and experiences, individuals can contribute to the growth and success of the PlanktoScope, ultimately benefiting not just the community but also the broader field of study.

"},{"location":"community/trainings/#the-train-the-trainer-program","title":"The Train the trainer program","text":"

The train the trainer program is a training program designed to equip individuals with the knowledge and skills needed to deliver training to others. The goal of a train the trainer program is to build capacity within the PlanktoScope community by volunteers to become trainers themselves.

This guide is intended to provide you with a solid foundation of knowledge and understanding about the PlanktoScope, enabling you to confidently develop and deliver your own training program for others. Whether you are an experienced user looking to share your expertise with others or a newcomer to the PlanktoScope looking to learn more about its capabilities and applications, this guide is designed to help you gain the necessary skills and knowledge to successfully teach others about this powerful tool.

"},{"location":"community/trainings/#event-types","title":"Event types","text":""},{"location":"community/trainings/#build-workshop","title":"Build workshop","text":"

Organizing a build workshop can be a challenging but rewarding experience. It requires careful planning and execution to ensure that the workshop is successful. This trainer manual is designed to guide you through the process of organizing a build workshop.

"},{"location":"community/trainings/#selecting-the-production-site","title":"Selecting the production site","text":"

Choosing the right production site for preparing and manufacturing the PlanktoScope Kits is an important step in the workshop planning process. The production site should have the necessary tools and equipment, as well as the knowledge and expertise to manufacture the PlanktoScope Kits. Here are a few things to consider when choosing a production site:

  1. Check the Manufacturing and Assembly Guides: Before choosing a production site, make sure to review the PlanktoScope Kit Manufacturing Guide and the Device Assembly Guide. These guides will provide detailed information on the necessary tools and equipment required for the production of the PlanktoScope Kits.
  2. Visit Fablab and Hackspaces: Consider visiting Fablabs or Hackspaces in your region. These organizations often have a culture of openness and may be willing to support you with your project. They may have the necessary tools and equipment to produce the PlanktoScope Kits, as well as the knowledge and expertise to guide you through the production process.
  3. Commercial Manufacturing: Look for a facility that has the capability to handle small scale production runs, a good quality control process and a logistic plan to ship the product to the final destination. Many

Tip

For the PlanktoScope case, for example, you can look for woodworking companies. They often have a CNC machine and are familiar with the process of ditigal production.

"},{"location":"community/trainings/#material-procurement","title":"Material procurement","text":"

Building a PlanktoScope requires a specific set of materials. In order to ensure that the workshop runs smoothly and that all attendees are able to successfully build their own PlanktoScope, it is important to properly plan and execute the procurement of materials. The following is a step-by-step guide on how to properly plan and execute the procurement of materials for a workshop:

  1. Prepare the order list: Use the bill of materials (BOM) as a starting point to create a comprehensive list of all materials needed for the workshop. Expand it with additional columns for suppliers, delivery dates, prices, shipping costs, and import taxes.
  2. Plan for packaging: Plan for extra packaging so you can assemble the parts as shown in the instructions. Try to minimize plastic as much as possible.
  3. Research suppliers: Research suppliers and see if there are local options, if you can consolidate orders to save costs and ensure timely delivery.
  4. Compare prices: Compare the prices of different suppliers to minimize the total cost.
  5. Plan for spare parts: Plan for spare parts in case something is broken or lost.
  6. Check your Budget: Check your budget and ensure that you have enough funds to cover the cost of all materials, shipping, and any additional expenses before placing your orders.
  7. Place orders: Once you have identified the best suppliers, place orders for all of the materials that you need. Be sure to factor in lead time when placing orders to ensure that the materials will arrive in time for the workshop.
  8. Track orders: Keep track of your orders and expected delivery dates, mark a component when it arrives. Contact suppliers if there are any delays or problems with delivery.
  9. Communicate: Communicate with participants if there are issues with timely delivery. It may make sense to postpone the workshop if there is not enough time to prepare and test everything. The participants will be grateful and will understand if it helps to ensure that everything runs smoothly.

By following this process, you can ensure that all materials are procured and organized well in advance of the workshop, to avoid any last-minute delays or complications.

Note

If you have difficulty finding the components you need, contact us and we will be happy to help you find the right alternative.

Warning

Have a backup plan and be prepared for unexpected events that may occur during the procurement process. Allow two months for delivery, as some specialty parts may travel a long way and require additional time for customs inspection.

Tip

Let us know your results, we would love to hear what solutions you found and how cost effective you were able to make the PlanktoScope.

"},{"location":"community/trainings/#prepare-the-kit","title":"Prepare the Kit","text":"

Kit preparation for the workshop is an important step in the preparation process. This ensures that participants have the materials and equipment they need to complete the workshop and build their own PlanktoScope. Here are a few things to keep in mind when preparing the kits:

  1. Review the Bill of Materials (BOM): Review the Bill of Materials (BOM) for the PlanktoScope to ensure that you have all the necessary parts and materials for the workshop. The parts list can be found in the Device Assembly Guide and lists all components and quantities needed to build a microscope.
  2. Divide the kit components according to the BOM: Once the materials have been received, divide the kit components from the orders according to the Bill of Materials (BOM) of the PlanktoScope. This will ensure that each participant receives the correct components and that there are no missing parts.
  3. Have extra components: Have extra components on hand in case of any missing or damaged parts during the workshop.
  4. Package the kits: Package the kits in a way that makes it easy for the participants to find and use the components during the workshop.
  5. Label materials: Label the packages as described in Device Assembly Guide so that they are easy to find and distribute during the workshop.
  6. Preparation of the housing parts: Prepare the housing parts by applying the surface sealant and insert the nuts to screw the housing as described in the Kit Manufacturing Guide.
  7. Cutting and soldering of electronic cables: Cut and solder the electronic cables for the PlanktoScope. This will save time during the workshop and ensure that the participants have all the necessary cables to complete the assembly.
  8. Setting up the embedded development environment: Set up the embedded development environment and flash the eeprom of the PlanktoScope hat. This will ensure that the PlanktoScope hat is ready to be used during the workshop.
  9. Download the Raspberry Pi image: Download the Raspberry Pi image and flash it to the SD card. This will ensure that the participants have a ready to use image for the PlanktoScope.
  10. Test the kits: Test the kits before the workshop to ensure that all components are working correctly and that the instructions are clear and easy to follow. This will help to ensure that the participants have a positive and productive experience during the workshop.

Tip

Identify any items that are time consuming during the workshop and not particularly important or complex to explain. These tasks can be completed in advance to save time during the workshop. This will make it easier for the participants to assemble the PlanktoScope during the workshop.

"},{"location":"community/trainings/#conducting-the-workshop","title":"Conducting the workshop","text":"

It's finally here! After all the planning, preparation, and anticipation, the build workshop is about to begin. Take a deep breath and let's go!

  1. Prepare the presentation: Prepare the presentation device and start your slides.
  2. Check-In: Once the Participants arrive, complete the check-in, share the agenda and set expectations for the workshop.
  3. Venue: Provide information about the venue, including where to find restrooms and where to buy food.
  4. Digital tools: Provide information about the digital tools that will be used during the workshop, such as the platform for collaboration, the survey tool and the chat channel, and how to access them.
  5. Data privacy: Inform about the privacy policy and the forms that need to be signed by the participants if you want to take photos.
  6. Introduction round: Begin with a round of introductions and give everyone a chance to introduce themselves, their background, and their interest in the project.
  7. Provide an overview: Provide details about the project, including the general mode of operation, the working materials such as the kit, the documentation and the git repository.
  8. Provide the Kits and Tools: Provide the Kit and Tools to each participant with a kit and the necessary tools.
  9. Follow the build instructions: Depending on the format you have chosen, start implementing by following the Kit Manufacturing guide or Device Assembly guide
  10. Follow the operation instructions: Now that you have successfully assembled the PlanktoScope, you can proceed to operation of the PlanktoScope by following the Getting started and User interface instructions.
  11. Final Test: For a final test you can use for example pure cultures or a sample taken with a Plankton net from a surrounding waters.
"},{"location":"community/trainings/#field-trip","title":"Field trip","text":"

Are you an expert in organizing field trips? Share your skills with the PlanktoScope community by documenting the process! By documenting how you organize a field trip, you can help others create successful events and bring more event options to the PlanktoScope community. Your documentation will be a valuable resource for anyone looking to plan a field trip, and it will also help to grow and strengthen the PlanktoScope community. Don't miss this opportunity to contribute to the community, start documenting your process today!

"},{"location":"community/trainings/#hackathon","title":"Hackathon","text":"

Are you a master at organizing Hackathons? Share your knowledge with the PlanktoScope community by documenting the process! By documenting how you organize a Hackathon, you can help others create successful events and bring more event options to the PlanktoScope community. Your documentation will be a valuable resource for anyone looking to host a Hackathon, and it will also help to grow and strengthen the PlanktoScope community. Don't miss this opportunity to contribute to the community, start documenting your process today!

"},{"location":"community/trainings/#general-planning-methods","title":"General planning methods","text":"

Organizing a workshop can be a challenging but rewarding experience. It requires careful planning and execution to ensure that the workshop is successful. This trainer module is designed to guide you through the process of organizing any type of event.

By following the guidelines, you will be able to plan a workshop that is engaging, productive, and successful. It will also help you to create a sense of community among participants and will help them continue their learning after the workshop.

"},{"location":"community/trainings/#building-a-team","title":"Building a team","text":"

Every project needs a team to support it. The team should be composed of individuals with a diverse set of skills and experiences to ensure all aspects of the workshop are effectively covered.

  1. Identify the roles and responsibilities: Determine the key areas that need to be covered during the workshop and assign specific roles to team members. For example, one team member may be responsible for organizing logistics, while another may be responsible for creating the agenda.
  2. Assemble the team: Once the roles and responsibilities have been identified, begin assembling the team. Consider individuals with relevant skills and experiences, as well as those who have a passion for the topic of the workshop. It is also important to have a mix of team members from different departments or backgrounds to bring a variety of perspectives to the planning process.
  3. Communicate effectively: Establish clear lines of communication within the team to ensure that everyone is on the same page. This can be done through regular meetings, email, or a team collaboration platform.
  4. Encourage participation: Encourage team members to actively participate in the planning process by sharing their ideas and feedback. This will help to ensure that everyone feels invested in the success of the workshop.
  5. Appoint a leader: Appoint a leader for the team who will be responsible for coordinating the planning process and ensuring that the team stays on track. The leader should be someone who is organized, a good communicator, and able to delegate tasks effectively.
"},{"location":"community/trainings/#communication-channels","title":"Communication channels","text":"

Choosing the right communication channels is an important step in the planning process for a workshop, as it is crucial not only for the organizing team but also for the participants during and after the workshop. The right communication channels can help to build a fluent community, improve collaboration and keep everyone informed and on the same page.

  1. Choose the right channels: Once the needs have been identified, choose the communication channels that will best serve those needs. Email, chat, and video conferencing are all popular options. If the group is small, a group chat or email chain may be sufficient. If the group is larger or more dispersed, a video conferencing platform may be more appropriate.
  2. Make sure they are accessible: Ensure that the communication channels you choose are accessible to all participants. This may include providing training or support for those who are less familiar with the tools you are using.
  3. Communicate expectations: Clearly communicate the expectations for using the communication channels to the participants. This includes guidelines for how often and when to check the channels, as well as how to respond to messages.
  4. Continuity: Make sure that you have continuity in the communication channels after the workshop. This will help to build a fluent community and to keep the participants connected and engaged. Use the same channels to share updates and resources, or to organize follow-up events or activities.

Note

Email is a reliable and widely-used communication channel that can be used for sending out workshop updates, sending materials, and answering questions. It is also a good option for sending out reminders and follow-up information after the workshop.

Note

Chat networks, such as Matrix, are a great option for secure, real-time and decentralized communication during the workshop. They allow participants to ask questions, share resources and collaborate on projects in real-time. They can also be used for group discussions and as a platform for sharing feedback. Additionally, chat platforms can be used as a platform for post-workshop communication and to build a fluent community.

Tip

If you need assistance with creating a Chat for your workshop, please let us know. We can easily set up new subchannels within our PlanktoScope Slack channel to support communication and collaboration during your workshop. This will also help facilitate the exchange of information within the community.

"},{"location":"community/trainings/#selecting-digital-tools","title":"Selecting digital tools","text":"

The right tools can help to facilitate communication, collaboration, and organization, making the workshop experience more productive and enjoyable for everyone.

  1. Use web-based tools: Whenever possible, use web-based tools that can be accessed from any device with an internet connection. This will make it easier for participants to access and use the tools, regardless of their location or device.
  2. Use collaborative note-taking tools: You might use web-based tools like HedgeDoc that allow participants to collaboratively collect notes during the workshop. This can help to ensure that everyone has access to the same information, and can help to make the workshop experience more productive and enjoyable for everyone.
  3. Use survey tools: You might use survey tools like LimeSurvey to gather information about the participants' needs and expectations for the workshop. This can help to ensure that the workshop is relevant, valuable, and effective for them.
  4. Use ticketing tools: You might use tools like Pretix to manage ticketing for the workshop. This can help to simplify the registration process, and can also provide valuable information about the attendees.
"},{"location":"community/trainings/#find-your-audience","title":"Find your audience","text":"

If you already have an audience for your workshop, that's fantastic. But it's also a good idea to let others know about your plans and potentially expand your audience. Contact nongovernmental organizations, universities, and research institutions in your area to see if they would be interested in participating in or even helping to organize the workshop.

Tip

One way to get in touch with others who are interested in PlanktoScope is to join our Slack Channel. We can support you by sharing contacts of individuals and organizations who have expressed an interest in PlanktoScope.

"},{"location":"community/trainings/#determining-the-need","title":"Determining the need","text":"

Understanding the needs of the participants will help to ensure that the workshop is relevant, valuable, and effective for them. Here are a few things to consider when determining the needs of the participants:

  1. Surveys and questionnaires: Use surveys and questionnaires to gather information about the participants' needs and expectations for the workshop. This can include their level of experience and knowledge, their specific interests and goals, and any challenges or concerns they may have.
  2. Pre-workshop consultation: Schedule pre-workshop consultations with the participants to discuss their needs and expectations in more detail. This can help to identify any specific areas of interest or concern, and can also provide an opportunity to address any questions or concerns the participants may have.
  3. Audience analysis: Analyze the characteristics of the audience, such as their profession, level of education and experience, and any other relevant details. This will give you a better idea of the type of content that will be most relevant and useful for the participants.
  4. Feedback: Ask for feedback from participants after the workshop and take it into account when planning future workshops. This feedback can be used to improve the overall experience and to tailor the workshop to better meet the needs of the participants.
"},{"location":"community/trainings/#defining-the-goals","title":"Defining the goals","text":"

Defining the goals of a workshop is an essential step in the planning process. The goals will serve as the foundation for the workshop, guiding the content and activities that are included.

  1. Number of participants: The workshop should be designed for a specific number of participants. Depending on the available resources, the number of participants can range from small groups of 4-8 people to larger groups of 8-12 people.
  2. Number of microscopes: The goal of the workshop is to build a specific number of PlanktoScope Microscopes. It is important to have the necessary materials and tools for each participant to build their own microscope.
  3. Content: The workshop will include both theoretical and practical content. The theoretical content will cover the principles of open-source hardware and software and the specific design of the PlanktoScope Microscope. The practical content will focus on the assembly and usage of the microscope, including hands-on experience with soldering and other techniques.

Tip

Depending on the time, resources, and audience, it is important to carefully decide what activities and tasks should be done during the workshop and what should be prepared upfront. This will ensure that the workshop runs smoothly and efficiently, and that the participants are able to fully engage and participate in the activities. Additionally, by carefully planning and preparing upfront, you can minimize the chances of overwhelming attendees with problems or difficulties that may arise during the workshop.

"},{"location":"community/trainings/#financial-planning","title":"Financial planning","text":"

The cost of materials, equipment, and other expenses can add up quickly, so it is important to have a plan in place to secure funding. Here are a few things to consider when planning the finances for your workshop:

  1. Decide on the cost of the kits: One of the first things to consider is whether you want to offer the kits for sale to the participants or if you want them to purchase the kits themselves. If you choose to offer the kits for sale, you will need to factor in the cost of materials and other expenses, such as shipping and handling. If you choose to have the participants purchase the kits themselves, you will need to provide them with information on where to purchase the kits and the estimated cost.
  2. Check for funding opportunities: There may be organizations or foundations that would be willing to support your workshop financially. It's a good idea to research potential sources of funding such as grants, sponsorships, and crowdfunding campaigns. Additionally, look for local or regional organizations that are working in the same field as your workshop, they might be interested in supporting your initiative.
  3. Reach out to potential sponsors: Once you have identified potential sources of funding, reach out to them to inquire about their funding opportunities. Be prepared to provide them with information about the workshop, including the goals, objectives, and expected outcomes. Be sure to include information about the open-source nature of the project, as this may make it more attractive to organizations with an interest in open-source technology.
  4. Look for cost-saving options: In addition to securing funding, there are also ways to save money on expenses. Consider renting equipment or space rather than purchasing it. Reach out to local universities or community organizations to see if they have equipment or space that you can use for the workshop at a reduced cost or for free.

Tip

If you are organizing the workshop as an individual, consider running the project through a non-profit organization to facilitate the collection of donations. This will also help to ensure transparency and accountability for the funding received. Alternatively, you can choose a commercially active organization that can provide proper accounting and financial management for the workshop participants. This will provide a clear financial record and can help to ensure that the workshop is run in a professional and organized manner.

"},{"location":"community/trainings/#creating-a-timetable","title":"Creating a timetable","text":"

Creating a schedule for a workshop is an important step in the planning process. A well-organized schedule will help to ensure that the workshop runs smoothly and that all the important topics are covered. Here are a few things to consider when creating a schedule for your workshop:

  1. Plan for more than just a day: A workshop may take more than one day to complete, so be sure to plan accordingly. Consider the amount of time required to cover all the topics, and allocate enough time for each one.
  2. Assign an expected duration to each item on the schedule: Assign an expected duration to each item on the schedule so that participants know how much time they should expect to spend on each topic. This will also help you to ensure that you have allocated enough time for each topic.
  3. Allocate time for breaks and activities: Make sure to allocate time for breaks, meals and other activities such as group discussions, teamwork, or hands-on activities. This will help to keep the participants engaged and energized throughout the workshop.
  4. Plan for contingencies: Include some flexibility in the schedule to allow for unexpected events or delays. This will help to ensure that the workshop stays on track even if things don't go exactly as planned.
"},{"location":"community/trainings/#venue-selection","title":"Venue selection","text":"

The location should be convenient and accessible for the participants, and should be equipped with the necessary resources to make the workshop a success. Here are a few things to consider when choosing a workshop location for a workshop on building an open-source PlanktoScope microscope:

  1. Reach out to Universities, research institutions, Fablabs, Hackspaces or non-profit organizations: Reach out to organizations that might have an interest in the PlanktoScope, and a community that might support you with free access to their location.
  2. Check the equipment: Make sure the location is equipped with the necessary resources such as a whiteboard, projector/TV, and other equipment that may be required for the workshop.
  3. Check the accessibility: Check the accessibility of the location with the public transport system and parking availability.
  4. Check for food provision: Consider if there is a possibility to go shopping or how to provide food for the course participants during the workshop.
  5. Check the environment: Consider the environment of the location, make sure it is comfortable, has enough space and is well-ventilated for the workshop.
"},{"location":"community/trainings/#announcing-the-event","title":"Announcing the event","text":"

When announcing the event, it is important to include the following information:

  1. Date: Provide a specific date, start and end time for the workshop, and ensure there is enough lead time for preparation, including ordering or manufacturing materials and coordinating with suppliers. Allow ample time between announcing the workshop and the actual event.
  2. Goal: Clearly communicate the specific goal of the workshop, such as to build a fully functional planktoscope and learn how to use it.
  3. What attendees will learn in the workshop: Clearly outline the specific skills or knowledge that will be covered in the workshop, such as how to assemble the kit, soldering the through-hole components of the controller, and working with the software.
  4. Instructor's background: Provide some notes about the instructor's qualifications or experience that make them well-suited to lead the workshop, such as experience working with planktoscope.
  5. Target audience: Clearly indicate the target group of the workshop, such as researchers, engineers or designers.
  6. Previous knowledge: Specify any previous knowledge required for the workshop, such as soldering skills or experience working with open-source hardware and software.
  7. Implementation method: Describe the form of the workshop, such as a step-by-step guide.
  8. Documentation: Consider sharing the documentation beforehand, so they can familiarize themselves with the process.
  9. Cost: Clearly communicate the cost of the workshop.
  10. Schedule: Provide a clear and detailed schedule of the workshop, including the duration of the workshop, for example, one day of building and one day of using the plankoscope.
  11. Location: Provide the location of the workshop, including information on how to get there with public transportation or Arrival by car and parking. Also, provide a link to a map service
  12. Registration: Details of the registration process, including information on where to obtain a ticket and any deadlines for registration.
  13. Contact details: Additionally, it may be helpful to include contact information for any questions.
  14. Images: Include some visually appealing images, such as from a previous workshop or field trip, to show what attendees can expect from the event. This can additionally be a great way to build anticipation and excitement, thus motivating more people to attend the workshop.
  15. Media: Post your offer on a website or social media platform that is relevant to the workshop topic and your target audience. This way you can increase visibility and reach a wider audience, which increases the chances of getting more attendees.

Tip

If you already have a group of interested people, send a link to the announcement via email or chat and invite them personally.

"},{"location":"community/trainings/#preparing-a-presentation","title":"Preparing a presentation","text":"

Preparing a presentation for a build workshop is an important step in the preparation process. It helps to ensure that the participants have the information they need to complete the workshop and understand the concepts behind building the Planktoscope.

  1. Gather resources: Gather resources such as images, videos, and diagrams that can be used to support the presentation. These resources can be found on the Planktoscope website or other sources.
  2. Outline the main topics: Outline the main topics that will be covered during the workshop, such as the components of the microscope, the assembly process, and the use of the microscope.
  3. Prepare a handout: Prepare a handout or a guide that the participants can use during the workshop to follow the steps, and have it ready to be printed or shared digitally
  4. Practice the presentation: Practice the presentation several times before the workshop to ensure that it runs smoothly and that you are comfortable with the material.
  5. Be ready to adapt: Be ready to adapt the presentation during the workshop to fit the needs of the participants.

Here are some topics that should be covered in a presentation:

  1. Event: Provide an overview of the event, including the goal of the workshop.
  2. Schedule: Provide an timetable for the event, including breaks, start and end times, and any planned activities for the next day.
  3. Venue: Provide information about the venue, including where to find restrooms and where to buy food.
  4. Instructor: Provide information about the instructor, including his or her background, and how to get in touch with him or her
  5. Digital tools: Provide information about the digital tools that will be used during the workshop, such as the platform for collaboration, the survey tool and the chat channel, and how to access them
  6. Data privacy: Provide information about the data privacy policy and the forms that need to be signed by the participants.
  7. Follow-ups: Point out follow-up actions such as the survey and that participation can be very helpful in improving the offer.
  8. Communication: Inform about the communication channels that will be used during the workshop and complete the onboarding.
  9. Introduction round: A round of introductions at the beginning of a workshop helps to create a sense of community and connection among the participants, allows the instructor to tailor the workshop to the group's needs, addresses potential language barriers, creates a sense of accountability, and helps participants to be more focused and relaxed.
  10. About the project: Provide details about the project, including the working materials such as the kit, the documentation, and the git repository.
"},{"location":"community/trainings/#send-an-final-reminder","title":"Send an final Reminder","text":"

Make sure participants are well informed and can find their way to you by sending a final reminder before the start so everything is well prepared.

  1. Schedule for the event: Include a detailed schedule for the event, including breaks, start and end times, and any planned activities for the next day. This will help participants to plan their time and make the most of the workshop.
  2. About the venue: Provide detailed information about the venue, including the address, public transportation options, and parking situation. Make sure to include any specific instructions or requirements for accessing the venue.
  3. About the documentation: Provide a link to the documentation, such as the assembly and manufacturing guide, that the participants can familiarize themselves with before the workshop. This will help them to be better prepared and make the most of the workshop.
  4. Cancellation policy: Remind the participants that now is the last opportunity to cancel their registration. This will allow other individuals on the waiting list to attend the workshop.
  5. Final Instructions: Provide any final instructions or important information that the participants should be aware of before the workshop.
"},{"location":"community/trainings/#documenting-the-event","title":"Documenting the event","text":"

Documenting a PlanktoScope workshop through photography is essential for several reasons. Photos can be used to showcase the workshop activities and the learning process of the participants. This can be useful for sharing information about the workshop with others, and for promoting future workshops.

  1. Equipment: Make sure you have the necessary equipment to document the event, including a camera (DSLR or mirrorless camera), lenses, memory cards, and batteries.
  2. Backup: Always make sure to have a backup plan for your equipment and photos, such as bringing extra memory cards and batteries.
  3. Lighting: Take into account the lighting conditions and make sure to have the right settings for your camera to capture the best possible images.
  4. Planning: Plan out the photos you want to take, taking into account the theme, location and schedule of the event.
  5. Composition: Pay attention to the composition of your photos and make sure to use techniques such as the rule of thirds and leading lines to create visually appealing images.
  6. Capturing candid moments: In addition to capturing posed shots, make sure to capture candid moments that capture the atmosphere and emotions of the event.
  7. Post-processing: Once the event is over, review and edit your photos to make them look their best.
  8. Data Privacy and Opt-Out: Pay attention to the privacy policy and get participants' consent before taking photos of them. Offer an opt-out option for participants who do not want to have photos taken. Clearly communicate what the photos will be used for and by whom, for example, to enhance this documentation.
  9. License: If your participants have agreed to share and use the photos, choose an appropriate license under which to license the photos. We recommend the Creative Commons license. For more information, see the project's license terms page.
  10. Sharing on Social Media: Share the photos on social media platforms to create a visual memory of the event and increase the visibility of the event.

By preparing and taking care of these things, you can ensure that you are able to document the event effectively and create a visual record of the event that can be shared and enjoyed for years to come.

"},{"location":"community/trainings/#follow-up","title":"Follow-up","text":"

Follow-up activities are an essential part of the workshop planning process. They help to ensure that the workshop's objectives are met and that the participants leave the workshop with a sense of accomplishment. Here are a few things to consider when planning follow-up activities after an event like a workshop:

  1. Follow-up with participants: Send out a survey or contact participants individually to gather feedback on their experience during the workshop. This feedback can be used to improve future workshops and address any issues that may have arisen.
  2. Share resources and information: Share any relevant resources such as presentations, handouts, or any other materials that will help the participants continue their learning after the workshop.
  3. Build a community: Encourage participants to connect and share their experiences with each other. This can be done through online forums, social media groups, or other platforms. Building a community of enthusiasts and collaborators will help to ensure that the workshop's goals and objectives are met and that the participants leave the workshop with a sense of accomplishment.
  4. Continual learning: Provide additional training opportunities or resources for participants to continue their learning after the workshop. This could be through follow-up workshops, webinars, or online tutorials.
  5. Track progress: Keep track of the progress of the participants, check if they are applying what they learned during the workshop and give feedback to help them improve.
"},{"location":"community/trainings/#improve-this-training-program","title":"Improve this training program","text":"

As with any training program, there is always room for improvement. To ensure that this program continues to meet the needs of its attendees, it is important to actively seek feedback and make changes as necessary.

Here are a few ways to improve this training program:

  1. Gather feedback: Regularly gather feedback from attendees, instructors and other stakeholders to understand how the program is being received and identify areas for improvement.
  2. Review and revise content: Review the content of the program and make changes as necessary to ensure that it is up-to-date, accurate, and relevant to the attendees.
  3. Continuously update the material: Continuously update the material, adding new information and best practices as it becomes available.
  4. Use different learning methods: Use different learning methods to accommodate different learning styles, such as hands-on activities, group discussions, and online resources.
  5. Encourage participation: Encourage participation and collaboration among attendees, creating an interactive and dynamic learning experience.
  6. Use modern technologies: Use modern technologies to enhance the learning experience, such as virtual reality, gamification, and AI-based learning.
  7. Assess the impact: Assess the impact of the program on the attendees and make changes as necessary to ensure that the program is achieving its intended goals.

For more information on how to contribute to this document and improve this training program, please see the contribute section on Writing Documentation.

"},{"location":"community/contribute/documentation/","title":"Writing Documentation","text":"

The source files are in the main github repository, in the docs folder.

They are simple Markdown files, that you can edit in any text editor of your choice.

The local development and test is made using mkdocs. This allows you to test your documentation changes for styling issues and see what it will look like once rendered.

hatch run docs:serve\n

After installing mkdocs, you can use mkdocs serve in the main folder of this repository to start the development server.

If you want to include pictures and diagrams in the documentation, please set the pictures in a dedicated folder to the name of the page you are creating (for example, if your page is named expert_setup.md, please put all the related pictures in the docs/expert_setup/ folder). Each picture should be named with a simple yet descriptive name, using jpg or png format if possible. Try to limit the size of the file by limiting the resolution to what is necessary for the picture to be clear on screen.

Contributions should be made by creating pull requests on Github directly.

"},{"location":"community/contribute/documentation/#extensions-available","title":"Extensions available","text":"

In addition to the common markdown syntax, several extensions are activated. If you want more information on any of them, please follow the linked guides.

"},{"location":"community/contribute/github/","title":"Contributing","text":"

First of all, thank you for contributing to the PlanktoScope! The goal of this document is to provide everything you need to know in order to contribute to PlanktoScope.

There are several ways to join the development effort, share your progress with your build or just ask for help.

We are using slack as a communication platform between interested parties. You can request to join by filling this form.

This repository is also a good way to get involved. Please fill in an issue if you witnessed a bug in the software or hardware. If you are able, you can also join the development effort. Look through the issues opened and choose one that piques your interest. Let us know you want to work on it in the comments, we may even be able to guide your beginnings around the code.

"},{"location":"community/contribute/github/#assumptions","title":"Assumptions","text":"
  1. You're familiar with git and the Merge Request(PR) workflow.
  2. **You've read the PlanktoScope documentation.
  3. You know about the PlanktoScope community on Slack. Please use this for help.
"},{"location":"community/contribute/github/#how-to-contribute","title":"How to Contribute","text":"
  1. Make sure that the contribution you want to make is explained or detailed in a GitHub issue! Find an existing issue or open a new one.
  2. Once done, fork the PlanktoScope repository in your Github account. Ask a mastertainer if you want your issue to be checked before making a PR.
  3. Create a new Git branch.
  4. Review the Development Workflow section that describes the steps to mastertain the repository.
  5. Make the changes on your branch.
  6. Submit the branch as a PR pointing to the master branch of the master fabcity-os-core-chart repository. A mastertainer should comment and/or review your Pull Request within a few days. Although depending on the circumstances, it may take longer. We do not enforce a naming convention for the PRs, but please use something descriptive of your changes, having in mind that the title of your PR will be automatically added to the next release changelog.
"},{"location":"community/contribute/github/#git-guidelines","title":"Git Guidelines","text":""},{"location":"community/contribute/github/#git-branches","title":"Git Branches","text":"

All changes must be made in a branch and submitted as PR. We do not enforce any branch naming style, but please use something descriptive of your changes.

"},{"location":"community/contribute/github/#git-commits","title":"Git Commits","text":"

As minimal requirements, your commit message should:

We don't follow any other convention, but if you want to use one, we recommend this one.

"},{"location":"community/contribute/github/#pull-requests","title":"Pull Requests","text":"

Some notes on PRs:

"},{"location":"community/contribute/github/#release-process-for-internal-team-only","title":"Release Process (for internal team only)","text":"

PlanktoScope tools follow the Semantic Versioning Convention.

"},{"location":"community/contribute/github/#automation-to-rebase-and-merge-the-prs","title":"Automation to Rebase and Merge the PRs","text":"

This project integrates a bot that helps us manage pull requests merging. Read more about this.

"},{"location":"community/contribute/github/#how-to-publish-the-release","title":"How to Publish the Release","text":"

\u26a0\ufe0f Before doing anything, make sure you got through the guide about Releasing an Integration.

\u26a0\ufe0f Every PR that is merged to master introducing changes to the PlanktoScope needs to modify the file ``, by increasing the version of the chart accordingly.

Every PR that is merged to master triggers the automated release process, as specified at ``. A GitHub Action will be triggered and publish a new release on the GitHub repository releases. This will enable users to start using the new version of the chart immediately after publishing.

Thank you again for reading this through, we can not wait to begin to work with you if you made your way through this contributing guide \u2764\ufe0f

"},{"location":"community/contribute/hardware/","title":"Hardware Development","text":""},{"location":"community/contribute/hardware/#planktoscope-case","title":"PlanktoScope Case","text":"

As a hardware engineer working on the PlanktoScope Case, you will be using Autodesk Fusion 360 for the development of the case design. Fusion 360 is a comprehensive computer-aided design (CAD) software that allows you to create and analyze complex 3D models, perform simulations and stress tests, and collaborate with team members in real-time.

To get started with the project, you will need to install a development environment on your computer. Here are the steps to follow:

By following these steps, you will be able to successfully install a development environment and participate in the PlanktoScope Case using Autodesk Fusion 360.

"},{"location":"community/contribute/hardware/#planktoscope-hat","title":"PlanktoScope Hat","text":"

As a hardware engineer working on the PlanktoScope Hat, you will be using Autodesk Eagle to design and develop the electronic components of the hat. Autodesk Eagle is a powerful and widely used software platform for designing and laying out printed circuit boards (PCBs).

To participate in the project, you will need to install a development environment on your computer that includes Autodesk Eagle and any other necessary tools and libraries. Here are the steps you can follow to set up your development environment:

By following these steps, you can set up a development environment that allows you to contribute to the PlanktoScope Hat using Autodesk Eagle.

"},{"location":"community/contribute/software/","title":"How to help development for the PlanktoScope code","text":"

We are using the Github Flow approach for our development efforts.

If you want to join us, have a look at the currently opened issues and pick one where you feel like you can have an impact. Let us know you want to work it in the comments and get started.

For working on Node-Red, we recommend to install it directly on your development machine to allow for faster cycles of testing (and ease of use). But feel free to setup a Pi Zero as a portable and compact development environment! (One of us is using one configured as usb gadget to do so!)

"},{"location":"community/contribute/software/#node-red","title":"Node-Red","text":"

Node-Red is our main process. We use the flow to manage our user interface through a dashboard instance.

As a software engineer, you may need to set up a Node-RED development environment on a Debian operating system. Node-RED is an open-source programming tool for wiring together hardware devices, APIs, and online services in new and interesting ways. It provides a visual, drag-and-drop interface for building applications, and can be used to develop a wide range of IoT, automation, and data processing projects.

To set up a Node-RED development environment on a Debian operating system, you will need to follow these steps:

  1. Install Node.js: Node-RED requires Node.js to be installed on your system. You can install Node.js using the package manager by running the following command: sudo apt-get install nodejs
  2. Install npm (Node Package Manager): npm is a package manager for Node.js that is used to install and manage Node-RED and its dependencies. You can install npm by running the following command: sudo apt-get install npm
  3. Install Node-RED: Once Node.js and npm are installed, you can install Node-RED by running the following command: sudo npm install -g --unsafe-perm node-red
  4. Start the Node-RED server: You can start the Node-RED server by running the following command: node-red
  5. Access the Node-RED editor: You can access the Node-RED editor by opening a web browser and going to the URL http://localhost:1880.

By following these steps, you will be able to set up a Node-RED development environment on your Debian operating system and start building applications with the visual, drag-and-drop interface.

"},{"location":"community/contribute/software/#python","title":"Python","text":"

The python code is separated in four main processes, each with a specific set of responsibilities:

Those processes all communicates together using MQTT and json messages. Each message is adressed to one topic. The high level topic controls which process receives the message. The details of each topic is at the end of this commit message. You can learn more about the MQTT Messages here.

The code is architectured around 6 modules and about 10 classes. I encourage you to have a look at the files, they're pretty straightforward to understand.

"},{"location":"operation/","title":"Operation","text":"

This page provides basic instructions for operating your PlanktoScope.

"},{"location":"operation/#connect-directly-to-your-planktoscope","title":"Connect directly to your PlanktoScope","text":"

In order to operate your PlanktoScope, you will need to connect to your PlanktoScope from a separate device (a computer, tablet, or phone) with a web browser. If this is your first time setting up or connecting to your PlanktoScope, you will need to set up a direct network connection between your computer and your PlanktoScope.

"},{"location":"operation/#connect-with-an-ethernet-cable","title":"Connect with an Ethernet cable","text":"

You can connect your computer to the PlanktoScope by plugging an Ethernet cable between your computer and your PlanktoScope's Raspberry Pi.

"},{"location":"operation/#connect-with-the-planktoscopes-isolated-wi-fi-network","title":"Connect with the PlanktoScope's isolated Wi-Fi network","text":"

Unless you have already configured your PlanktoScope to connect to an existing Wi-Fi network, your PlanktoScope will create its own isolated Wi-Fi network (like a Wi-Fi hotspot, but without internet access). The Wi-Fi network created by your PlanktoScope should appear on your computer's list of available Wi-Fi networks a few minutes after you turn on power to your PlanktoScope.

As you can see, the name of your PlanktoScope's Wi-Fi network will be of the format pkscope-{random word}-{random word}-{random number}. This name corresponds exactly to the serial number of the Raspberry Pi computer in your PlanktoScope, so it is a unique Wi-Fi network name; and the unique name of your machine has format {random-word}-{random-word}-{random number}, which is just the name of the Wi-Fi network but without the pkscope- prefix (e.g. chain-list-27764). You should connect to the Wi-Fi network specific to your PlanktoScope.

Unless you have changed the password of your PlanktoScope's Wi-Fi network, the password should be copepode.

"},{"location":"operation/#access-your-planktoscopes-software","title":"Access your PlanktoScope's software","text":"

Once you connect your computer to your PlanktoScope, you will need to access your PlanktoScope's software from a web browser on your computer. You should try opening the following URLs in your web browser (try opening them in the following order, and just use the first one which works):

Tip

If you know the machine name of your PlanktoScope (which has format {random-word}-{random-word}-{random number}, e.g. chain-list-27764, you can also try the following URLs after replacing {machine-name} with the actual machine name of your PlanktoScope:

http://pkscope-{machine-name}.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)

http://{machine-name}.pkscope\u00a0(this should work unless your web browser is configured to use a Private DNS provider)

You will need to use a URL with your PlanktoScope's machine name if your computer has network connections to multiple PlanktoScopes, e.g. via multiple Ethernet cables. In such a situation, using http://home.pkscope or http://pkscope.local may cause you to access the software for a different PlanktoScope connected to your computer than the one you had intended to access.

Warning

You may encounter older documents which ask you to connect to http://planktoscope.local:1880/ui, which is the URL to use for software version 2.3 and even older versions. That link does not work on software versions newer than v2.3; instead, you should use the links listed above.

One of the above URLs should work, and your web browser should show a landing page with a list of links:

You should click on the \"Node-RED dashboard\" link; this will open a new tab with the primary interface for operating your PlanktoScope. Once you have opened the Node-RED dashboard, you should proceed to our User interface guide to understand how to use it.

"},{"location":"operation/#how-to-image-plankton","title":"How to image plankton","text":"

Before doing an acquisition, you will need to collect targets. There are several ways to do this, and you probably already have a source nearby (in a culture if you are working in a lab).

However, if you have access to a body of water (even a tiny lake or river is enough), you can build yourself a plankton net to collect a sample. Once the sample is collected, either pump it with a syringe that you connect to the machine, or dip one of the silicone tube inside the sample tube you have.

You can then do an acquisition run. This is the best way to learn about the machine and this process!

Warning

After doing an acquisition, the machine should be cleaned, especially in the fluidic part. One good way to do this is to first flush the machine with clear water (distilled if possible). You can then push through a 5-10% bleach solution, or some alcohol.

If needed you can also clean the outside of the objective lens with a soft cloth. You can do the same on the flow cell if there are traces of finger on it too.

For quantitative imaging of water samples, refer to the following protocols published by members of the PlanktoScope community:

"},{"location":"operation/clone-sd/","title":"Clone your SD card","text":"

If you want to create an SD card image from your PlanktoScope to use on other PlanktoScopes, you can follow the following steps.

"},{"location":"operation/clone-sd/#prepare-the-sd-card-for-cloning","title":"Prepare the SD card for cloning","text":"

Depending on whether you want to make an SD card image to reuse across multiple machines or whether you only want to make an exact backup of your SD card image, you will need to perform different steps to prepare your SD card for cloning.

"},{"location":"operation/clone-sd/#clone-your-sd-card","title":"Clone your SD card","text":""},{"location":"operation/clone-sd/#prepare-for-cloning-to-reuse-in-other-machines","title":"Prepare for cloning to reuse in other machines","text":"

Normally, your SD card contains some information (a machine-specific ID, system secrets, and SSH secrets) which should never be replicated across multiple PlanktoScopes, and some information (apt package cache) which you would probably consider a waste of space which unnecessarily increases the size of the SD card image you want to make. We provide a preparation script at /usr/libexec/prepare-custom-image to remove this information; it also allows an SD card image created from your SD card to automatically resize itself to match the size of any SD card it's flashed to in the future. After you make any changes you want to make on your PlanktoScope for your SD card image, you should run the preparation script on the PlanktoScope with the command:

sudo /usr/libexec/prepare-custom-image\n

Once this script finishes running, it will shut down your PlanktoScope's Raspberry Pi.

Next, you should remove the SD card from your PlanktoScope and plug it into another computer, so that you can clone the SD card into an SD card image; this guide assumes that your other computer runs Linux. With your SD card plugged into your other computer, you can mount the SD card's rootfs partition to delete any other sensitive files which were not removed by the /usr/libexec/prepare-custom-image script. For example, you may also want to delete or edit some or all of the following files from the rootfs partition in order to remove any sensitive or machine-specific information:

Info

You can also delete the files listed above before running the /usr/libexec/prepare-custom-image script; the effect is the same. Either way, those files will be permanently deleted on your SD card. However, if you want to keep those files on your SD card, you should make backup copies of those files, and then you can copy those files back onto your SD card after you finish cloning the SD card to an image.

Next, proceed to the Make an SD card image section of this guide.

"},{"location":"operation/clone-sd/#prepare-an-exact-backup","title":"Prepare an exact backup","text":"

If you want to make an exact backup of your SD card and you don't want to reuse your SD card image across multiple PlanktoScopes, then you shouldn't run the /usr/libexec/prepare-custom-image script: that script will delete some files which you probably want to keep. Instead, you should edit the /boot/cmdline.txt file to add the string init=/usr/lib/raspberrypi-sys-mods/firstboot to the end of the file, for example resulting in a file which looks something like:

console=tty1 root=PARTUUID=someuniqueidhere rootfstype=ext4 fsck.repair=yes rootwait init=/usr/lib/raspberrypi-sys-mods/firstboot\n

Next, you should remove the SD card from your PlanktoScope and plug it into another computer, so that you can clone the SD card into an SD card image; this guide assumes that your other computer runs Linux. Then proceed to the Make an SD card image section of this guide.

Warning

After you have finished cloning the SD card to an SD card image, you should edit the /boot/cmdline.txt file to remove the init=/usr/lib/raspberrypi-sys-mods/firstboot string, before booting up the Raspberry Pi with your SD card again. This will prevent the first-boot script from deleting the SSH server keys already on your SD card.

"},{"location":"operation/clone-sd/#make-an-sd-card-image","title":"Make an SD card image","text":""},{"location":"operation/clone-sd/#locate-the-sd-card","title":"Locate the SD card","text":"

Now that your SD card is plugged into a Linux computer, you will need to determine the path of the device file corresponding to your SD card. Usually it will look something like /dev/mmcblk0, /dev/sda, or /dev/sdb; it should always be some file in /dev. To identify the device file for your SD card, run the command sudo fdisk -l in your terminal. The output may look something like:

Disk /dev/nvme0n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors\nDisk model: WD_BLACK SN770 2TB\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: D18C4567-ADF2-4987-987F-CDA411988C8E\n\nDevice           Start        End    Sectors  Size Type\n/dev/nvme0n1p1    2048    1230847    1228800  600M EFI System\n/dev/nvme0n1p2 1230848    3327999    2097152    1G Linux filesystem\n/dev/nvme0n1p3 3328000 3907028991 3903700992  1.8T Linux filesystem\n\nDisk /dev/mmcblk0: 58.29 GiB, 62587404288 bytes, 122241024 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: dos\nDisk identifier: 0xa2033091\n

To determine which disk device corresponds to your SD card, you should check the size of each device to find the one which approximately matches the size of your SD card. In the above example, the 64 GB SD card is at /dev/mmcblk0.

Next, you should unmount the SD card from your system (or ensure that the device is already not mounted on your system). If you're unsure whether the SD card is mounted, you should use the umount command. For example, if your device is /dev/mmcblk0, you will need to run:

sudo umount /dev/mmcblk0p1\nsudo umount /dev/mmcblk0p2\n

If the devices were already not mounted, you should expect to see (and you can safely ignore) error messages which look like:

umount: /dev/mmcblk0p1: not mounted.\numount: /dev/mmcblk0p2: not mounted.\n
"},{"location":"operation/clone-sd/#clone-the-sd-card-to-an-image","title":"Clone the SD card to an image","text":"

To clone the Raspberry Pi's SD card to an image file which you can write to other SD cards, you should follow the instructions at https://github.com/mgomesborges/raspberry-pi/blob/master/setup/clone-sd-card.md or https://raspberrytips.com/create-image-sd-card/ . For example, if you are using a Linux computer and the SD card shows up as /dev/mmcblk0, you could run the following command (replacing file paths and names accordingly):

sudo dd bs=4M if=/dev/mmcblk0 of=/some/path/here/image-name-here.img status=progress\n

This will create a .img file (at /some/path/here/image-name-here.img) as large as your SD card - make sure you have enough space on your hard drive for the file! If your SD card is large, this process may take a long time; this greatly depends on the speed of your SD card reader. For example, a slow SD card reader may take 30 minutes in order to clone a 32 GB SD card.

"},{"location":"operation/clone-sd/#shrink-the-sd-card-image","title":"Shrink the SD card image","text":"

In order to make the SD card practical to share, you should shrink and compress the SD card image file using the PiShrink tool. For example, on Linux you could run the following set of commands (again replacing file paths and names accordingly):

cd /some/path/here\nwget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh\nchmod +x pishrink.sh\nsudo ./pishrink.sh -za image-name-here.img\n

If you had set up the PlanktoScope software on a Raspberry Pi OS Lite image, you should get a image-name-here.img.gz file which is at least 2 GB in size.

"},{"location":"operation/clone-sd/#use-the-sd-card-image","title":"Use the SD card image","text":"

You can now use this SD card image with the non-standard installation guide for installing the PlanktoScope OS on an SD card for one or more PlanktoScopes.

"},{"location":"operation/maintenance/","title":"Maintenance and Repair","text":"

Instructions for maintaining and repairing the PlanktoScope.

"},{"location":"operation/maintenance/#cleaning-the-optics","title":"Cleaning the optics","text":""},{"location":"operation/maintenance/#software-updates","title":"Software updates","text":"

The PlanktoScope project aims to keep improving the PlanktoScope software by fixing problems and making the software simpler and easier to use, releasing a new version of the software a few times each year. At the same time, we aim to keep the software compatible with all previous officially-released versions of the PlanktoScope hardware. For this reason, we strongly recommend everyone to keep their PlanktoScopes updated to run the latest stable release of the PlanktoScope software, and the PlanktoScope documentation will only support the latest stable release. You can always find the latest stable release at https://github.com/PlanktoScope/PlanktoScope/releases/latest, which will redirect you to a web page for the latest stable release.

Currently, you will need to re-flash the SD card of your PlanktoScope's embedded Raspberry Pi in order to update the PlanktoScope software to the latest version, and then you will need to reapply any custom software configurations you had set (e.g. hardware settings). We are also developing an easier and less disruptive way to update the PlanktoScope software, but it is not yet ready for use.

"},{"location":"operation/sample-collection/","title":"Sample collection","text":"

The most common way to collect samples for the PlanktoScope is to use a plankton net.

"},{"location":"operation/sample-collection/#plankton-net","title":"Plankton Net","text":"

A plankton net is a scientific tool used to collect plankton samples from aquatic environments. Plankton are small, drifting organisms that play a vital role in marine ecosystems. They include a diverse range of species, including bacteria, algae, protozoa, and small animals such as crustaceans and mollusks. Plankton nets are designed to capture these tiny organisms as they drift through the water column.

Plankton nets typically consist of a fine mesh net attached to a long, narrow handle. The net is usually cone- or cylinder-shaped, with a small opening at the base and a wider opening at the top. The net is lowered into the water and dragged through the water column, collecting plankton as it goes. The collected plankton is then collected in a sample bottle or container for further study.

Plankton nets can be used in a variety of aquatic environments, including oceans, lakes, and rivers. They are commonly used in scientific research to study the diversity and abundance of plankton in different ecosystems, as well as their role in the food web and the broader ecosystem. Plankton nets are also used in environmental monitoring programs to track changes in plankton populations over time.

The simplest device you can use is a plankton net. It should be made of a fine mesh, down to 20 micron. It can be towed behind a boat at low speed (less than 2 knots) or towed by hand in a river or a lake.

Plankton nets can be made easily with a good sewind machine and some hardware.

"},{"location":"operation/user-interface/","title":"User interface guide","text":"

This guide will help you understand how to use the Node-RED dashboard, which is the primary user interface for operating the PlanktoScope.

"},{"location":"operation/user-interface/#home","title":"Home","text":"

When you open the \"Node-RED dashboard link\" from the PlanktoScope's landing page, you will reach a page like what is shown in the screenshot above.

From here, you can quickly access any of the available tabs. The buttons are only the most used functionnalities of the machine. Three others tabs are accessible only through the hamburger menu on the top left of the screen (the three horizontal lines):

Tip

This list is also available from any other tab and allows you to quickly navigate between tabs.

"},{"location":"operation/user-interface/#machine-shutdown","title":"Machine shutdown","text":"

From this page, you can also shutdown the machine when you are done.

Warning

It's very very very important to always shutdown the machine and wait a minute for it to completely shutdown before unplugging the power supply! You risk data corruption if you turn off power without shutting down the machine through the software!

To shutdown the machine, first unlock the shutdown button by clicking on \"Unlock Button\".

You can then click on \"Shutdown\". The machine will ask for a final confirmation and will then shut itself down.

"},{"location":"operation/user-interface/#sample-tab","title":"Sample Tab","text":"

In this page, you can enter all the information regarding the current sample you want to image. This includes the project name, the operator, but also the type of collection device you used.

Depending on the device you choose, the page will change to reflect the needed information.

There is a mechanism of validation of the submitted data. Please be careful to use the format given in example for each input field.

The GPS status block will give you the current information on the GPS fix and location, your direction and speed. This can be used to grab the location when in the field.

Once all the fields are completed, you can go to the next tab by clicking the -> arrow. This will make sure all the inserted data is valid.

"},{"location":"operation/user-interface/#optic-configuration","title":"Optic Configuration","text":"

This page allows you to control the optical setup of the acquisition.

In the Optic Characterization block, you can control to turn the light on or not. You also have to choose the optics in use in the machine.

Warning

For now, the characteristics shown here are not true values (except if you use the 25mm/16mm lens couple).

The Camera Settings block allows you to change the shutter speed, the ISO number and the camera white balance settings. You can set it to automatic, but it's better if you control it by hand to make sure the setting doesn't change when the acquisition is started.

The Fluidic Manual Manipulation allows you to control the pump. You can change both the flowrate and the volume pumped. If you click on the rotating arrow, it will start the pump for the given volume at the chosen flowrate.

The Focus Adjustment block allows you to control the focus stage. With the leftmost buttons, you can choose to move the stage quickly by one mm, either up or down. The rightmost buttons move the stage by the specified distance in the slider under.

As with all the tabs, once you are satisfied with your focus and your image settings, you can click on \"Continue\".

"},{"location":"operation/user-interface/#fluidic-acquisition","title":"Fluidic Acquisition","text":"

Finally, this is where the magic happens! You will be able to chose the final parameters of your capture.

First of all, change the Fraction Size of your sample. You can then choose a unique ID for your acquisition, the number of pictures you want to take, the pumped volume (in between images), the delay to stabilize the image and the Flowcell thickness. All those settings will influence the Total imaged volume (the total volume captured during the acquisition) and the Total pumped volume.

Warning

Make sure the Total pumped volume is lower than the volume of your sample.

"},{"location":"operation/user-interface/#gallery","title":"Gallery","text":"

This simple page will allow you to preview and download the captured data.

"},{"location":"operation/user-interface/#system-monitoring","title":"System Monitoring","text":"

This tab allows you to monitor the physical characteristics of the machine and follow the processor load, CPU temperature, memory use and disk usage.

You also can find information about the software version you are using, the machine name and its camera.

"},{"location":"operation/user-interface/#wifi","title":"Wifi","text":"

This page will give you information about the network the PlanktoScope is connected to. It will also allows you to connect your machine to a new WiFi network.

Start by doing a network scan by clicking on the Scan button. The list will be populated with detected networks after a few seconds. You can then choose one of them, enter its password and click on Add the network to connect to it. The wifi network of the PlanktoScope will disappear after a few seconds, so you will need to connect back to the same network you just put the machine on.

Finally, if you are not located in the US, please update the Country code in the field below. This will ensure the PlanktoScope complies with local Wifi regulations (such as maximum emitted power, duty cycle and such).

Clicking on the button Reset wifi networks will erase ALL networks saved previously by the machine. If you do this, it will disconnect immediately from any network it's connected to, and will put up its own network.

Info

For now, only WPA/WPA2 Personal security is supported; Wi-Fi networks without passwords are not supported.

Warning

Please be mindful about the security policies of your organisation before connecting your device to a network (either through Wifi or with an Ethernet cable). A lot of research institutions don't allow devices not controlled by them to be connected to their network without first going on an approved list with a least a basic security checkup.

"},{"location":"operation/user-interface/#administration","title":"Administration","text":"

On this page you can find links to view the logs generated by the Python backend, and buttons to restart the Python backend's hardware controller or segmenter, as well as buttons to restart or shut down your PlanktoScope's Raspberry Pi computer.

"},{"location":"operation/user-interface/#hardware-settings","title":"Hardware Settings","text":"

You should not touch anything here unless you have received specific instructions to do so, e.g. as part of our post-installation configuration guide, or as part of a guide for calibrating your PlanktoScope.

"},{"location":"reference/","title":"Technical Reference","text":"

The PlanktoScope is a modular, open-source platform for high-throughput quantitative imaging of plankton samples. Its small size, ease of use, and low cost make it suitable for a variety of applications, including the monitoring of laboratory cultures or natural micro-plankton communities. It can be controlled from any WiFi-enabled device and can be easily reconfigured to meet the changing needs of the user.

"},{"location":"reference/#key-features","title":"Key Features","text":"

Here are some key features of the PlanktoScope:

  1. Low cost: The PlanktoScope is designed to be affordable, with parts costing under $1000.
  2. Modular: The PlanktoScope is modular, meaning it can be easily reconfigured to meet the changing needs of users.
  3. Open-source: The PlanktoScope is based on open-source hardware and software, making it accessible to a wide community of engineers, researchers, and citizens.
  4. Versatility: The PlanktoScope is versatile, and can be used to study a variety of plankton types, including laboratory cultures and natural micro-plankton communities.
  5. High-throughput: The PlanktoScope is capable of high-throughput quantitative imaging, allowing users to analyze large numbers of samples quickly and efficiently.
  6. WiFi-enabled: The PlanktoScope can be controlled from any WiFi-enabled device, making it easy to use and deploy in a variety of settings.
  7. Portable: The PlanktoScope is small and portable, making it easy to transport and use in the field.
  8. Ease of use: The PlanktoScope is designed to be easy to use, with instructions for assembly and use available on the PlanktoScope website.
"},{"location":"reference/hardware/changelog/","title":"Changelog","text":"

The design of the PlanktoScope's hardware has been evolving to fix usability issues and improve the quality of images captured by the PlanktoScope. Thus, multiple versions of the hardware have been developed:

"},{"location":"reference/hardware/changelog/#v26","title":"v2.6","text":"

This is the latest version of the PlanktoScope hardware, and it is the version currently sold by FairScope. It replaced the optical components so that the PlanktoScope produces higher-quality images.

"},{"location":"reference/hardware/changelog/#v25","title":"v2.5","text":"

This was the first version of the PlanktoScope hardware made commercially available by FairScope, a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. It is a minor variation of the v2.4 hardware design and includes all of the changes made in previous hardware versions - including a custom-designed PCB HAT, a glass capillary flowcell. The mechanical structure of this design uses CNC-milled parts rather than laser-cut parts.

"},{"location":"reference/hardware/changelog/#v24","title":"v2.4","text":"

This was a prototype which replaced the ibidi u-Slide flowcell with a simpler flowcell design based on rectangular glass capillaries, in order to fix various issues with the ibidi flowcells and to make it possible for people to make their own flowcells.

This version was only an internal prototype for the PlanktoScope development team.

"},{"location":"reference/hardware/changelog/#v23","title":"v2.3","text":"

This was a prototype version of the hardware which replaced the Adafruit Stepper Motor HAT and the Yahboom RGB Cooling HAT with a custom-designed PCB HAT, in order to simplify overall assembly and provide additional features which solved problems with the v2.1 hardware design. As a result, a different configuration of the PlanktoScope software is required to control this version of the PlanktoScope hardware, as well as subsequent hardware versions. This version also significantly changed the physical dimensions of the PlanktoScope's mechanical structure, in order to solve some problems with the v2.1 design.

This version was only an internal prototype for the PlanktoScope development team.

"},{"location":"reference/hardware/changelog/#v22","title":"v2.2","text":"

This was a prototype version of the hardware which replaced the Adafruit Stepper Motor HAT with a Waveshare Stepper Motor HAT.

This version was only an internal prototype for the PlanktoScope development team.

"},{"location":"reference/hardware/changelog/#v21","title":"v2.1","text":"

This is the first version of the PlanktoScope hardware which was publicly released, and it is one of the two hardware designs described in the initial paper introducing the PlanktoScope. It simplified the hardware's robustness and mechanical assembly by integrating most subsystems into a monolithic architecture whose structure uses laser-cut parts. The electronic hardware components of this design are all available off-the-shelf, using an Adafruit Stepper Motor HAT to control various actuators and a Yahboom RGB Cooling HAT to cool the PlanktoScope's embedded Raspberry Pi computer. The mechanical structure was designed for fabrication using a laser cutter. This hardware version included some design flaws, such as providing no way to replace the Raspberry Pi's micro-SD card without partially disassembling the PlanktoScope.

"},{"location":"reference/hardware/changelog/#v10","title":"v1.0","text":"

This was the first prototype of the PlanktoScope, and it is one of the two hardware designs described in the initial paper introducing the PlanktoScope. Its mechanical structure featured a fully modular, stackable architecture consisting of triangular layers which coupled together with magnets.

This design was complicated to assemble, and it suffered from unreliable electronic communication between the modules, so it was never publicly released.

"},{"location":"reference/hardware/hat/","title":"PlanktoScope Hat Hardware","text":""},{"location":"reference/hardware/hat/#buses-and-gpio-pinout","title":"Buses and GPIO pinout","text":""},{"location":"reference/hardware/hat/#i2c1-bus","title":"I2C1 Bus","text":""},{"location":"reference/hardware/hat/#rtc-rv-3028-c7","title":"RTC RV-3028-C7","text":"

Address 0x52 Configured through a kernel driver.

"},{"location":"reference/hardware/hat/#oled-display","title":"OLED Display","text":"

Address 0x3c

"},{"location":"reference/hardware/hat/#led-control-lm36011","title":"LED control: LM36011","text":"

Address 0x64 Control through specific software, current range from 0 to 376mA in normal mode, up to 1.5A in flash mode.

"},{"location":"reference/hardware/hat/#spi0-bus","title":"SPI0 Bus","text":""},{"location":"reference/hardware/hat/#motor-controller-0-tmc5160","title":"Motor Controller 0: TMC5160","text":"

Chip Enable: SPI0_CE0 Motor Enable: GPIO23

Diagnostic output: GPIO16 for Error output GPIO20 for Stall output

"},{"location":"reference/hardware/hat/#motor-controller-1-tmc5160","title":"Motor Controller 1: TMC5160","text":"

Chip Enable: SPI0_CE1 Motor Enable: GPIO5

Diagnostic output: GPIO16 for Error output GPIO20 for Stall output

"},{"location":"reference/hardware/hat/#gpio","title":"GPIO","text":""},{"location":"reference/hardware/hat/#fan-control","title":"Fan control","text":"

PWM1 control through GPIO13

"},{"location":"reference/hardware/hat/#led-output-selection","title":"LED Output selection","text":"

GPIO18: high for LED1, low for LED2

"},{"location":"reference/hardware/hat/#led-strobe","title":"LED Strobe","text":"

GPIO22 for pulse

"},{"location":"reference/hardware/hat/#i2c0-bus","title":"I2C0 Bus","text":""},{"location":"reference/hardware/hat/#eeprom-m24c32","title":"EEPROM M24C32","text":"

Address 0x50 For HAT information only.

"},{"location":"reference/hardware/product-specs/","title":"Product Specifications","text":"

Product specifications for the PlanktoScope hardware are listed below for each hardwaare version. For more information on each hardware version, refer to the hardware changelog.

"},{"location":"reference/hardware/product-specs/#v26","title":"v2.6","text":"

Overview:

"},{"location":"reference/hardware/product-specs/#functionalities","title":"Functionalities","text":""},{"location":"reference/hardware/product-specs/#subsystems","title":"Subsystems","text":"

Optics:

Fluidics:

Other internal electronics:

External interfaces & connectivity:

External AC-to-DC power adapter:

"},{"location":"reference/hardware/product-specs/#system-performance","title":"System performance","text":"

Image acquisition throughput:

Samples:

"},{"location":"reference/hardware/product-specs/#v25","title":"v2.5","text":"

Overview:

"},{"location":"reference/hardware/product-specs/#functionalities_1","title":"Functionalities","text":""},{"location":"reference/hardware/product-specs/#subsystems_1","title":"Subsystems","text":"

Optics:

Fluidics:

Other internal electronics:

External interfaces & connectivity:

External AC-to-DC power adapter:

"},{"location":"reference/hardware/product-specs/#system-performance_1","title":"System performance","text":"

Image acquisition throughput:

Samples:

"},{"location":"reference/hardware/product-specs/#v21","title":"v2.1","text":"

Overview:

"},{"location":"reference/hardware/product-specs/#functionalities_2","title":"Functionalities","text":""},{"location":"reference/hardware/product-specs/#subsystems_2","title":"Subsystems","text":"

Optics:

Fluidics:

Other internal electronics:

External interfaces & connectivity:

"},{"location":"reference/software/changelog/","title":"Changelog","text":"

All notable changes to the PlanktoScope's software will be documented in this file.

The format is based on Keep a Changelog, and this project uses Calendar Versioning with a YYYY.minor.patch scheme for all releases after v2.3.0. All dates in this file are given in the UTC time zone.

"},{"location":"reference/software/changelog/#v202400-beta2-2024-09-19","title":"v2024.0.0-beta.2 - 2024-09-19","text":""},{"location":"reference/software/changelog/#added","title":"Added","text":""},{"location":"reference/software/changelog/#changed","title":"Changed","text":""},{"location":"reference/software/changelog/#fixed","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202400-beta1-2024-06-24","title":"v2024.0.0-beta.1 - 2024-06-24","text":""},{"location":"reference/software/changelog/#added_1","title":"Added","text":""},{"location":"reference/software/changelog/#changed_1","title":"Changed","text":""},{"location":"reference/software/changelog/#removed","title":"Removed","text":""},{"location":"reference/software/changelog/#fixed_1","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202400-beta0-2024-06-07","title":"v2024.0.0-beta.0 - 2024-06-07","text":""},{"location":"reference/software/changelog/#changed_2","title":"Changed","text":""},{"location":"reference/software/changelog/#deprecated","title":"Deprecated","text":""},{"location":"reference/software/changelog/#removed_1","title":"Removed","text":""},{"location":"reference/software/changelog/#fixed_2","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202400-alpha2-2024-04-25","title":"v2024.0.0-alpha.2 - 2024-04-25","text":""},{"location":"reference/software/changelog/#added_2","title":"Added","text":""},{"location":"reference/software/changelog/#changed_3","title":"Changed","text":""},{"location":"reference/software/changelog/#deprecated_1","title":"Deprecated","text":""},{"location":"reference/software/changelog/#fixed_3","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202400-alpha1-2024-03-26","title":"v2024.0.0-alpha.1 - 2024-03-26","text":""},{"location":"reference/software/changelog/#changed_4","title":"Changed","text":""},{"location":"reference/software/changelog/#deprecated_2","title":"Deprecated","text":""},{"location":"reference/software/changelog/#fixed_4","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202400-alpha0-2024-02-06","title":"v2024.0.0-alpha.0 - 2024-02-06","text":""},{"location":"reference/software/changelog/#added_3","title":"Added","text":""},{"location":"reference/software/changelog/#changed_5","title":"Changed","text":""},{"location":"reference/software/changelog/#removed_2","title":"Removed","text":""},{"location":"reference/software/changelog/#fixed_5","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202390-2023-12-30","title":"v2023.9.0 - 2023-12-30","text":"

(this release involves no changes from v2023.9.0-beta.2; it's just a promotion of v2023.9.0-beta.2 to a stable release)

"},{"location":"reference/software/changelog/#v202390-beta2-2023-12-02","title":"v2023.9.0-beta.2 - 2023-12-02","text":""},{"location":"reference/software/changelog/#added_4","title":"Added","text":""},{"location":"reference/software/changelog/#changed_6","title":"Changed","text":""},{"location":"reference/software/changelog/#removed_3","title":"Removed","text":""},{"location":"reference/software/changelog/#fixed_6","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202390-beta1-2023-09-14","title":"v2023.9.0-beta.1 - 2023-09-14","text":""},{"location":"reference/software/changelog/#added_5","title":"Added","text":""},{"location":"reference/software/changelog/#changed_7","title":"Changed","text":""},{"location":"reference/software/changelog/#deprecated_3","title":"Deprecated","text":""},{"location":"reference/software/changelog/#removed_4","title":"Removed","text":""},{"location":"reference/software/changelog/#fixed_7","title":"Fixed","text":""},{"location":"reference/software/changelog/#v202390-beta0-2023-09-02","title":"v2023.9.0-beta.0 - 2023-09-02","text":""},{"location":"reference/software/changelog/#added_6","title":"Added","text":""},{"location":"reference/software/changelog/#changed_8","title":"Changed","text":""},{"location":"reference/software/changelog/#deprecated_4","title":"Deprecated","text":""},{"location":"reference/software/changelog/#removed_5","title":"Removed","text":""},{"location":"reference/software/changelog/#fixed_8","title":"Fixed","text":""},{"location":"reference/software/changelog/#v230-2021-12-20","title":"v2.3.0 - 2021-12-20","text":""},{"location":"reference/software/changelog/#added_7","title":"Added","text":""},{"location":"reference/software/changelog/#changed_9","title":"Changed","text":""},{"location":"reference/software/changelog/#fixed_9","title":"Fixed","text":""},{"location":"reference/software/changelog/#v221-2021-05-10","title":"v2.2.1 - 2021-05-10","text":""},{"location":"reference/software/changelog/#added_8","title":"Added","text":""},{"location":"reference/software/changelog/#fixed_10","title":"Fixed","text":""},{"location":"reference/software/changelog/#v220-2021-02-23","title":"v2.2.0 - 2021-02-23","text":""},{"location":"reference/software/changelog/#added_9","title":"Added","text":""},{"location":"reference/software/changelog/#changed_10","title":"Changed","text":""},{"location":"reference/software/changelog/#fixed_11","title":"Fixed","text":""},{"location":"reference/software/changelog/#v210-2020-10-14","title":"v2.1.0 - 2020-10-14","text":""},{"location":"reference/software/changelog/#added_10","title":"Added","text":""},{"location":"reference/software/changelog/#changed_11","title":"Changed","text":""},{"location":"reference/software/product-specs/","title":"Product Specifications","text":"

The PlanktoScope OS includes all software which needs to run on the PlanktoScope's hardware to provide the overall functionality of a PlanktoScope. Product specifications for the PlanktoScope OS are listed below for ranges of software version numbers. To see software versions listed individually in chronological order, refer to the project release notes or the software changelog. To understand how to interpret software version numbers, refer to our description of the PlanktoScope OS's version numbering system.

"},{"location":"reference/software/product-specs/#v202400","title":"v2024.0.0","text":"

Specs for v2024.0.0 are the same as in v2023.9.0, except for the following sections:

"},{"location":"reference/software/product-specs/#functionalities","title":"Functionalities","text":"

Regular operation:

Advanced operations:

"},{"location":"reference/software/product-specs/#base-operating-system","title":"Base operating system","text":""},{"location":"reference/software/product-specs/#supported-hardware","title":"Supported hardware","text":"

Minimum for image acquisition (but not sufficient for on-board image processing):

Minimum for full functionality, including on-board image processing:

Recommended:

Forwards-incompatibilities:

Backwards-incompatibilities:

"},{"location":"reference/software/product-specs/#system-performance","title":"System performance","text":"

With minimum supported hardware for full functionality:

"},{"location":"reference/software/product-specs/#v202390","title":"v2023.9.0","text":""},{"location":"reference/software/product-specs/#functionalities_1","title":"Functionalities","text":"

Regular operation:

Advanced operations:

"},{"location":"reference/software/product-specs/#base-operating-system_1","title":"Base operating system","text":""},{"location":"reference/software/product-specs/#supported-hardware_1","title":"Supported hardware","text":"

Minimum for image acquisition (but not sufficient for on-board image processing):

Minimum for full functionality, including on-board image processing:

Recommended:

Forwards-incompatibilities:

Backwards-incompatibilities:

"},{"location":"reference/software/product-specs/#system-performance_1","title":"System performance","text":"

With minimum supported hardware for full functionality:

"},{"location":"reference/software/product-specs/#v23","title":"v2.3","text":""},{"location":"reference/software/product-specs/#functionalities_2","title":"Functionalities","text":"

Regular operation:

Advanced operations:

"},{"location":"reference/software/product-specs/#base-operating-system_2","title":"Base operating system","text":""},{"location":"reference/software/product-specs/#supported-hardware_2","title":"Supported hardware","text":"

Minimum for image acquisition (but not sufficient for on-board image processing):

Minimum for full functionality, including on-board image processing:

Recommended for full functionality:

Forwards-incompatibilities:

"},{"location":"reference/software/product-specs/#system-performance_2","title":"System performance","text":"

With minimum supported hardware for full functionality:

"},{"location":"reference/software/release-process/","title":"Release Process","text":"

The PlanktoScope's software is released independently of the PlanktoScope's hardware; this document explains how we manage releases of the PlanktoScope OS (which contains the software which runs on a PlanktoScope, and which you can download as an SD card image), to help you to:

"},{"location":"reference/software/release-process/#version-numbering","title":"Version numbering","text":"

The PlanktoScope OS is a combination of many individual software components; some components (such as most parts of the PlanktoScope's graphical user interface, and some of its hardware drivers) are written, maintained, and distributed by the PlanktoScope project, while other components (such as the Cockpit administration dashboard and the file browser) are written, maintained, and distributed by other open-source software projects. Each component has its own release schedule and version numbering system; the specific combination of releases and versions of all these components will change over time as these components change, and we represent each total combination of all software components by a version number assigned to a particular release of the PlanktoScope OS. For example, the v2023.9.0 release of the PlanktoScope OS included various software programs at one specific combination of versions, while the v2024.0.0 release upgraded some of those programs to newer versions.

We use a calendar-based version numbering system for the PlanktoScope OS, where each version number has the format v(year).(minor).(patch) for stable releases of the software or v(year).(minor).(patch)-(modifier) for testing pre-releases of the software:

"},{"location":"reference/software/release-process/#release-channels","title":"Release channels","text":"

The PlanktoScope project uses a concept called \"release channels\" to structure our process for stabilizing and testing our software before we publish a new release of the PlanktoScope OS for everyone to use. There are three channels for PlanktoScope software releases and pre-releases, each corresponding to a particular branch of the PlanktoScope repository on GitHub:

"},{"location":"reference/software/release-process/#release-schedules","title":"Release schedules","text":"

We try to publish a few stable releases every year. Some stable releases may consist of small bugfixes, while other stable releases may add new functionalities or change existing functionalities. Thus, each release involves changes with different sizes of potential impact on software stability and different levels of risks for introducing new bugs. Because of this, we usually cannot make confident predictions about how long we will need to wait before we can promote an \"alpha\" pre-release to a \"beta\" pre-release. And because we rely on volunteers to test our \"beta\" pre-releases and the availability of volunteers for testing each \"beta\" pre-release often varies a lot, we cannot make confident predictions about how long we will need to wait before we can promote a \"beta\" pre-release to a \"stable\" release.

Although the unpredictability of \"alpha\" and \"beta\" pre-release testing timelines prevents us from being able to set realistic expectations about specific software release timelines, you can generally expect at least one stable release in the first half of each year, and at least one stable release in the second half of each year.

"},{"location":"reference/software/release-process/#choosing-a-release-channel","title":"Choosing a release channel","text":"

Unless you have a specific reason, you probably should follow the stable release channel. \"Stable\" releases are intended for a general audience to rely on.

However, we encourage all PlanktoScope users who use the stable release channel to also test beta pre-releases once those pre-releases are published. This will help us to discover and understand bugs which we may need to fix before promoting the PlanktoScope software from the \"Beta\"\" channel to the \"Stable\" channel.

"},{"location":"reference/software/release-process/#upgrading-to-a-new-release-or-pre-release","title":"Upgrading to a new release or pre-release","text":"

In order to use a new release or pre-release of the PlanktoScope OS, you will need to do one of the following:

Then you will need to re-flash your PlanktoScope's SD card (or flash a new SD card for your PlanktoScope) with the resulting SD card image for the new release/pre-release of the PlanktoScope OS.

"},{"location":"reference/software/architecture/os/","title":"Operating System","text":"

When you flash an SD card image with the PlanktoScope software as part of PlanktoScope's software setup process, that SD card image consists of the PlanktoScope OS. This document describes the architecture of the PlanktoScope OS as an operating system, in order to explain:

This information is intended to help you understand:

Each SD card image of the PlanktoScope's software consists of an operating system for the PlanktoScope; the definition of the term \"operating system\" can be tricky to demarcate, but for practical purposes this document follows Bryan Cantrill's characterization of the operating system as the special program that:

This definition is a reasonable description of the PlanktoScope OS, because it's a program which abstracts the following hardware subsystems in a way that enables you to run other programs on the PlanktoScope which need to control or otherwise interact with the PlanktoScope's hardware:

"},{"location":"reference/software/architecture/os/#software-deployment-execution","title":"Software deployment & execution","text":"

In order to abstract the Raspberry Pi computer hardware to enable execution of other programs, the PlanktoScope OS merely uses software provided by other open-source projects:

The PlanktoScope OS is a 64-bit operating system.

"},{"location":"reference/software/architecture/os/#boot-sequence","title":"Boot sequence","text":"

Because the PlanktoScope OS is a systemd-based Linux system running on the Raspberry Pi, the PlanktoScope's initial boot sequence is described by external documentation of:

The systemd system manager starts a variety of services added by the PlanktoScope OS which do not exist in the default installation of the Raspberry Pi OS, such as docker.service. The startup ordering relationships between those services are listed in our reference document about services in the startup process.

"},{"location":"reference/software/architecture/os/#system-upgrades","title":"System upgrades","text":"

Traditional Linux distros such as the Raspberry Pi OS are designed to run software directly on the host OS using a shared collection of programs and system libraries provided by the Linux distro, and with programs and libraries installed and upgraded in-place directly on the host OS via the package managers provided by the distro, such as APT and pip. This causes the following challenges for system administration on the PlanktoScope:

All of the factors listed above increase the perceived risk (and/or the required effort for sufficient mitigation of that risk) of accidentally degrading system integrity by keeping all software on the OS up-to-date, which makes it harder for users to receive bugfixes, security patches, and new features in a timely manner. Indeed, outside of systems like phones and Chromebooks (whose operating systems automatically update themselves), it is common for users of operating systems to avoid installing security updates or OS upgrades out of a fear of breaking their installed software; this is especially common for users who rely on software to operate other scientific instruments, and for good reasons! But the PlanktoScope project currently does not have enough resources to be able to support users stuck on old versions of the PlanktoScope OS; instead, we want to make it easy and safe for all users to always keep their PlanktoScopes - even with customizations to the OS - automatically updated to the latest version of the PlanktoScope OS. We intend to achieve this by:

Currently, we have partially implemented the systems necessary for these goals. Much of the PlanktoScope's software is not installed or upgraded directly on the host OS via APT or pip; instead, we use a (partially-implemented) tool called forklift which we're developing specifically to support the goals listed above, and which provides a robust way for us to fully manage deployment, configuration, and upgrading of:

Everything managed by forklift is version-controlled in a Git repository, enabling easy backup and restoration of forklift-managed configurations even if the PlanktoScope's SD card is wiped and re-flashed.

"},{"location":"reference/software/architecture/os/#package-management-with-forklift","title":"Package management with forklift","text":"

When you're just experimenting and you can tolerate the challenges mentioned above, it's fine to customize the PlanktoScope OS by installing software packages using pip directly on the OS and/or by making extensive changes to OS configuration files. However, once you actually care about keeping your customizations around - and especially if/when you want to share your customizations with other people - we recommend migrating those customizations into Forklift packages, which are just files and configuration files stored in a specially-structured Git repository which is also published online (e.g. on GitHub, GitLab, Gitea, etc.). forklift provides an easy way to package, publish, combine, and apply customizations via YAML configuration files in Git repositories; this enables easy sharing, configuration, (re-)composition, and downloading of Docker Compose applications, systemd services, and OS configuration files. Configurations of all deployments of Forklift packages on a computer running the PlanktoScope OS are specified and integrated in a single Git repository, a Forklift pallet. At any given time, each PlanktoScope has exactly one Forklift pallet deployed; switching between Forklift pallets (whether to try out a different set of customizations or to upgrade/downgrade all programs and OS configurations managed by Forklift) is easy and can be done by running just one command (forklift pallet switch, described below in the Applying published customizations subsection).

forklift is used very differently compared to traditional Linux system package managers like APT, for which you must run step-by-step commands in order to modify the state of your system (e.g. to install some package or install some other package). When using forklift, you instead edit configuration files which declare the desired state of your system (though some step-by-step commands are also provided by forklift to make editing of files easier), and then you ask forklift to try to reconcile the actual state of your system with the desired state. If you've worked with Hashicorp Terraform/OpenTofu before, this may sound very familiar to you - in fact, several aspects of forklift's design were inspired by Terraform.

"},{"location":"reference/software/architecture/os/#dependency-management","title":"Dependency management","text":"

forklift is simpler than traditional package managers in some notable ways, including in the concept of dependencies between packages. For example, Forklift packages cannot specify dependencies on other Forklift packages; instead, they may declare that they depend on certain resources - and you must declare a deployment of some other package which provides those resources. And although forklift checks whether resource dependencies between package deployments are satisfied, it does not attempt to solve unmet dependencies. If you've worked with the Go programming language before, resource dependency relationships among Forklift packages are analogous to the relationships between functions which require arguments with particular interfaces and the types which implement those interfaces, with Forklift resources being analogous to Go interfaces.

This design is intended to facilitate replacement of particular programs with modified or customized versions of those programs. For example, a Forklift package could be declared as providing the same API on the same network port as some other package, so that one package can be substituted for the other while still maintaining compatibility with some other program which relies on the existence of that API. forklift also checks these resource declarations to ensure that any two packages which would conflict with each other (e.g. by trying to listen on the same network port) will be prevented from being deployed together.

"},{"location":"reference/software/architecture/os/#making-publishing-customizations","title":"Making & publishing customizations","text":"

The workflow with forklift for developing/testing OS customizations, such as new package deployments or non-standard configurations of existing package deployments or substitutions of existing package deployments, is as follows:

(TODO: create a \"tutorial\"-style page elsewhere in this docs site, and link to it from here; it could be as simple as creating a new pallet which adds a new helloworld-style Node-RED dashboard)

"},{"location":"reference/software/architecture/os/#applying-published-customizations","title":"Applying published customizations","text":"

The envisioned workflow for applying published customizations (which you or someone else already developed and pushed to a Git repository served by an online host such as GitHub) is only partially implemented so far, but it already works well for basic use-cases - and it is already used as part of the PlanktoScope OS's installation process for setting up the PlanktoScope OS over a Raspberry Pi OS image:

(TODO: create a \"tutorial\"-style page elsewhere in this docs site, and link to it from here; it could just be a pallet which reconfigures the docs-site deployment to serve the full site with hardware instructions, and which includes https://hub.docker.com/r/linuxserver/firefox or https://github.com/linuxserver/docker-chromium and/or https://github.com/linuxserver/docker-webtop and/or ZeroTier and/or an ML classifier GUI and/or Jupyter Tensorflow)

Note: currently all of forklift's functionality is only exposed through a command-line interface, but after the forklift tool stabilizes we plan to add a web browser-based graphical interface for use by a general audience.

"},{"location":"reference/software/architecture/os/#planktoscope-specific-hardware-abstraction","title":"PlanktoScope-specific hardware abstraction","text":"

PlanktoScope-specific hardware modules are abstracted by PlanktoScope-specific programs which expose high-level network APIs (typically using MQTT and/or HTTP); other programs should use these APIs in order to interact with the PlanktoScope-specific hardware modules. To provide these APIs, the PlanktoScope OS adds the following services (beyond what is already provided by the default installation of the Raspberry Pi OS):

"},{"location":"reference/software/architecture/os/#user-interface","title":"User interface","text":"

Traditional operating systems provide a desktop environment with a graphical user interface for operating the computer. By contrast, the PlanktoScope OS provides a set of web browser-based graphical user interfaces for operating the PlanktoScope. This approach was chosen for the following reasons:

The PlanktoScope OS adds the following network services which provide web browser-based graphical user interfaces to help users operate the PlanktoScope:

Note: we will probably simplify things by consolidating some of these components together into the PlanktoScope's Node-RED dashboard.

The PlanktoScope OS also provides various tools with web browser-based interfaces to aid with system administration and troubleshooting:

Finally, the PlanktoScope OS adds some command-line tools (beyond what is already provided by the default installation of the Raspberry Pi OS) for administrative tasks which system administrators, software developers, and advanced users may need to use:

"},{"location":"reference/software/architecture/os/#networking","title":"Networking","text":"

The PlanktoScope is often deployed in settings with limited or unstable internet access, and also in settings with no internet access at all. The PlanktoScope also needs to be deployable in remote settings where the user needs to control the PlanktoScope without being physically present. In both types of situations, the PlanktoScope's web browser-based interfaces need to remain accessible.

We solve this problem by allowing the PlanktoScope to connect to the internet over a known Wi-Fi network, and/or over Ethernet, so that the PlanktoScope's web browser-based interfaces can be accessed over the internet; and by making the PlanktoScope bring up a Wi-Fi hotspot (more formally, a wireless access point) using the Raspberry Pi's integrated Wi-Fi module in the absence of any known Wi-Fi network, so that the web browser-based interfaces can be accessed over the Wi-Fi hotspot.

When a device connects directly to the PlanktoScope (e.g. via the PlanktoScope's Wi-Fi hotspot, or via an Ethernet cable), the PlanktoScope acts as a DHCP server to assign itself certain static IP addresses (e.g. 192.168.4.1) and as a DNS server to assign itself certain domain names (e.g. home.pkscope), so that user can locate and open the PlanktoScope's web browser-based interfaces via those domain names. The PlanktoScope also announces itself under certain mDNS names (e.g. pkscope.local) which may work on networks where the PlanktoScope does not have a static IP address (e.g. because the PlanktoScope is connected to an existing Wi-Fi network).

When the PlanktoScope both has internet access and has devices connected to it (e.g. over a Wi-Fi hotspot or over Ethernet), the PlanktoScope shares its internet access with all connected devices, to enable the user to access web pages even when connected to the PlanktoScope. This is implemented in the PlanktoScope OS with network configurations for the PlanktoScope to act as a network router using Network Address Translation when it has internet access.

The standard PlanktoScope OS adds the following systemd services (beyond what is already provided by the default installation of the Raspberry Pi OS) for managing the PlanktoScope's network connectivity:

The standard PlanktoScope OS also adds the following systemd services for dynamically updating the system's network configuration during boot:

The PlanktoScope OS also adds the following common services for integrating network APIs provided by various programs, and to facilitate communication among programs running on the PlanktoScope OS:

"},{"location":"reference/software/architecture/os/#filesystem","title":"Filesystem","text":"

The PlanktoScope OS's filesystem makes some changes from the default Debian/Raspberry Pi OS filesystem structure so that /etc and /usr can be managed by Forklift while still being directly customizable by the system administrator. Specifically, a number of systemd services in the PlanktoScope OS run during early boot to:

Beyond what is required by the Linux Filesystem Hierarchy Standard, the PlanktoScope OS sets the following conventions related to filesystem paths:

"},{"location":"reference/software/architecture/os/#observability-telemetry","title":"Observability & telemetry","text":"

Although it is not a high priority yet, we would like to enable operators of large (>10) collections of PlanktoScopes to easily log and monitor the health and utilization of each PlanktoScope and to investigate issues with their PlanktoScopes, regardless of whether each PlanktoScope is deployed locally or remotely. The PlanktoScope OS currently includes the following common services to support system observability and telemetry both for the PlanktoScope OS as a system and for programs running on the PlanktoScope OS:

In the future, we will instrument other PlanktoScope-specific programs (especially the PlanktoScope hardware controller) to export various metrics for Prometheus to collect and expose.

"},{"location":"reference/software/architecture/os/#data-processing","title":"Data processing","text":"

Because the PlanktoScope collects raw image datasets which are often too large to transfer efficiently over low-bandwidth or intermittent internet connections, the PlanktoScope needs to be able to process raw image data into lower-bandwidth data (e.g. cropped and segmented images of particles in the raw images, or even just counts of different classes of particles) without internet access. In other words, the PlanktoScope must support on-board data processing at the edge. The PlanktoScope OS adds the following services for on-board processing of data generated by the PlanktoScope:

Note: in the future, the PlanktoScope OS will add more on-board services for processing the outputs of the PlanktoScope segmenter, and the PlanktoScope OS may also provide hardware abstractions (such as for AI accelerator modules) to support the deployment of neural-network models for data processing.

"},{"location":"reference/software/architecture/os/#security","title":"Security","text":"

Currently, the PlanktoScope OS lacks basic security measures to make it safe for them to be connected to the internet; currently it is the responsibility of system administrators to add extremely basic risk mitigations, for example by:

Other risk mitigations will require deeper changes to the PlanktoScope OS, such as:

We would like to start taking even just the very basic steps listed above to improve security, but security is not yet a high-enough priority for us to work on it with the limited resources available to us \ud83d\ude43 - if you're interested in computer/network security and you'd like to help us as a volunteer on this project, please contact us!

"},{"location":"reference/software/functionalities/camera-settings/","title":"Camera Settings","text":"

This document explains how the PlanktoScope software controls the PlanktoScope's camera using the camera settings exposed by the \"Optic Configuration\" page of the PlanktoScope's Node-RED dashboard.

The following camera settings can be adjusted via the Node-RED dashboard:

"},{"location":"reference/software/functionalities/camera-settings/#image-brightness","title":"Image brightness","text":"

The Node-RED dashboard's \"Shutter Speed\" setting, which is specified in units of microseconds (\u03bcs), is used to set the ExposureTime control with the picamera2 library; a higher value for this setting will make captured images brighter and - when objects are moving - blurrier. To prevent the camera from capturing blurry images of moving objects, the value of this setting should be minimized; usually the default value of 125 \u03bcs is appropriate. For a detailed explanation of the exposure time of the camera sensor, refer to the picamera library's discussion of \"exposure time\".

The Node-RED dashboard's \"ISO\" setting is divided by 100 and used to set the AnalogueGain control with the picamera2 library; a higher value for this setting will make the camera sensor more sensitive to light, and thus make captured images brighter and noisier. To prevent the camera from capturing excessively dark images - which will prevent the PlanktoScope's segmenter from correctly detecting objects - the value of this setting should not be too low. To prevent the camera from \"washing out\" images by making everything excessively bright - which will destroy visual detail in the images - the value of this setting should not be too high, either. For a detailed explanation of the analog gain of the camera sensor, refer to the picamera library's discussion of \"sensor gain\" and the picamera2 library's discussion of the AnalogueGain control and the DigitalGain property.

"},{"location":"reference/software/functionalities/camera-settings/#image-color-balance","title":"Image color balance","text":"

The PlanktoScope's camera can operate with \"Automatic White Balance\" mode either enabled or disabled. In \"Automatic White Balance\" mode, the camera ignores any manually-set white-balance settings and instead applies an adaptive algorithm to automatically (and gradually) correct the color balance of the images to prevent them from appearing more red or more blue than we would expect the images to be. However, \"Automatic White Balance\" mode prevents images from having consistent calibrations, so we recommend always disabling \"Automatic White Balance\" mode when collecting data with the PlanktoScope, and instead manually calibrating the camera's white-balance settings.

The camera's manual white-balance settings consist of two normalized color values, which are the red gain (\"WB: Red\" in the Node-RED dashboard) and the blue gain (\"WB: Blue\" in the Node-RED dashboard). The red gain can be understood as a multiplier applied to the image to achieve the desired ratio between the redness of the image and the greenness of the image, so a higher value will make the image appear redder. Similarly, the blue gain can be understood as a multiplier applied to the image to achieve the desired ratio between the blueness of the image and the greenness of the image, so a higher value will make the image appear bluer. For a deeper conceptual explanation of white balance, refer to the first two pages of Freescale Semiconductor's application note on white balance and color correction in digital cameras.

"},{"location":"reference/software/functionalities/sample-imaging/","title":"Sample Imaging","text":"

This document explains how the PlanktoScope software captures images of samples and how it uses the image-acquisition settings exposed by the \"Fluidic Acquisition\" page of the PlanktoScope's Node-RED dashboard.

Currently, the PlanktoScope software only has one sample-imaging mode, which we call \"stop-flow imaging\":

"},{"location":"reference/software/functionalities/sample-imaging/#stop-flow-imaging","title":"Stop-flow imaging","text":"

This imaging mode is optimized to allow capture of high-quality images using low-cost, high-resolution camera modules such as the Raspberry Pi Camera Module 2 and the Raspberry Pi High Quality Camera (refer to the hardware product specifications to see which camera modules are used in each version of the PlanktoScope hardware), whose rolling-shutter designs can introduce artifacts around moving objects while the camera is capturing an image.

When this imaging mode is started, the PlanktoScope will repeatedly perform the following sequence of actions until a desired number of images (\"Number of images to acquire\" in the Node-RED dashboard) is captured:

  1. The PlanktoScope's pump will pull some fixed volume of sample (\"Pumped volume\" in the Node-RED dashboard, in units of mL) from the sample intake and move the same volume of sample down through the PlanktoScope's flowcell.

  2. After the PlanktoScope's pump finishes pumping the specified volume, the pump will stop and the PlanktoScope will wait for some short fixed duration of time (\"Delay to stabilize image\" in the Node-RED dashboard, in units of seconds). This waiting period is intended to allow the sample in the PlanktoScope's flowcell to stop flowing, so that all objects in the camera's field-of-view will (hopefully) stop moving - because moving objects will cause distortion effects to appear in images captured with rolling-shutter cameras such as those used in the PlanktoScope.

  3. The PlanktoScope will capture and save an image of its entire field-of-view.

"},{"location":"reference/software/functionalities/segmentation/","title":"Image Segmentation","text":"

This document explains how the PlanktoScope software's segmenter program processes raw images (captured by the PlanktoScope's sample-imaging functionality) in order to detect objects - such as plankton, microplastics, and other particles - and to extract each object into its own segmented image for downstream use, such as for uploading to EcoTaxa. This document also lists and explains the metadata fields added by the PlanktoScope segmenter for uploading to EcoTaxa.

Currently, the segmenter only operates in batch-processing mode: the segmenter takes as input a complete raw image dataset, and it produces as output a complete segmented object dataset as well as an export archive of segmented objects which can be uploaded to EcoTaxa.

When the segmenter starts, it will perform a median-calculation step on the first ten images of the dataset of raw images. The median-calculation step outputs a median image which is then used as an input for an image-correction step on each raw image; the median image will occasionally be recalculated (conditions triggering a recalculation are described below). Each image-cleaning step outputs a median-corrected image is then used as the input for a mask-calculation step. Each mask-calculation step outputs a segmentation mask which is then used as an input for an object-extraction step.

For each raw image from the input dataset, after the object-extraction step outputs a set of objects, the number of extracted objects is accumulated into a cumulative moving average of the number of objects extracted per raw image. However, before the cumulative moving average is updated, the number of extracted objects is compared against the previous value of the cumulative moving average (calculated after the previous raw image was processed): if the number of extracted objects is greater than the previous value of the cumulative moving average by more than 20, then the median image will be recalculated for the next raw image. The input for the next median-calculation step will usually be the next 10 consecutive raw images, unless the next raw image is one of the last 10 raw images - in which case the previous ten images will instead be used as the input for the next median-calculation step. Yes, this logic is complicated, and yes, for some reason we don't center the sequence of raw images around the next raw image as our input to the median-calculation step.

"},{"location":"reference/software/functionalities/segmentation/#median-calculation-step","title":"Median-calculation step","text":"

The median-calculation step takes as input a sequence of consecutive raw images, but if the image sequence consists of an even number of images then the last image is excluded from the calculation. The median-calculation step uses the raw images to calculate a median image, in which the color of each pixel of the output is calculated as the median of the colors of the corresponding pixels in the input images.

The output of this step is supposed to be an estimate of what the the \"background\" of the image would be if there were no objects within the field-of-view. However, this step is not robust to sample density: if a sample is dense enough that certain pixel locations overlap with objects in more than half of any consecutive sequence of ten images, the color of the \"background\" in those pixel locations will be estimated as the color of an object in one of those images.

"},{"location":"reference/software/functionalities/segmentation/#image-correction-step","title":"Image-correction step","text":"

The image-correction step takes as input a median image and a raw image. First, the image-correction step divides the color of each pixel of the raw image by the color of the corresponding pixel of the median image; this is probably intended to correct for inhomogeneous illumination in the raw image, and to remove any objects which had been stuck to the flow cell (and thus were included in the median image) from the raw image. Next, the image-correction step slightly rescales the intensity range of the resulting image (TODO: determine what the effect of this intensity-rescaling operation is - does it make the image brighter or dimmer? Does it increase or decrease the contrast? Does it clip the white value? Why is this step performed???). The final result is a median-corrected image.

"},{"location":"reference/software/functionalities/segmentation/#mask-calculation-step","title":"Mask-calculation step","text":"

The mask-calculation step takes as input a median-corrected image and the result from the previous mask-calculation step. It consists of the following operations:

  1. \"Simple threshold\": this operation applies a global threshold to the input corrected image, using the triangle algorithm to calculate an optimal threshold value for the image; the output is a mask in which each pixel is set to 0 if the corresponding pixel of the input image is greater than the threshold, and to 255 otherwise. The resulting mask should select for objects which appear darker than the background of the image.

  2. \"Remove previous mask\": this operation combines the result of the previous mask-calculation step with the mask created by the previous \"simple threshold\" operation, by subtracting the intersection of the two masks from the mask created by the previous \"simple threshold\" operation. This operation is probably intended to remove objects which had been stuck to the PlanktoScope's flowcell during imaging and thus might appear in many consecutive input corrected images. However, this operation is not robust in dense samples where two different objects might appear in overlapping locations across two consecutive raw images.

  3. \"Erode\": this operation erodes the mask with a 2-pixel-by-2-pixel square kernel. In the resulting mask, small regions (such as thresholded noise) are eliminated.

  4. \"Dilate\": this operation dilates the mask with an 8-pixel-diameter circular kernel. In the resulting mask, regions remaining after the previous \"erode\" operation are padded with a margin.

  5. \"Close\": this operation dilates and then erodes the mask with an 8-pixel-diameter circular kernel. In the resulting mask, small holes in regions remaining after the previous \"dilate\" operation are eliminated.

  6. \"Erode2\": this operation erodes the mask with an 8-pixel-diameter circular kernel, inverting the effect of the previous \"dilate\" operation.

The final result these operations is a spatially-filtered segmentation mask where the value of each pixel represents whether that pixel is part of an object or part of the background of the input corrected image.

"},{"location":"reference/software/functionalities/segmentation/#object-extraction-step","title":"Object-extraction step","text":"

The object-extraction step takes the following inputs:

First, the object-extraction step calculates a minimum-area threshold for objects to extract using the input segmentation mask: the threshold (in units of pixel2) is calculated as (2 * acq_minimum_mesh / process_pixel) ^ 2.

Next, the object-extraction step identifies all connected regions of the input segmentation mask and measures properties of those regions. The object-extraction step then discards any region whose bounding-box area (area_bbox in scikit-image) is less than the minimum-area threshold.

"},{"location":"reference/software/functionalities/segmentation/#metadata-calculation","title":"Metadata calculation","text":"

For each resulting region after the minimum-area threshold is applied, that region will be used to extract a segmented and cropped image of the object (including pixels in any holes in the object) from the input median-corrected image. This cropped image is used to calculate some metadata fields about the distribution of colors in the object's segmented image:

Additionally, some metadata for the object is calculated from the region properties calculated by scikit-image for that object's region:

"},{"location":"reference/software/functionalities/segmentation/#output-image-cropping","title":"Output image cropping","text":"

Finally, a segmented and cropped image of the object (including pixels in any holes in the object) is saved from the input median-corrected image, but with the crop expanded by up to 10 pixels in each direction (TODO: check whether this description is accurate - the corresponding code is extremely unreadable).

Thus, the output of the output-extraction step is a set of objects, each with a corresponding cropped image saved to file and with a corresponding list of metadata values.

"},{"location":"reference/software/interfaces/exported-metadata/","title":"Exported Metadata","text":"

TODO

"},{"location":"reference/software/interfaces/mqtt/","title":"Planktoscope MQTT API Reference","text":"

The MQTT API is the primary programming interface for controlling the PlanktoScope. The API is served by the PlanktoScope's Python backend, and data is sent across the API with the following architecture:

flowchart TD\n    API[API Client] -->|Command| Broker[MQTT Broker]\n    Broker -->|Command| Backend[Python Backend]\n    Backend -->|Status Update| Broker[MQTT Broker]\n    Broker -->|Status Update| API

Most messages in the MQTT API are organized according to a request-response pattern in which the API client sends a command as a request to take some action, and then the Python backend sends one or more responses as status updates about how the Python backend's state has changed as a result of the command:

Every MQTT message in the PlanktoScope's MQTT API is published on a specific topic, which is a slash-delimited path of strings (e.g. actuator/pump). Every MQTT message in the PlanktoScope's MQTT API carries a payload, which is a JSON object serialized as a string:

In the rest of this reference document, we organize our description of the MQTT API into sections corresponding to distinct functionalities of the Python backend:

"},{"location":"reference/software/interfaces/mqtt/#pump","title":"Pump","text":"

The Pump API controls the movement of fluid through the PlanktoScope:

"},{"location":"reference/software/interfaces/mqtt/#move-command","title":"move command","text":"

The move command initiates movement of fluid through the PlanktoScope by driving the PlanktoScope pump's stepper motor. For example, this command makes the pump move 10 mL of fluid forwards through the PlanktoScope's fluidic path, at a rate of 1 mL/min:

{\n  \"action\": \"move\",\n  \"direction\": \"FORWARD\",\n  \"volume\": 10,\n  \"flowrate\": 1\n}\n

The move command has the following parameters:

Field Description Type Accepted Values action Specifies the move command. string move direction Direction to run the pump. string FORWARD, BACKWARD volume Total volume of sample to pump before stopping automatically (mL). float 0 < volume flowrate Speed of pumping (mL/min). float 0 < flowrate \u2264 45 mL/min"},{"location":"reference/software/interfaces/mqtt/#move-command-responses","title":"move command responses","text":"

The Python backend can send status updates on the status/pump topic, in response to the move command. The status field of such status updates can have any of the following values:

Status/Error Cause Started The pump has started moving in response to a valid move command. Error, the message is missing an argument One or more required parameters (direction, volume, flowrate) are missing in the move command. Error, The flowrate should not be == 0 An invalid value (0) was provided for the flowrate field. Done The pump has successfully stopped after fully pumping the specified volume of sample.

Note: the MQTT API does not yet completely specify error messages in response to invalid values for the direction, volume, and flowrate parameters.

"},{"location":"reference/software/interfaces/mqtt/#stop-command","title":"stop command","text":"

The stop command interrupts any ongoing movement of fluid through the PlanktoScope and cuts off power to the PlanktoScope pump's stepper motor:

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Field Description Type Accepted Values action Specifies the stop command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses","title":"stop command responses","text":"

The Python backend can send status updates on the status/pump topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error Cause Interrupted The pump has stopped moving in response to a valid stop command, interrupting any ongoing move command.Sent in response to any Pump stop command, and any Imager stop command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/pump topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Cause Ready The backend has become ready to respond to Pump commands. Dead The backend will no longer respond to Pump commands."},{"location":"reference/software/interfaces/mqtt/#focus","title":"Focus","text":"

The Focus API controls the movement of the sample stage focusing motors in the PlanktoScope:

"},{"location":"reference/software/interfaces/mqtt/#move-command_1","title":"move command","text":"

The move command initiates movement of the focusing stage by a specified displacement. For example, this command makes the stage move up by 0.26 mm at a speed of 1 mm/s:

{\n  \"action\": \"move\",\n  \"direction\": \"UP\",\n  \"distance\": 0.26,\n  \"speed\": 1\n}\n

The move command has the following parameters:

Field Description Type Accepted Values action Specifies the move command. string move direction Direction to move the sample stage. string UP, DOWN distance Total distance to move the stage before stopping automatically (in mm). float 0 < distance \u2264 45.0 speed Speed of movement (in mm/s).Defaults to 5. float 0 < speed \u2264 5.0 (optional)"},{"location":"reference/software/interfaces/mqtt/#move-command-responses_1","title":"move command responses","text":"

The Python backend can send status updates on the status/focus topic in response to the move command. The status field of such status updates can have any of the following values:

Status/Error Cause Started The focusing motors have started moving in response to a valid move command. Error The move command is missing the distance and/or direction fields. Done The focusing motors have successfully stopped after moving the specified distance."},{"location":"reference/software/interfaces/mqtt/#stop-command_1","title":"stop command","text":"

The stop command interrupts any ongoing movement of the focusing stage and cuts off power to the focusing motors:

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Field Description Type Accepted Values action Specifies the stop command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_1","title":"stop command responses","text":"

The Python backend can send status updates on the status/focus topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error Cause Interrupted The focusing motors have stopped moving in response to a valid stop command, interrupting any ongoing stop command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_1","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/focus topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Ready The backend has become ready to respond to Focus commands. Dead The backend will no longer respond to Focus commands."},{"location":"reference/software/interfaces/mqtt/#light","title":"Light","text":"

The Light API controls the state of the LED lighting system in the PlanktoScope:

"},{"location":"reference/software/interfaces/mqtt/#on-command","title":"on command","text":"

The on command turns on the sample illumination LED. For example:

{\n  \"action\": \"on\"\n  \"led\": \"1\"\n}\n

The on command has the following parameters:

Field Description Type Accepted Values action Specifies the on command. string on led Specifies the LED to turn on.Defaults to 1. integer 1\u00a0(optional)"},{"location":"reference/software/interfaces/mqtt/#on-command-responses","title":"on command responses","text":"

The Python backend can send status updates on the status/light topic in response to the on command. The status field of such status updates can have any of the following values:

Status/Error Cause Led 1: On The LED turned on successfully. Error with LED number An invalid value was provided for the led field of the command."},{"location":"reference/software/interfaces/mqtt/#off-command","title":"off command","text":"

The off command turns off the sample illumination LED. For example:

{\n  \"action\": \"off\"\n}\n

The off command has the following parameters:

Field Description Type Accepted Values action Specifies the off command. string off led Specifies the LED to turn on.Defaults to 1 integer 1"},{"location":"reference/software/interfaces/mqtt/#off-command-responses","title":"off command responses","text":"

The Python backend can send status updates on the status/light topic in response to the off command. The status field of such status updates can have any of the following values:

Status/Error Cause Led 1: Off The LED turned off successfully. Error with LED number An invalid value was provided for the led field of the command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_2","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/light topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Ready The backend has become ready to respond to Light commands. Dead The backend will no longer respond to Light commands."},{"location":"reference/software/interfaces/mqtt/#imager","title":"Imager","text":"

The Imager API controls image acquisition with the PlanktoScope's hardware, as well as the PlanktoScope's camera:

For details on how images are acquired, refer to our technical reference on sample imaging in the PlanktoScope.

Generally, commands should be sent in the following order:

  1. settings command: Configure the camera settings.
  2. update_config command: Update the dataset metadata for the next image acquisition.
  3. image command: Initiate image acquisition.
  4. stop command: Stop any in-progress image acquisition.
"},{"location":"reference/software/interfaces/mqtt/#settings-command","title":"settings command","text":"

The settings command changes the camera settings. The fields iso, shutter_speed, white_balance_gain and white_balance are optional - if a field is omitted, its setting will not be changed. Here's an example of a command with values specified for all fields:

{\n  \"action\": \"settings\",\n  \"settings\": {\n    \"iso\": 100,\n    \"shutter_speed\": 40,\n    \"white_balance_gain\": { \"red\": 100, \"blue\": 100 },\n    \"white_balance\": \"auto\",\n  }\n}\n

The settings command has the following parameters:

Parameter Description Type Accepted Values action Specifies the settings command. string settings iso Simulated ISO image sensitivity. int 0 < iso \u2264 650 (higher values may be accepted for certain cameras) (optional) shutter_speed Exposure time (in \u03bcs). int 125 \u2264 shutter_speed\u00a0(optional) white_balance_gain.red White balance red gain. float 0.0 \u2264 white_balance_gain.red\u00a0\u2264 32.0 (optional) white_balance_gain.blue White balance blue gain. float 0.0\u00a0\u2264\u00a0white_balance_gain.blue\u00a0\u2264 32.0 (optional) white_balance White balance mode. (off\u00a0specifies the use of manual white balance gains) string auto, off\u00a0(optional)"},{"location":"reference/software/interfaces/mqtt/#settings-command-responses","title":"settings command responses","text":"

The Python backend can send status updates on the status/imager topic in response to the settings command. The status field of such status updates can have any of the following values:

Status/Error Cause Camera settings updated The camera settings have been successfully updated. Camera settings error The settings command is missing required parameters. Iso number not valid The provided iso\u00a0value is not allowed. Shutter speed not valid The provided shutter_speed\u00a0value is not allowed. White balance gain not valid The provided white_balance_gain\u00a0object is not valid or has an invalid value. White balance mode {white_balance} not valid The provided white_balance\u00a0value is not allowed."},{"location":"reference/software/interfaces/mqtt/#update_config-command","title":"update_config command","text":"

The update_config command sets/changes the metadata which will be saved with the dataset which to be acquired by the next image command. For example:

{\n  \"action\": \"update_config\",\n  \"config\": {\n    \"sample_project\": \"fairscope bzh\",\n    \"sample_id\": \"fairscope_bzh_estacade\",\n    \"sample_uuid\": \"uuid-1234\",\n    \"sample_ship\": \"Fairscope\",\n    \"sample_operator\": \"jeremy\",\n    \"sample_sampling_gear\": \"net\",\n    \"sample_concentrated_sample_volume\": 70,\n    \"sample_total_volume\": 100,\n    \"sample_dilution_factor\": 10,\n    \"sample_speed_through_water\": \"5 knots\",\n    \"sample_instrument\": \"PlanktoScope v2.6\",\n    \"sample_bottom_depth\": \"N/A\",\n    \"sample_depth_min\": 0.1,\n    \"sample_depth_max\": 0.5,\n    \"sample_temperature\": \"N/A\",\n    \"sample_salinity\": \"N/A\",\n    \"sample_date\": \"2024-05-15\",\n    \"acq_id\": \"fairscope_bzh_estacade_2\",\n    \"acq_instrument\": \"PlanktoScope v2.6\",\n    \"acq_magnification\": \"1.2\",\n    \"acq_camera_id\": \"deep-point-8125\",\n    \"acq_camera_lens\": \"N/A\",\n    \"acq_software\": \"PlanktoScope v2024.0.0-alpha.1\",\n    \"acq_atlas_id\": \"N/A\",\n    \"acq_resolution\": \"1080p\",\n    \"acq_stacks_count\": \"N/A\",\n    \"acq_time_between_frames\": 0.3,\n    \"acq_brightness\": \"N/A\",\n    \"acq_contrast\": \"N/A\",\n    \"acq_sharpness\": \"N/A\",\n    \"acq_saturation\": \"N/A\",\n    \"acq_gamma\": \"N/A\",\n    \"acq_uuid\": \"acq-uuid-5678\",\n    \"acq_volume\": 2.50,\n    \"acq_imaged_volume\": 1.04,\n    \"acq_minimum_mesh\": 300,\n    \"acq_maximum_mesh\": 300,\n    \"acq_min_esd\": 300,\n    \"acq_max_esd\": 300,\n    \"acq_camera_name\": \"HQ Camera\",\n    \"acq_nb_frame\": 500,\n    \"acq_local_datetime\": \"2024-05-15T09:00:00Z\",\n    \"acq_caamera_iso\": 400,\n    \"acq_camera_shutter_speed\": 500,\n    \"object_date\": \"2024-05-15\",\n    \"object_time\": \"09:00:00Z\",\n    \"object_lat\": 48.7273,\n    \"object_lon\": -3.9814,\n    \"object_depth_min\": 0.1,\n    \"object_depth_max\": 0.5,\n    \"process_pixel\": 0.75,\n    \"process_datetime\": \"2024-05-15T09:00:00Z\",\n    \"process_id\": \"Process01\",\n    \"process_uuid\": \"proc-uuid-7890\",\n    \"process_source\": \"https://www.github.com/PlanktonPlanet/PlanktoScope\",\n    \"process_commit\": \"CommitHash\",\n    \"sample_gear_net_opening\": 300,\n    \"object_date_end\": \"2024-05-15\",\n    \"object_time_end\": \"10:00:00Z\",\n    \"object_lat_end\": 48.7274,\n    \"object_lon_end\": -3.9815\n  }\n}\n

The metadata should contain comprehensive information about the sample, acquisition process, object details, and processing parameters to ensure accurate tracking and reproducibility of the dataset. The update_config command has the following parameters:

Sample information:

Field Description Type sample_project Project name. string sample_id Sample identifier. integer sample_uuid Sample UUID. string sample_ship Ship name. string sample_operator Operator name. string sample_sampling_gear Sampling gear description. string sample_concentrated_sample_volume Concentrated sample volume. float sample_total_volume Total volume. float sample_dilution_factor Dilution factor. float sample_speed_through_water Speed through water. float

Acquisition information:

Field Description Type acq_id Acquisition identifier. integer acq_instrument Acquisition instrument. string acq_magnification Magnification level. string acq_camera_id Camera identifier. integer acq_camera_lens Camera lens. string acq_software Acquisition software. string acq_volume Acquisition volume. float acq_imaged_volume Imaged volume. float acq_minimum_mesh Minimum mesh size. float acq_maximum_mesh Maximum mesh size. float acq_min_esd Minimum equivalent spherical diameter. float acq_max_esd Maximum equivalent spherical diameter. float acq_camera_name Camera name. string acq_nb_frame Number of frames captured. integer acq_local_datetime Local date and time of acquisition. string acq_camera_resolution Camera resolution. string acq_camera_iso Camera ISO setting. float acq_camera_shutter_speed Camera shutter speed. float

Object information:

Field Description Type object_date Date of the object recording. string object_time Time of the object recording. string object_lat Latitude of the sample location. float object_lon Longitude of the sample location. float object_depth_min Minimum depth of the sample location. float object_depth_max Maximum depth of the sample location. float object_date_end End date of the object recording. string object_time_end End time of the object recording. string object_lat_end End latitude of the sample location. float object_lon_end End longitude of the sample location. float

Processing information:

Field Description Type process_pixel Pixel processing method. string process_datetime Date and time of processing. string process_id Processing identifier. integer process_uuid Processing UUID. string process_source Source of processing software or method. string process_commit Commit hash of the software used. string"},{"location":"reference/software/interfaces/mqtt/#update_config-command-responses","title":"update_config command responses","text":"

The Python backend can send status updates on the status/imager topic in response to the update_config command. The status field of such status updates can have any of the following values:

Status/Error Description Config updated The metadata has been successfully updated. Configuration message error The command is missing the required\u00a0config field. Busy Image acquisition is already in progress, so dataset metadata cannot be changed."},{"location":"reference/software/interfaces/mqtt/#image-command","title":"image command","text":"

The image command initiates acquisition of one raw image dataset consisting of a specified number of images, via stop-flow imaging. For example, this command initiates acquisition of 200 images, with 1 mL of sample pumped between each image and an image stabilization period of 0.1 seconds between the end of pumping and the triggering of the image capture for each acquired image:

{\n  \"action\": \"image\",\n  \"pump_direction\": \"FORWARD\",\n  \"volume\": 1,\n  \"nb_frame\": 200,\n  \"sleep\": 0.1\n}\n

A valid update_config command with a unique (object_date, sample_id, acq_id) combination must be sent some time before each image command. If an update_config command has not been sent before the image command, the image command will trigger a \u201cStarted\u201d response status and then do nothing (this is a software bug which needs to be fixed so that an error status is reported instead).

The image command has the following parameters:

Parameter Description Type Accepted Values pump_direction Direction of sample pumping. string FORWARD, BACKWARD. volume Volume (in mL) of sample to pump between each captured image. float 0 < volume nb_frame Number of frames to capture. integer 0 < nb_frame sleep Duration (in s) to wait after pumping has stopped before saving an image, to allow the sample objects to stabilize in the image. float 0 < sleep"},{"location":"reference/software/interfaces/mqtt/#image-command-responses","title":"image command responses","text":"

The Python backend can send status updates on the status/imager topic, in response to the image command. The status field of such status updates can have any of the following values:

Status/Error Description Started The image capture process has started successfully. Error At least one field of the\u00a0image\u00a0command is missing or has an invalid value. Error: missing camera No camera is available to use for image acquisition. Configuration update error: object_date is missing! The last time the update_config\u00a0command was sent, it did not have an object_date\u00a0parameter. Configuration update error: Chosen id are already in use! The\u00a0(object_date, sample_id, acq_id)\u00a0combination for the dataset (set by the last update_config\u00a0command) is already used by a previous dataset. Image {index}/{nb_frame} saved to {filename} An image has been successfully captured and saved. Image {index}/{nb_frame} WAS NOT CAPTURED! STOPPING THE PROCESS! An error occurred during image capture; the ongoing image acquisition has finished with failure, resulting in an incomplete dataset. Done The image acquisition finished successfully, resulting in a complete dataset."},{"location":"reference/software/interfaces/mqtt/#stop-command_2","title":"stop command","text":"

This message interrupts any in-progress image acquisition routine and stops any ongoing sample pumping.

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Field Description Type Accepted Values action Specifies the stop\u00a0command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_2","title":"stop command responses","text":"

The Python backend can send status updates on the status/imager topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error message Description Interrupted The image capture process was stopped successfully."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_3","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/imager topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Starting up The backend will soon attempt to initialize the camera. Error: missing camera A camera was not detected. Ready The camera is now operational, and the backend has become ready to respond to Imager commands. Dead The backend will no longer respond to Imager commands."},{"location":"reference/software/interfaces/mqtt/#segmenter","title":"Segmenter","text":"

The Segmenter API controls the processing of acquired images:

For details on how images are processed, refer to our technical reference on image segmentation in the PlanktoScope.

"},{"location":"reference/software/interfaces/mqtt/#segment-command","title":"segment command","text":"

The segment command initiates processing of images stored in the specified path, optionally exporting the results to an EcoTaxa-compatible archive. The various settings parameters of this command provide control over the behavior of image processing. For example, this command initiates processing of all images in the /path/to/segment directory:

{\n  \"action\": \"segment\",\n  \"path\": \"/path/to/segment\",\n  \"settings\": {\n    \"force\": false,\n    \"recursive\": true,\n    \"ecotaxa\": true,\n    \"keep\": true\n  }\n}\n

The segment command has the following parameters:

Parameter Description Type Accepted Values path Path to the directory of images to process.Defaults to /home/pi/data/img. file path (string) any subdirectory of\u00a0/home/pi/data/img (optional) settings.force Force re-segmentation of already-processed directories, ignoring the existence of\u00a0done\u00a0files which otherwise prevent already-segmented directories from being processed again.Defaults to false. boolean true, false (optional) settings.recursive Process datasets in all subdirectories of\u00a0path.Defaults to true. boolean true, false (optional) settings.ecotaxa Export an EcoTaxa-compatible archive.Defaults to true. boolean true, false (optional) settings.keep Keep ROI files generated when exporting an EcoTaxa-compatible archive. It has no effect if settings.ecotaxa\u00a0is false.Defaults to true. boolean true, false (optional)"},{"location":"reference/software/interfaces/mqtt/#segment-command-responses","title":"segment command responses","text":"

The Python backend can send status updates on the status/segmenter topic, in response to the segment command. The status field of such status updates can have any of the following values:

Status/Error message Description Started The segmentation process has begun. Busy The segmenter is currently running and cannot update configurations. Calculating flat The frame background is being calculated. Segmenting image %s, image %d/%d Segmentation of a specific image is in progress. An exception was raised during the segmentation: %s. An error occurred during segmentation. Done Processing has finished for the specified datasets.

As the Python backend performs segmentation, it will repeatedly send additional status updates on the status/segmenter/object_id topic, once for each object isolated by the segmenter. Each status update is a JSON object with the following fields:

Field Description Type object_id A scikit-image region label. integer

As the Python backend performs segmentation, it will repeatedly send additional status updates on the status/segmenter/metric topic, once for each object isolated by the segmenter. Each status update is a JSON object with the following fields:

Field Description Type name An object ID, which is a undersctore-delimited concatenation of the name of the raw image which was processed and the object ID reported by status/segmenter/object_id. string metadata Metadata for the object. struct

The metadata field of status updates sent on the status/segmenter/metric topic is an object with the following fields:

Field Description Type label Label of the object. integer width Width of the smallest rectangle enclosing the object. integer height Height of the smallest rectangle enclosing the object. integer bx X coordinate of the top left point of the smallest rectangle enclosing the object. integer by Y coordinate of the top left point of the smallest rectangle enclosing the object. integer circ Circularity: (4 \u2217 \u03c0 \u2217 Area) / Perimeter^2. A value of 1 indicates a perfect circle, approaching 0 indicates an elongated polygon. float area_exc Surface area of the object excluding holes, in square pixels. integer area Surface area of the object in square pixels. integer %area Percentage of object\u2019s surface area that is comprised of holes. float major Primary axis of the best fitting ellipse for the object. float minor Secondary axis of the best fitting ellipse for the object. float y Y position of the center of gravity of the object. float x X position of the center of gravity of the object. float convex_area The area of the smallest polygon within which all points in the object fit. integer perim The length of the outside boundary of the object. float elongation The result of dividing the major parameter by the minor parameter. float perimareaexc The result of dividing the perim parameter by the area_exc parameter. float perimmajor The result of dividing the perim parameter by the major parameter. float circex (4 \u2217 \u03c0 \u2217 area_exc) / perim^2. float angle Angle between the primary axis and a line parallel to the x-axis of the image. float bounding_box_area Area of the bounding box enclosing the object. integer eccentricity Eccentricity of the object. float equivalent_diameter Diameter of a circle with the same area as the object. float euler_number Euler number of the object. integer extent Ratio of object area to bounding box area. float local_centroid_col Column position of the local centroid. float local_centroid_row Row position of the local centroid. float solidity Ratio of object area to convex area. float MeanHue Mean hue value of the object. float MeanSaturation Mean saturation value of the object. float MeanValue Mean value (brightness) of the object. float StdHue Standard deviation of the hue value of the object. float StdSaturation Standard deviation of the saturation value of the object. float StdValue Standard deviation of the value (brightness) of the object. float"},{"location":"reference/software/interfaces/mqtt/#stop-command_3","title":"stop command","text":"

The stop command interrupts any ongoing image processing. For example:

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Parameter Type Accepted Values Description action string \"stop\" Specifies the action to stop segmentation.

Warning

The functionality for this command has not yet been implemented. Currently an Interrupted status is sent as a response on the segmenter/segment topic even though no interruption will actual happen.

"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_3","title":"stop command responses","text":"

The Python backend can send status updates on the segmenter/segment topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error message Description Interrupted The segmentation process was interrupted."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_4","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/segmenter topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Ready The backend has become ready to respond to Segmenter commands. Dead The backend will no longer respond to Segmenter commands."},{"location":"reference/software/subsystems/installation/","title":"Installation","text":"

This document explains how the PlanktoScope OS's installation process works, as a companion to our non-standard installation guide which carries out the process explained below.

The installation process is initiated by booting into an appropriate installation of the Raspberry Pi OS and then downloading and running the installation bootstrap script, which in turn downloads and runs the appropriate distro setup scripts according to the installation parameters provided to the installation bootstrap script.

"},{"location":"reference/software/subsystems/installation/#installation-bootstrap-script","title":"Installation bootstrap script","text":"

The installation bootstrap script is provided so that a one-line command can be executed to automatically perform the entire process of installing the PlanktoScope OS on top of the Raspberry Pi OS. The GitHub repository which contains that script always publishes the latest version on its stable branch to install.planktoscope.community/distro.sh via GitHub Pages; other versions can be downloaded from GitHub via the corresponding permalinks for those versions of the file (e.g. https://github.com/PlanktoScope/install.planktoscope.community/raw/v2023.9.0/distro.sh for the version from the v2023.9.0 tag in the repository). The installation bootstrap script performs the following steps:

  1. The script loads some parameters (set by environment variables and/or corresponding command-line arguments) which set the behavior of the script.

  2. The script installs git, if it was not already installed (as is the case on the \"Lite\" image of the Raspberry Pi OS); if the yes parameter was not set and git was not already installed, the script will first ask the user to confirm that they wish to install git before the script continues. git is required to resolve version query parameters provided to the script, so that the script can determine how to download the requested version of the PlanktoScope OS's distro setup scripts.

  3. The script clones a minimal \"mirror\" copy of the specified repository (set by the repo parameter) of distro setup scripts to a temporary directory (i.e. a directory created in /tmp). This \"mirror\" copy is used to:

  4. The script clones a copy of the specified repository (set by the repo parameter) to a temporary directory and checks out the specific commit which was resolved by the previous step; if the yes parameter was not set, the script will first ask the user to confirm that they wish to download the resolved commit of the distro setup scripts before the script continues. Because the repository containing the distro setup scripts may have many large files (e.g. image files for documentation) which are unrelated to the distro setup scripts, this step only downloads files in the specific commit needed for the distro setup scripts.

  5. The script records versioning information for the downloaded installation scripts, saving that information in two YAML files in a particular directory; if that directory already exists and the yes parameter was not set, the script will first ask the user to confirm that they wish to delete and re-create that directory before the script continues. Installed programs can read these files in order to determine the installed version of the PlanktoScope OS.

  6. The script runs the specified script (set by the setup-entrypoint parameter) within the downloaded copy of the specified repository; if the yes parameter was not set, the script will first ask the user to confirm that they wish to run the downloaded distro scripts before the script continues.

"},{"location":"reference/software/subsystems/installation/#script-parameters","title":"Script parameters","text":"Command-Line Flags Environment Variable Name Description -r--repo REPO URL of the Git repository used for downloading the distro setup scripts. If a protocol is not specified, the URL will be assumed to use HTTPS.Default value:\u00a0github.com/PlanktoScope/PlanktoScope -v--version-query VERSION_QUERY The version of the repository to download. The version query is interpreted differently depending on the query type set by the\u00a0query-type\u00a0parameter:Default value: software/stable -t--query-type QUERY_TYPE The type of version query set by the version-query\u00a0parameter.Allowed values: branch, tag, hash.Default value: branch -H--hardware HARDWARE The hardware configuration, passed as the first argument to the entrypoint of the distro setup scripts. The distro setup scripts in the\u00a0github.com/PlanktoScope/PlanktoScope\u00a0repo currently expect either none, segmenter-only,\u00a0adafruithat,\u00a0planktoscopehat, or fairscope-latest.Default value: planktoscopehat --tag-prefix TAG_PREFIX The prefix for Git version tags when resolving the version query (with query type\u00a0tag) and when resolving tags (for pseudoversion strings).\u00a0Default value: software/ --setup-entrypoint SETUP_ENTRYPOINT The entrypoint of the distro setup scripts, which will be executed in order to run the downloaded distro setup scripts. This should be a subdirectory path within the repository (set by the repo\u00a0parameter) which will be downloaded at the specified commit (set by the version-query\u00a0and query-type\u00a0parameters and - when query-type\u00a0is tag\u00a0- by the tag-prefix\u00a0parameter) to obtain the distro setup scripts.Default value: software/distro/setup/setup.sh -y-f--yes--force FORCE Whether to automatically confirm all user confirmation prompts:Default: User input required -V--verbose VERBOSE Whether to display additional (verbose) output:Default: Don't display verbose output -h--help Whether to display a help message (which includes this parameter reference table and a list of example commands using this script) and quit without doing any work.

Example combinations of command-line arguments using the above parameters:

"},{"location":"reference/software/subsystems/installation/#recorded-versioning-information","title":"Recorded versioning information","text":"

Currently the installer script creates two YAML files, both in the /usr/share/planktoscope directory.

/usr/share/planktoscope/installer-config.yml records the values of the parameters with which the installer script was invoked:

YAML Field Name Corresponding Script Parameter Example Value repo repo \"github.com/PlanktoScope/PlanktoScope\" version-query version-query \"v2024.0.0-alpha.1\" query-type query-type \"tag\" hardware hardware \"adafruithat\" tag-prefix tag-prefix \"software/\" setup-entrypoint setup-entrypoint \"software/distro/setup/setup.sh\"

/usr/share/planktoscope/installer-versioning.yml records information about the version of the PlanktoScope OS's distro setup scripts which was used to install the PlanktoScope OS:

Field Name Description repo The path of the Git repository which provided the distro setup scripts, with any leading protocol string (e.g. https://) removed.Example Values:
  1. \"github.com/PlanktoScope/PlanktoScope\"
  2. \"github.com/PlanktoScope/PlanktoScope\"
commit The full hash of the exact commit which provided the distro setup scripts.Example Values:
  1. \"2d6928e596b28f0c4c268fecb588c85215b1027e\"\u00a0(for commit 2d6928e)
  2. \"4d8b882616a8374918730bc1c6d300edfd7a523a\"\u00a0(for commit 4d8b882)
tag The full name of the Git tag (whose name starts with the prefix set by the tag-prefix\u00a0script parameter) at the exact commit which provided the distro setup scripts, if such a tag exists; otherwise, the empty string (\"\").Example Values:
  1. \"software/v2024.0.0-alpha.1\"\u00a0(so commit 2d6928e\u00a0has Git tag software/v2024.0.0-alpha.1)
  2. \"\"\u00a0(so commit 4d8b882\u00a0has no Git tag)
version A version string or pseudo-version string describing the exact commit which provided the distro setup scripts. If a Git tag (with a name starting with the prefix set by the tag-prefix\u00a0script parameter) exists at that commit, this is a version string which just the name of that tag, but with the tag-prefix\u00a0stripped from the name. Otherwise, this is a pseudo-version string with format \"{tag}-{distance}-g{commit}\", where: