Yes, you can do that. I did it in my plugin. Here is a function:
// Open panel by id
const showPluginPanel = function(id) {
const uxp = require("uxp");
const plugins = Array.from(uxp.pluginManager.plugins);
const plugin = plugins.find(
(plugin) => plugin.id === uxp.entrypoints._pluginInfo.id
);
console.log(`Opening panel: '${id}'`);
if (plugin) { plugin.showPanel(id); }
else console.error(`Plugin '${id}' found`);
};
Then, in your main JS logic (e.g., in index.js), you can open the panel like this:
showPluginPanel("main_panel");
Instead of “main_panel”, use the ID of the entrypoint you defined in your manifest.json
.
It seems you need the permission enablePluginCommunication
for this to work. This is a bit odd because this permission is intended for communication with other plugins, not with your own plugin. However, when I tested it a few months ago, it didn’t work without this permission. Could have been a bug, though.
In your manifest.json, add the following section:
"requiredPermissions": {
"ipc": {
"enablePluginCommunication": true
}
}
You can find the documentation for this property in the plugin manifest section of the docs:
Hope this helps! 
I often had troubles with odd permission requirements. E.g. the <sp-link>
tag needs launchProcess
→ schemes
permission, although it is a default uxp widget, and this is not noted in the corresponding doc-sections. So if something doesn’t work, check if there could be a permission required. You won’t get any warning in the console, that you’re missing a permission.
Note: This allows you to open a panel at any moment. If you call this function in your main logic, it will open as soon as the plugin loads (for an installed plugin this means right when InDesign starts). But this could be annoying for your users. Especially, as InDesign currently doesn’t save the docked position of plugin panels, or so it seams. Nevertheless, in my plugin this prevented the blank panel bug, so this was the lesser evil.